run-perf_tests.py: Adding a function to generate SHA1 signature for drivers
This commit is contained in:
parent
38d01dcade
commit
40d87aa38f
|
@ -12,7 +12,9 @@ import pyodbc
|
||||||
import platform
|
import platform
|
||||||
import re
|
import re
|
||||||
import datetime
|
import datetime
|
||||||
|
import time
|
||||||
from time import strftime
|
from time import strftime
|
||||||
|
import hashlib
|
||||||
|
|
||||||
sqlsrv_regular_path = "benchmark"+ os.sep + "sqlsrv" + os.sep + "regular"
|
sqlsrv_regular_path = "benchmark"+ os.sep + "sqlsrv" + os.sep + "regular"
|
||||||
sqlsrv_large_path = "benchmark"+ os.sep + "sqlsrv" + os.sep + "large"
|
sqlsrv_large_path = "benchmark"+ os.sep + "sqlsrv" + os.sep + "large"
|
||||||
|
@ -20,6 +22,7 @@ pdo_regular_path = "benchmark"+ os.sep + "pdo_sqlsrv" + os.sep + "regular"
|
||||||
pdo_large_path = "benchmark"+ os.sep + "pdo_sqlsrv" + os.sep + "large"
|
pdo_large_path = "benchmark"+ os.sep + "pdo_sqlsrv" + os.sep + "large"
|
||||||
connect_file = "lib" + os.sep + "connect.php"
|
connect_file = "lib" + os.sep + "connect.php"
|
||||||
connect_file_bak = connect_file + ".bak"
|
connect_file_bak = connect_file + ".bak"
|
||||||
|
fmt = "%Y-%m-%d %H:%M:%S.0000000"
|
||||||
|
|
||||||
def validate_platform( platform_name ):
|
def validate_platform( platform_name ):
|
||||||
platforms = [
|
platforms = [
|
||||||
|
@ -83,10 +86,20 @@ def get_run_command( path_to_tests, iterations, dump_file ):
|
||||||
command = "vendor/bin/phpbench run {0} --iterations {1} --dump-file={2}"
|
command = "vendor/bin/phpbench run {0} --iterations {1} --dump-file={2}"
|
||||||
return command.format( path_to_tests, iterations, dump_file )
|
return command.format( path_to_tests, iterations, dump_file )
|
||||||
|
|
||||||
def get_id( conn, id_field, table, name_field, name):
|
def get_id( conn, id_field, table, name_field, value ):
|
||||||
query = "SELECT {0} FROM {1} WHERE {2}='{3}'"
|
query = "SELECT {0} FROM {1} WHERE {2}='{3}'"
|
||||||
cursor = conn.cursor()
|
cursor = conn.cursor()
|
||||||
cursor.execute( query.format( id_field, table, name_field, name ))
|
cursor.execute( query.format( id_field, table, name_field, value ))
|
||||||
|
id = cursor.fetchone()
|
||||||
|
cursor.close()
|
||||||
|
if id is not None:
|
||||||
|
return id[0]
|
||||||
|
return id
|
||||||
|
|
||||||
|
def get_id_no_quote( conn, id_field, table, name_field, value ):
|
||||||
|
query = "SELECT {0} FROM {1} WHERE {2}={3}"
|
||||||
|
cursor = conn.cursor()
|
||||||
|
cursor.execute( query.format( id_field, table, name_field, value ))
|
||||||
id = cursor.fetchone()
|
id = cursor.fetchone()
|
||||||
cursor.close()
|
cursor.close()
|
||||||
if id is not None:
|
if id is not None:
|
||||||
|
@ -123,6 +136,17 @@ def get_server_version( server):
|
||||||
cursor.close()
|
cursor.close()
|
||||||
return version
|
return version
|
||||||
|
|
||||||
|
def get_sha1_file( filename ):
|
||||||
|
hash_size = 256
|
||||||
|
sha1 = hashlib.sha1()
|
||||||
|
with open( filename, 'rb' ) as f:
|
||||||
|
while True:
|
||||||
|
data = f.read( hash_size )
|
||||||
|
if not data:
|
||||||
|
break
|
||||||
|
sha1.update( data )
|
||||||
|
return "0x" + sha1.hexdigest()
|
||||||
|
|
||||||
def insert_server_entry( conn, server_name, server_version ):
|
def insert_server_entry( conn, server_name, server_version ):
|
||||||
query = "INSERT INTO Servers ( HostName, Version ) VALUES ( '{0}', '{1}' )"
|
query = "INSERT INTO Servers ( HostName, Version ) VALUES ( '{0}', '{1}' )"
|
||||||
cursor = conn.cursor()
|
cursor = conn.cursor()
|
||||||
|
@ -148,6 +172,13 @@ def insert_test_entry( conn, name ):
|
||||||
cursor.execute( query.format( name ))
|
cursor.execute( query.format( name ))
|
||||||
cursor.close()
|
cursor.close()
|
||||||
|
|
||||||
|
def insert_driver_entry( conn, driver_path, driver_hash ):
|
||||||
|
file_date = time.strftime( fmt, time.gmtime( os.path.getmtime( driver_path )))
|
||||||
|
query = "INSERT INTO Drivers ( Arch, FileDate, SHA1, HashVer ) VALUES ( ?, ?, {0}, 1 )"
|
||||||
|
cursor = conn.cursor()
|
||||||
|
cursor.execute( query.format(driver_hash), ( get_php_arch(), file_date ))
|
||||||
|
cursor.close()
|
||||||
|
|
||||||
def get_server_id( conn, test_db ):
|
def get_server_id( conn, test_db ):
|
||||||
server_id = get_id( conn, "ServerId", "Servers", "HostName", test_db.server_name )
|
server_id = get_id( conn, "ServerId", "Servers", "HostName", test_db.server_name )
|
||||||
if server_id is None:
|
if server_id is None:
|
||||||
|
@ -178,6 +209,15 @@ def get_test_id( conn, test_name ):
|
||||||
test_id = get_id( conn, "TestId", "PerformanceTests", "TestName", test_name )
|
test_id = get_id( conn, "TestId", "PerformanceTests", "TestName", test_name )
|
||||||
return test_id
|
return test_id
|
||||||
|
|
||||||
|
def get_driver_id( conn, driver_name ):
|
||||||
|
driver_path = get_path_to_driver( driver_name )
|
||||||
|
driver_hash = get_sha1_file( driver_path )
|
||||||
|
driver_id = get_id_no_quote( conn, "DriverId", "Drivers", "SHA1", driver_hash )
|
||||||
|
if driver_id is None:
|
||||||
|
insert_driver_entry( conn, driver_path, driver_hash )
|
||||||
|
driver_id = get_id_no_quote( conn, "DriverId", "Drivers", "SHA1", driver_hash )
|
||||||
|
return driver_id
|
||||||
|
|
||||||
def insert_result_entry_and_get_id( conn, test_id, client_id, driver_id, server_id, team_id, success ):
|
def insert_result_entry_and_get_id( conn, test_id, client_id, driver_id, server_id, team_id, success ):
|
||||||
query = "INSERT INTO PerformanceResults( TestId, ClientId, DriverId, ServerId, TeamId, Success ) OUTPUT INSERTED.ResultId VALUES( {0}, {1}, {2}, {3}, {4}, {5} )"
|
query = "INSERT INTO PerformanceResults( TestId, ClientId, DriverId, ServerId, TeamId, Success ) OUTPUT INSERTED.ResultId VALUES( {0}, {1}, {2}, {3}, {4}, {5} )"
|
||||||
cursor = conn.cursor()
|
cursor = conn.cursor()
|
||||||
|
@ -214,6 +254,15 @@ def get_php_thread():
|
||||||
else:
|
else:
|
||||||
return "ts"
|
return "ts"
|
||||||
|
|
||||||
|
def get_path_to_driver( driver_name ):
|
||||||
|
p = subprocess.Popen( "php -r \"echo ini_get('extension_dir');\"", stdout=subprocess.PIPE, shell = True )
|
||||||
|
out, err = p.communicate()
|
||||||
|
extension_dir = out.decode('ascii')
|
||||||
|
if os.name == 'nt':
|
||||||
|
return extension_dir + os.sep + "php_" + driver_name + ".dll"
|
||||||
|
else:
|
||||||
|
return extension_dir + os.sep + driver_name + ".so"
|
||||||
|
|
||||||
def enable_mars():
|
def enable_mars():
|
||||||
print( "Enabling MARS...")
|
print( "Enabling MARS...")
|
||||||
with fileinput.FileInput( connect_file, inplace=True, backup='.bak') as file:
|
with fileinput.FileInput( connect_file, inplace=True, backup='.bak') as file:
|
||||||
|
@ -290,22 +339,22 @@ def parse_results( dump_file ):
|
||||||
return xml_results
|
return xml_results
|
||||||
|
|
||||||
def parse_and_store_results( dump_file, test_db, result_db, platform, driver, start_time, mars, pooling ):
|
def parse_and_store_results( dump_file, test_db, result_db, platform, driver, start_time, mars, pooling ):
|
||||||
|
|
||||||
conn = connect( result_db )
|
conn = connect( result_db )
|
||||||
|
|
||||||
server_id = get_server_id( conn, test_db )
|
server_id = get_server_id( conn, test_db )
|
||||||
client_id = get_client_id( conn )
|
client_id = get_client_id( conn )
|
||||||
team_id = get_team_id( conn )
|
team_id = get_team_id( conn )
|
||||||
# TO - DO Add a function to insert a driver entry
|
driver_id = get_driver_id( conn, driver )
|
||||||
driver_id=1
|
|
||||||
|
|
||||||
arch = get_php_arch()
|
arch = get_php_arch()
|
||||||
thread = get_php_thread()
|
thread = get_php_thread()
|
||||||
cursor = conn.cursor()
|
cursor = conn.cursor()
|
||||||
results = parse_results( dump_file )
|
results = parse_results( dump_file )
|
||||||
|
|
||||||
for result in results:
|
for result in results:
|
||||||
test_name = get_test_name( result.benchmark_name )
|
test_name = get_test_name( result.benchmark_name )
|
||||||
test_id = get_test_id( conn, test_name )
|
test_id = get_test_id( conn, test_name )
|
||||||
result_id = insert_result_entry_and_get_id( conn, test_id, client_id, driver_id, server_id, team_id, result.success )
|
result_id = insert_result_entry_and_get_id( conn, test_id, client_id, driver_id, server_id, team_id, result.success )
|
||||||
|
|
||||||
if result.success:
|
if result.success:
|
||||||
|
@ -340,19 +389,20 @@ if __name__ == '__main__':
|
||||||
parser.add_argument( '-result-pwd', '--RESULT_PWD', required=True )
|
parser.add_argument( '-result-pwd', '--RESULT_PWD', required=True )
|
||||||
args = parser.parse_args()
|
args = parser.parse_args()
|
||||||
|
|
||||||
|
start_time = datetime.datetime.now().strftime( fmt )
|
||||||
|
print( "Start time: " + start_time )
|
||||||
|
|
||||||
validate_platform( args.PLATFORM )
|
validate_platform( args.PLATFORM )
|
||||||
result_db = DB( args.RESULT_SERVER, args.RESULT_DB, args.RESULT_UID, args.RESULT_PWD )
|
result_db = DB( args.RESULT_SERVER, args.RESULT_DB, args.RESULT_UID, args.RESULT_PWD )
|
||||||
test_db = get_test_database()
|
test_db = get_test_database()
|
||||||
fmt = "%Y-%m-%d %H:%M:%S.0000000"
|
|
||||||
|
|
||||||
print("Running the tests with default settings...")
|
print("Running the tests with default settings...")
|
||||||
start_time = datetime.datetime.now().strftime( fmt )
|
|
||||||
run_tests( args.ITERATIONS, args.ITERATIONS_LARGE )
|
run_tests( args.ITERATIONS, args.ITERATIONS_LARGE )
|
||||||
parse_and_store_results_all( test_db, result_db, args.PLATFORM, start_time, 0, 0 )
|
parse_and_store_results_all( test_db, result_db, args.PLATFORM, start_time, 0, 0 )
|
||||||
|
|
||||||
print("Running the tests with MARS ON...")
|
print("Running the tests with MARS ON...")
|
||||||
enable_mars()
|
enable_mars()
|
||||||
start_time = datetime.datetime.now().strftime( fmt )
|
|
||||||
run_tests( args.ITERATIONS, args.ITERATIONS_LARGE )
|
run_tests( args.ITERATIONS, args.ITERATIONS_LARGE )
|
||||||
parse_and_store_results_all( test_db, result_db, args.PLATFORM, start_time, 1, 0 )
|
parse_and_store_results_all( test_db, result_db, args.PLATFORM, start_time, 1, 0 )
|
||||||
disable_mars()
|
disable_mars()
|
||||||
|
@ -360,9 +410,7 @@ if __name__ == '__main__':
|
||||||
|
|
||||||
print("Running the tests with Pooling ON...")
|
print("Running the tests with Pooling ON...")
|
||||||
enable_pooling()
|
enable_pooling()
|
||||||
start_time = datetime.datetime.now().strftime( fmt )
|
|
||||||
run_tests( args.ITERATIONS, args.ITERATIONS_LARGE )
|
run_tests( args.ITERATIONS, args.ITERATIONS_LARGE )
|
||||||
parse_and_store_results_all( test_db, result_db, args.PLATFORM, start_time, 0, 1 )
|
parse_and_store_results_all( test_db, result_db, args.PLATFORM, start_time, 0, 1 )
|
||||||
disable_pooling()
|
disable_pooling()
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue