From 732535aec1ac91cfc1e13524d12f7b05725a7207 Mon Sep 17 00:00:00 2001 From: Erica Vellanoweth Date: Mon, 8 Dec 2025 13:53:19 -0800 Subject: [PATCH 1/2] changes to implement mysql hammerdb tpch & tpcc, then postgresql hammerdb tpch. --- .../Examples/HammerDB/HammerDBMySQL.txt | 93 ++ .../Examples/HammerDB/HammerDBMySQLTPCH.txt | 808 ++++++++++++++++++ .../HammerDB/HammerDBMetricsParserTests.cs | 71 +- .../HammerDB/HammerDBClientExecutor.cs | 42 +- .../HammerDB/HammerDBExecutor.cs | 63 +- .../HammerDB/HammerDBMetricsParser.cs | 275 +++++- .../MySqlServer/MySqlServerConfiguration.cs | 20 +- .../profiles/PERF-MYSQL-HAMMERDB-TPCC.json | 171 ++++ .../profiles/PERF-MYSQL-HAMMERDB-TPCH.json | 171 ++++ .../PERF-POSTGRESQL-HAMMERDB-TPCC.json | 9 +- .../PERF-POSTGRESQL-HAMMERDB-TPCH.json | 162 ++++ 11 files changed, 1801 insertions(+), 84 deletions(-) create mode 100644 src/VirtualClient/VirtualClient.Actions.UnitTests/Examples/HammerDB/HammerDBMySQL.txt create mode 100644 src/VirtualClient/VirtualClient.Actions.UnitTests/Examples/HammerDB/HammerDBMySQLTPCH.txt create mode 100644 src/VirtualClient/VirtualClient.Main/profiles/PERF-MYSQL-HAMMERDB-TPCC.json create mode 100644 src/VirtualClient/VirtualClient.Main/profiles/PERF-MYSQL-HAMMERDB-TPCH.json create mode 100644 src/VirtualClient/VirtualClient.Main/profiles/PERF-POSTGRESQL-HAMMERDB-TPCH.json diff --git a/src/VirtualClient/VirtualClient.Actions.UnitTests/Examples/HammerDB/HammerDBMySQL.txt b/src/VirtualClient/VirtualClient.Actions.UnitTests/Examples/HammerDB/HammerDBMySQL.txt new file mode 100644 index 0000000000..ad0f26a6bb --- /dev/null +++ b/src/VirtualClient/VirtualClient.Actions.UnitTests/Examples/HammerDB/HammerDBMySQL.txt @@ -0,0 +1,93 @@ +HammerDB CLI v4.12 +Copyright (C) 2003-2024 Steve Shaw +Type "help" for a list of commands +Initialized Jobs on-disk database /tmp/hammer.DB using existing tables (94,208 bytes) +SETTING CONFIGURATION +Database set to MySQL +Benchmark set to TPC-C for MySQL +Value 127.0.0.1 for connection:mysql_host is the same as existing value 127.0.0.1, no change made +Value 3306 for connection:mysql_port is the same as existing value 3306, no change made +Value /var/run/mysqld/mysqld.sock for connection:mysql_socket is the same as existing value /var/run/mysqld/mysqld.sock, no change made +Value root for tpcc:mysql_user is the same as existing value root, no change made +Value hammerdb_tpcc for tpcc:mysql_dbase is the same as existing value hammerdb_tpcc, no change made +Value timed for tpcc:mysql_driver is the same as existing value timed, no change made +Value 2 for tpcc:mysql_rampup is the same as existing value 2, no change made +Value 5 for tpcc:mysql_duration is the same as existing value 5, no change made +Value true for tpcc:mysql_allwarehouse is the same as existing value true, no change made +Value true for tpcc:mysql_timeprofile is the same as existing value true, no change made +Dictionary Settings for MySQL +connection { + mysql_host = 127.0.0.1 + mysql_port = 3306 + mysql_socket = /var/run/mysqld/mysqld.sock + mysql_ssl = false + mysql_ssl_two_way = false + mysql_ssl_linux_capath = /etc/mysql/certs + mysql_ssl_windows_capath = C:\mysql\certs + mysql_ssl_ca = ca-cert.pem + mysql_ssl_cert = client-cert.pem + mysql_ssl_key = client-key.pem + mysql_ssl_cipher = server + mysql_oceanbase_port = 2881 +} +tpcc { + mysql_count_ware = 1 + mysql_num_vu = 1 + mysql_user = root + mysql_pass = mysql + mysql_dbase = hammerdb_tpcc + mysql_storage_engine = innodb + mysql_partition = false + mysql_prepared = false + mysql_history_pk = false + mysql_no_stored_procs = false + mysql_total_iterations = 10000000 + mysql_raiseerror = false + mysql_keyandthink = false + mysql_driver = timed + mysql_rampup = 2 + mysql_duration = 5 + mysql_allwarehouse = true + mysql_timeprofile = true + mysql_async_scale = false + mysql_async_client = 10 + mysql_async_verbose = false + mysql_async_delay = 1000 + mysql_connect_pool = false +} +Script loaded, Type "print script" to view +SEQUENCE STARTED +1 VU TEST +Vuser 1 created MONITOR - WAIT IDLE +Vuser 2 created - WAIT IDLE +2 Virtual Users Created with Monitor VU +Vuser 1:RUNNING +Vuser 1:Initializing xtprof time profiler +Vuser 1:Ssl_cipher +Vuser 1:DBVersion:8.0.44 +Vuser 1:Beginning rampup time of 2 minutes +Vuser 2:RUNNING +Vuser 2:Initializing xtprof time profiler +Vuser 2:Ssl_cipher +Vuser 2:Assigned 1 WIDs = 1 based on VU count 1, Warehouses = 1 out of 1 +Vuser 2:Processing 10000000 transactions with output suppressed... +Vuser 1:Rampup 1 minutes complete ... +Vuser 1:Rampup 2 minutes complete ... +Vuser 1:Rampup complete, Taking start Transaction Count. +Vuser 1:Timing test period of 5 in minutes +Vuser 1:1 ..., +Vuser 1:2 ..., +Vuser 1:3 ..., +Vuser 1:4 ..., +Vuser 1:5 ..., +Vuser 1:Test complete, Taking end Transaction Count. +Vuser 1:1 Active Virtual Users configured +Vuser 1:TEST RESULT : System achieved 11 NOPM from 25 MySQL TPM +Vuser 1:Gathering timing data from Active Virtual Users... +Vuser 2:FINISHED SUCCESS +Vuser 1:Calculating timings... +Vuser 1:Writing timing data to /tmp/hdbxtprofile.log +Vuser 1:FINISHED SUCCESS +ALL VIRTUAL USERS COMPLETE +vudestroy success +TEST SEQUENCE COMPLETE \ No newline at end of file diff --git a/src/VirtualClient/VirtualClient.Actions.UnitTests/Examples/HammerDB/HammerDBMySQLTPCH.txt b/src/VirtualClient/VirtualClient.Actions.UnitTests/Examples/HammerDB/HammerDBMySQLTPCH.txt new file mode 100644 index 0000000000..6a158b0678 --- /dev/null +++ b/src/VirtualClient/VirtualClient.Actions.UnitTests/Examples/HammerDB/HammerDBMySQLTPCH.txt @@ -0,0 +1,808 @@ +HammerDB CLI v4.12 +Copyright (C) 2003-2024 Steve Shaw +Type "help" for a list of commands +Initialized Jobs on-disk database /tmp/hammer.DB using existing tables (462,848 bytes) +SETTING CONFIGURATION +Database set to MySQL +Benchmark set to TPC-H for MySQL +Value 127.0.0.1 for connection:mysql_host is the same as existing value 127.0.0.1, no change made +Value 3306 for connection:mysql_port is the same as existing value 3306, no change made +Value /var/run/mysqld/mysqld.sock for connection:mysql_socket is the same as existing value /var/run/mysqld/mysqld.sock, no change made +Value 1 for tpch:mysql_scale_fact is the same as existing value 1, no change made +Value root for tpcc:mysql_user is the same as existing value root, no change made +Value hammerdb_tpch for tpcc:mysql_dbase is the same as existing value hammerdb_tpch, no change made +Value innodb for tpch:mysql_tpch_storage_engine is the same as existing value innodb, no change made +Changed tpch:mysql_total_querysets from 10 to 2 for MySQL +TPROC-H Driver Script +Script loaded, Type "print script" to view +SEQUENCE STARTED +8 VU TEST +Vuser 1 created - WAIT IDLE +Vuser 2 created - WAIT IDLE +Vuser 3 created - WAIT IDLE +Vuser 4 created - WAIT IDLE +Vuser 5 created - WAIT IDLE +Vuser 6 created - WAIT IDLE +Vuser 7 created - WAIT IDLE +Vuser 8 created - WAIT IDLE +8 Virtual Users Created +Vuser 1:RUNNING +Vuser 1:login_command mysqlconnect -socket /var/run/mysqld/mysqld.sock -ssl false -user root -password mysql +Vuser 1:Ssl_cipher +Vuser 1:Verifying the scale factor of the existing schema... +Vuser 1:Executing Query 21 (1 of 22) +Vuser 2:RUNNING +Vuser 2:login_command mysqlconnect -socket /var/run/mysqld/mysqld.sock -ssl false -user root -password mysql +Vuser 2:Ssl_cipher +Vuser 2:Verifying the scale factor of the existing schema... +Vuser 2:Executing Query 6 (1 of 22) +Vuser 3:RUNNING +Vuser 3:login_command mysqlconnect -socket /var/run/mysqld/mysqld.sock -ssl false -user root -password mysql +Vuser 3:Ssl_cipher +Vuser 3:Verifying the scale factor of the existing schema... +Vuser 3:Executing Query 8 (1 of 22) +Vuser 4:RUNNING +Vuser 4:login_command mysqlconnect -socket /var/run/mysqld/mysqld.sock -ssl false -user root -password mysql +Vuser 4:Ssl_cipher +Vuser 4:Verifying the scale factor of the existing schema... +Vuser 4:Executing Query 5 (1 of 22) +Vuser 5:RUNNING +Vuser 5:login_command mysqlconnect -socket /var/run/mysqld/mysqld.sock -ssl false -user root -password mysql +Vuser 5:Ssl_cipher +Vuser 5:Verifying the scale factor of the existing schema... +Vuser 5:Executing Query 21 (1 of 22) +Vuser 2:query 6 completed in 1.488 seconds +Vuser 2:Executing Query 17 (2 of 22) +Vuser 6:RUNNING +Vuser 6:login_command mysqlconnect -socket /var/run/mysqld/mysqld.sock -ssl false -user root -password mysql +Vuser 6:Ssl_cipher +Vuser 6:Verifying the scale factor of the existing schema... +Vuser 6:Executing Query 10 (1 of 22) +Vuser 4:query 5 completed in 1.036 seconds +Vuser 4:Executing Query 21 (2 of 22) +Vuser 2:query 17 completed in 0.787 seconds +Vuser 2:Executing Query 14 (3 of 22) +Vuser 7:RUNNING +Vuser 7:login_command mysqlconnect -socket /var/run/mysqld/mysqld.sock -ssl false -user root -password mysql +Vuser 7:Ssl_cipher +Vuser 7:Verifying the scale factor of the existing schema... +Vuser 7:Executing Query 18 (1 of 22) +Vuser 8:RUNNING +Vuser 8:login_command mysqlconnect -socket /var/run/mysqld/mysqld.sock -ssl false -user root -password mysql +Vuser 8:Ssl_cipher +Vuser 8:Verifying the scale factor of the existing schema... +Vuser 3:query 8 completed in 2.516 seconds +Vuser 8:Executing Query 19 (1 of 22) +Vuser 3:Executing Query 5 (2 of 22) +Vuser 8:query 19 completed in 0.222 seconds +Vuser 8:Executing Query 1 (2 of 22) +Vuser 3:query 5 completed in 1.417 seconds +Vuser 6:query 10 completed in 2.485 seconds +Vuser 3:Executing Query 4 (3 of 22) +Vuser 6:Executing Query 3 (2 of 22) +Vuser 3:query 4 completed in 1.019 seconds +Vuser 3:Executing Query 6 (4 of 22) +Vuser 2:query 14 completed in 3.618 seconds +Vuser 2:Executing Query 16 (4 of 22) +Vuser 2:query 16 completed in 0.416 seconds +Vuser 2:Executing Query 19 (5 of 22) +Vuser 6:query 3 completed in 1.892 seconds +Vuser 6:Executing Query 15 (3 of 22) +Vuser 1:query 21 completed in 7.174 seconds +Vuser 2:query 19 completed in 0.233 seconds +Vuser 1:Executing Query 3 (2 of 22) +Vuser 2:Executing Query 10 (6 of 22) +Vuser 7:query 18 completed in 4.543 seconds +Vuser 7:Executing Query 8 (2 of 22) +Vuser 1:query 3 completed in 1.752 seconds +Vuser 1:Executing Query 18 (3 of 22) +Vuser 3:query 6 completed in 3.226 seconds +Vuser 3:Executing Query 17 (5 of 22) +Vuser 2:query 10 completed in 2.567 seconds +Vuser 2:Executing Query 9 (7 of 22) +Vuser 3:query 17 completed in 0.915 seconds +Vuser 3:Executing Query 7 (6 of 22) +Vuser 5:query 21 completed in 9.401 seconds +Vuser 5:Executing Query 15 (2 of 22) +Vuser 4:query 21 completed in 9.062 seconds +Vuser 4:Executing Query 14 (3 of 22) +Vuser 3:query 7 completed in 1.474 seconds +Vuser 3:Executing Query 1 (7 of 22) +Vuser 7:query 8 completed in 4.598 seconds +Vuser 7:Executing Query 20 (3 of 22) +Vuser 7:query 20 completed in 0.557 seconds +Vuser 7:Executing Query 21 (4 of 22) +Vuser 2:query 9 completed in 3.023 seconds +Vuser 2:Executing Query 2 (8 of 22) +Vuser 2:query 2 completed in 0.19 seconds +Vuser 2:Executing Query 15 (9 of 22) +Vuser 1:query 18 completed in 4.514 seconds +Vuser 1:Executing Query 5 (4 of 22) +Vuser 1:query 5 completed in 1.364 seconds +Vuser 1:Executing Query 11 (5 of 22) +Vuser 4:query 14 completed in 3.392 seconds +Vuser 4:Executing Query 19 (4 of 22) +Vuser 1:query 11 completed in 0.166 seconds +Vuser 1:Executing Query 7 (6 of 22) +Vuser 4:query 19 completed in 0.227 seconds +Vuser 4:Executing Query 15 (5 of 22) +Vuser 6:query 15 completed in 8.543 seconds +Vuser 6:Executing Query 13 (4 of 22) +Vuser 1:query 7 completed in 1.351 seconds +Vuser 1:Executing Query 6 (7 of 22) +Vuser 1:query 6 completed in 3.53 seconds +Vuser 1:Executing Query 20 (8 of 22) +Vuser 6:query 13 completed in 4.706 seconds +Vuser 6:Executing Query 6 (5 of 22) +Vuser 5:query 15 completed in 8.917 seconds +Vuser 5:Executing Query 4 (3 of 22) +Vuser 1:query 20 completed in 0.444 seconds +Vuser 1:Executing Query 17 (9 of 22) +Vuser 1:query 17 completed in 0.815 seconds +Vuser 1:Executing Query 12 (10 of 22) +Vuser 5:query 4 completed in 1.14 seconds +Vuser 5:Executing Query 6 (4 of 22) +Vuser 2:query 15 completed in 8.662 seconds +Vuser 2:Executing Query 8 (10 of 22) +Vuser 7:query 21 completed in 9.268 seconds +Vuser 7:Executing Query 2 (5 of 22) +Vuser 7:query 2 completed in 0.193 seconds +Vuser 7:Executing Query 4 (6 of 22) +Vuser 8:query 1 completed in 18.72 seconds +Vuser 8:Executing Query 15 (3 of 22) +Vuser 7:query 4 completed in 1.068 seconds +Vuser 7:Executing Query 22 (7 of 22) +Vuser 7:query 22 completed in 0.212 seconds +Vuser 7:Executing Query 17 (8 of 22) +Vuser 6:query 6 completed in 3.454 seconds +Vuser 6:Executing Query 8 (6 of 22) +Vuser 4:query 15 completed in 8.74 seconds +Vuser 4:Executing Query 17 (6 of 22) +Vuser 7:query 17 completed in 0.866 seconds +Vuser 7:Executing Query 1 (9 of 22) +Vuser 4:query 17 completed in 0.808 seconds +Vuser 4:Executing Query 12 (7 of 22) +Vuser 5:query 6 completed in 3.566 seconds +Vuser 5:Executing Query 7 (5 of 22) +Vuser 1:query 12 completed in 4.564 seconds +Vuser 1:Executing Query 16 (11 of 22) +Vuser 1:query 16 completed in 0.397 seconds +Vuser 1:Executing Query 15 (12 of 22) +Vuser 2:query 8 completed in 4.625 seconds +Vuser 2:Executing Query 5 (11 of 22) +Vuser 5:query 7 completed in 1.298 seconds +Vuser 5:Executing Query 16 (6 of 22) +Vuser 5:query 16 completed in 0.425 seconds +Vuser 5:Executing Query 19 (7 of 22) +Vuser 5:query 19 completed in 0.231 seconds +Vuser 5:Executing Query 18 (8 of 22) +Vuser 2:query 5 completed in 1.386 seconds +Vuser 2:Executing Query 22 (12 of 22) +Vuser 2:query 22 completed in 0.218 seconds +Vuser 2:Executing Query 12 (13 of 22) +Vuser 6:query 8 completed in 4.384 seconds +Vuser 6:Executing Query 9 (7 of 22) +Vuser 4:query 12 completed in 4.274 seconds +Vuser 4:Executing Query 6 (8 of 22) +Vuser 3:query 1 completed in 18.431 seconds +Vuser 3:Executing Query 18 (8 of 22) +Vuser 8:query 15 completed in 8.347 seconds +Vuser 8:Executing Query 17 (4 of 22) +Vuser 8:query 17 completed in 0.724 seconds +Vuser 8:Executing Query 5 (5 of 22) +Vuser 6:query 9 completed in 3.713 seconds +Vuser 6:Executing Query 7 (8 of 22) +Vuser 5:query 18 completed in 4.791 seconds +Vuser 5:Executing Query 14 (9 of 22) +Vuser 4:query 6 completed in 3.464 seconds +Vuser 4:Executing Query 4 (9 of 22) +Vuser 2:query 12 completed in 4.677 seconds +Vuser 2:Executing Query 7 (14 of 22) +Vuser 8:query 5 completed in 1.811 seconds +Vuser 8:Executing Query 8 (6 of 22) +Vuser 6:query 7 completed in 1.621 seconds +Vuser 6:Executing Query 4 (9 of 22) +Vuser 4:query 4 completed in 1.177 seconds +Vuser 4:Executing Query 9 (10 of 22) +Vuser 2:query 7 completed in 1.657 seconds +Vuser 2:Executing Query 13 (15 of 22) +Vuser 3:query 18 completed in 4.333 seconds +Vuser 3:Executing Query 22 (9 of 22) +Vuser 3:query 22 completed in 0.211 seconds +Vuser 6:query 4 completed in 1.216 seconds +Vuser 3:Executing Query 14 (10 of 22) +Vuser 6:Executing Query 11 (10 of 22) +Vuser 1:query 15 completed in 8.51 seconds +Vuser 1:Executing Query 13 (13 of 22) +Vuser 6:query 11 completed in 0.202 seconds +Vuser 6:Executing Query 22 (11 of 22) +Vuser 6:query 22 completed in 0.215 seconds +Vuser 6:Executing Query 18 (12 of 22) +Vuser 5:query 14 completed in 3.438 seconds +Vuser 5:Executing Query 22 (10 of 22) +Vuser 5:query 22 completed in 0.192 seconds +Vuser 5:Executing Query 11 (11 of 22) +Vuser 5:query 11 completed in 0.173 seconds +Vuser 5:Executing Query 13 (12 of 22) +Vuser 4:query 9 completed in 3.032 seconds +Vuser 4:Executing Query 8 (11 of 22) +Vuser 3:query 14 completed in 3.582 seconds +Vuser 3:Executing Query 9 (11 of 22) +Vuser 8:query 8 completed in 5.092 seconds +Vuser 8:Executing Query 9 (7 of 22) +Vuser 6:query 18 completed in 4.601 seconds +Vuser 6:Executing Query 12 (13 of 22) +Vuser 2:query 13 completed in 5.499 seconds +Vuser 2:Executing Query 18 (16 of 22) +Vuser 1:query 13 completed in 5.45 seconds +Vuser 1:Executing Query 10 (14 of 22) +Vuser 5:query 13 completed in 5.418 seconds +Vuser 5:Executing Query 3 (13 of 22) +Vuser 4:query 8 completed in 4.614 seconds +Vuser 4:Executing Query 16 (12 of 22) +Vuser 3:query 9 completed in 3.202 seconds +Vuser 3:Executing Query 10 (12 of 22) +Vuser 8:query 9 completed in 3.317 seconds +Vuser 8:Executing Query 12 (8 of 22) +Vuser 4:query 16 completed in 0.426 seconds +Vuser 4:Executing Query 11 (13 of 22) +Vuser 4:query 11 completed in 0.21 seconds +Vuser 4:Executing Query 2 (14 of 22) +Vuser 4:query 2 completed in 0.191 seconds +Vuser 4:Executing Query 10 (15 of 22) +Vuser 1:query 10 completed in 2.211 seconds +Vuser 1:Executing Query 2 (15 of 22) +Vuser 1:query 2 completed in 0.18 seconds +Vuser 1:Executing Query 8 (16 of 22) +Vuser 7:query 1 completed in 18.462 seconds +Vuser 7:Executing Query 11 (10 of 22) +Vuser 7:query 11 completed in 0.206 seconds +Vuser 7:Executing Query 9 (11 of 22) +Vuser 5:query 3 completed in 1.982 seconds +Vuser 5:Executing Query 1 (14 of 22) +Vuser 6:query 12 completed in 4.358 seconds +Vuser 6:Executing Query 1 (14 of 22) +Vuser 3:query 10 completed in 2.751 seconds +Vuser 3:Executing Query 15 (13 of 22) +Vuser 2:query 18 completed in 4.408 seconds +Vuser 2:Executing Query 1 (17 of 22) +Vuser 4:query 10 completed in 2.579 seconds +Vuser 4:Executing Query 18 (16 of 22) +Vuser 7:query 9 completed in 2.903 seconds +Vuser 7:Executing Query 19 (12 of 22) +Vuser 8:query 12 completed in 4.208 seconds +Vuser 8:Executing Query 14 (9 of 22) +Vuser 7:query 19 completed in 0.218 seconds +Vuser 7:Executing Query 3 (13 of 22) +Vuser 1:query 8 completed in 4.47 seconds +Vuser 1:Executing Query 14 (17 of 22) +Vuser 7:query 3 completed in 2.045 seconds +Vuser 7:Executing Query 13 (14 of 22) +Vuser 8:query 14 completed in 3.296 seconds +Vuser 8:Executing Query 7 (10 of 22) +Vuser 4:query 18 completed in 4.838 seconds +Vuser 4:Executing Query 1 (17 of 22) +Vuser 1:query 14 completed in 3.702 seconds +Vuser 8:query 7 completed in 1.469 seconds +Vuser 1:Executing Query 19 (18 of 22) +Vuser 8:Executing Query 4 (11 of 22) +Vuser 1:query 19 completed in 0.23 seconds +Vuser 1:Executing Query 9 (19 of 22) +Vuser 8:query 4 completed in 1.08 seconds +Vuser 8:Executing Query 3 (12 of 22) +Vuser 7:query 13 completed in 4.564 seconds +Vuser 7:Executing Query 5 (15 of 22) +Vuser 3:query 15 completed in 9.433 seconds +Vuser 3:Executing Query 11 (14 of 22) +Vuser 3:query 11 completed in 0.188 seconds +Vuser 3:Executing Query 20 (15 of 22) +Vuser 8:query 3 completed in 2.011 seconds +Vuser 8:Executing Query 20 (13 of 22) +Vuser 7:query 5 completed in 1.397 seconds +Vuser 1:query 9 completed in 3.154 seconds +Vuser 7:Executing Query 7 (16 of 22) +Vuser 1:Executing Query 22 (20 of 22) +Vuser 3:query 20 completed in 0.501 seconds +Vuser 3:Executing Query 2 (16 of 22) +Vuser 8:query 20 completed in 0.443 seconds +Vuser 8:Executing Query 16 (14 of 22) +Vuser 1:query 22 completed in 0.217 seconds +Vuser 1:Executing Query 1 (21 of 22) +Vuser 3:query 2 completed in 0.195 seconds +Vuser 3:Executing Query 21 (17 of 22) +Vuser 8:query 16 completed in 0.396 seconds +Vuser 8:Executing Query 6 (15 of 22) +Vuser 7:query 7 completed in 1.358 seconds +Vuser 7:Executing Query 10 (17 of 22) +Vuser 7:query 10 completed in 2.626 seconds +Vuser 7:Executing Query 16 (18 of 22) +Vuser 8:query 6 completed in 3.639 seconds +Vuser 8:Executing Query 22 (16 of 22) +Vuser 7:query 16 completed in 0.424 seconds +Vuser 7:Executing Query 6 (19 of 22) +Vuser 8:query 22 completed in 0.207 seconds +Vuser 8:Executing Query 10 (17 of 22) +Vuser 8:query 10 completed in 2.59 seconds +Vuser 8:Executing Query 13 (18 of 22) +Vuser 5:query 1 completed in 18.983 seconds +Vuser 5:Executing Query 2 (15 of 22) +Vuser 7:query 6 completed in 3.46 seconds +Vuser 7:Executing Query 14 (20 of 22) +Vuser 5:query 2 completed in 0.198 seconds +Vuser 5:Executing Query 5 (16 of 22) +Vuser 6:query 1 completed in 19.211 seconds +Vuser 6:Executing Query 5 (15 of 22) +Vuser 3:query 21 completed in 9.003 seconds +Vuser 3:Executing Query 19 (18 of 22) +Vuser 3:query 19 completed in 0.21 seconds +Vuser 3:Executing Query 13 (19 of 22) +Vuser 5:query 5 completed in 1.855 seconds +Vuser 5:Executing Query 8 (17 of 22) +Vuser 2:query 1 completed in 20.102 seconds +Vuser 2:Executing Query 4 (18 of 22) +Vuser 6:query 5 completed in 1.589 seconds +Vuser 6:Executing Query 16 (16 of 22) +Vuser 6:query 16 completed in 0.425 seconds +Vuser 6:Executing Query 2 (17 of 22) +Vuser 2:query 4 completed in 1.137 seconds +Vuser 2:Executing Query 20 (19 of 22) +Vuser 6:query 2 completed in 0.204 seconds +Vuser 6:Executing Query 14 (18 of 22) +Vuser 7:query 14 completed in 3.361 seconds +Vuser 7:Executing Query 15 (21 of 22) +Vuser 2:query 20 completed in 0.496 seconds +Vuser 2:Executing Query 3 (20 of 22) +Vuser 8:query 13 completed in 4.994 seconds +Vuser 8:Executing Query 2 (19 of 22) +Vuser 8:query 2 completed in 0.178 seconds +Vuser 8:Executing Query 21 (20 of 22) +Vuser 2:query 3 completed in 2.002 seconds +Vuser 2:Executing Query 11 (21 of 22) +Vuser 2:query 11 completed in 0.197 seconds +Vuser 2:Executing Query 21 (22 of 22) +Vuser 5:query 8 completed in 4.378 seconds +Vuser 5:Executing Query 20 (18 of 22) +Vuser 3:query 13 completed in 4.978 seconds +Vuser 3:Executing Query 16 (20 of 22) +Vuser 5:query 20 completed in 0.498 seconds +Vuser 5:Executing Query 12 (19 of 22) +Vuser 6:query 14 completed in 3.703 seconds +Vuser 6:Executing Query 19 (19 of 22) +Vuser 3:query 16 completed in 0.412 seconds +Vuser 3:Executing Query 12 (21 of 22) +Vuser 4:query 1 completed in 19.57 seconds +Vuser 4:Executing Query 13 (18 of 22) +Vuser 6:query 19 completed in 0.233 seconds +Vuser 6:Executing Query 20 (20 of 22) +Vuser 6:query 20 completed in 0.508 seconds +Vuser 6:Executing Query 17 (21 of 22) +Vuser 6:query 17 completed in 0.938 seconds +Vuser 6:Executing Query 21 (22 of 22) +Vuser 1:query 1 completed in 19.092 seconds +Vuser 1:Executing Query 4 (22 of 22) +Vuser 5:query 12 completed in 4.683 seconds +Vuser 5:Executing Query 17 (20 of 22) +Vuser 3:query 12 completed in 4.487 seconds +Vuser 3:Executing Query 3 (22 of 22) +Vuser 4:query 13 completed in 4.688 seconds +Vuser 7:query 15 completed in 8.457 seconds +Vuser 4:Executing Query 7 (19 of 22) +Vuser 7:Executing Query 12 (22 of 22) +Vuser 1:query 4 completed in 1.11 seconds +Vuser 5:query 17 completed in 0.897 seconds +Vuser 1:Completed 1 query set(s) in 75 seconds +Vuser 5:Executing Query 10 (21 of 22) +Vuser 1:Geometric mean of query times returning rows (22) is 1.62046 +Vuser 1:Executing Query 21 (1 of 22) +Vuser 4:query 7 completed in 1.399 seconds +Vuser 4:Executing Query 22 (20 of 22) +Vuser 4:query 22 completed in 0.2 seconds +Vuser 4:Executing Query 3 (21 of 22) +Vuser 8:query 21 completed in 9.175 seconds +Vuser 3:query 3 completed in 1.922 seconds +Vuser 8:Executing Query 18 (21 of 22) +Vuser 3:Completed 1 query set(s) in 75 seconds +Vuser 3:Geometric mean of query times returning rows (22) is 1.63330 +Vuser 3:Executing Query 8 (1 of 22) +Vuser 2:query 21 completed in 8.918 seconds +Vuser 2:Completed 1 query set(s) in 77 seconds +Vuser 2:Geometric mean of query times returning rows (22) is 1.64223 +Vuser 2:Executing Query 6 (1 of 22) +Vuser 5:query 10 completed in 2.572 seconds +Vuser 5:Executing Query 9 (22 of 22) +Vuser 4:query 3 completed in 1.776 seconds +Vuser 4:Executing Query 20 (22 of 22) +Vuser 4:query 20 completed in 0.502 seconds +Vuser 4:Completed 1 query set(s) in 77 seconds +Vuser 4:Geometric mean of query times returning rows (22) is 1.64977 +Vuser 4:Executing Query 5 (1 of 22) +Vuser 7:query 12 completed in 4.311 seconds +Vuser 7:Completed 1 query set(s) in 76 seconds +Vuser 7:Geometric mean of query times returning rows (22) is 1.67255 +Vuser 7:Executing Query 18 (1 of 22) +Vuser 4:query 5 completed in 1.525 seconds +Vuser 4:Executing Query 21 (2 of 22) +Vuser 8:query 18 completed in 4.37 seconds +Vuser 8:Executing Query 11 (22 of 22) +Vuser 6:query 21 completed in 9.181 seconds +Vuser 6:Completed 1 query set(s) in 78 seconds +Vuser 6:Geometric mean of query times returning rows (22) is 1.73428 +Vuser 6:Executing Query 10 (1 of 22) +Vuser 3:query 8 completed in 4.473 seconds +Vuser 2:query 6 completed in 3.069 seconds +Vuser 3:Executing Query 5 (2 of 22) +Vuser 2:Executing Query 17 (2 of 22) +Vuser 8:query 11 completed in 0.156 seconds +Vuser 8:Completed 1 query set(s) in 78 seconds +Vuser 8:Geometric mean of query times returning rows (22) is 1.65453 +Vuser 8:Executing Query 19 (1 of 22) +Vuser 5:query 9 completed in 3.094 seconds +Vuser 5:Completed 1 query set(s) in 79 seconds +Vuser 5:Geometric mean of query times returning rows (22) is 1.70765 +Vuser 5:Executing Query 21 (1 of 22) +Vuser 8:query 19 completed in 0.212 seconds +Vuser 8:Executing Query 1 (2 of 22) +Vuser 2:query 17 completed in 0.818 seconds +Vuser 2:Executing Query 14 (3 of 22) +Vuser 3:query 5 completed in 1.357 seconds +Vuser 3:Executing Query 4 (3 of 22) +Vuser 3:query 4 completed in 1.036 seconds +Vuser 3:Executing Query 6 (4 of 22) +Vuser 7:query 18 completed in 4.428 seconds +Vuser 7:Executing Query 8 (2 of 22) +Vuser 6:query 10 completed in 2.721 seconds +Vuser 6:Executing Query 3 (2 of 22) +Vuser 1:query 21 completed in 9.059 seconds +Vuser 1:Executing Query 3 (2 of 22) +Vuser 2:query 14 completed in 3.385 seconds +Vuser 2:Executing Query 16 (4 of 22) +Vuser 6:query 3 completed in 1.934 seconds +Vuser 6:Executing Query 15 (3 of 22) +Vuser 2:query 16 completed in 0.395 seconds +Vuser 2:Executing Query 19 (5 of 22) +Vuser 2:query 19 completed in 0.219 seconds +Vuser 2:Executing Query 10 (6 of 22) +Vuser 1:query 3 completed in 1.909 seconds +Vuser 1:Executing Query 18 (3 of 22) +Vuser 3:query 6 completed in 3.042 seconds +Vuser 3:Executing Query 17 (5 of 22) +Vuser 3:query 17 completed in 0.844 seconds +Vuser 3:Executing Query 7 (6 of 22) +Vuser 7:query 8 completed in 4.599 seconds +Vuser 7:Executing Query 20 (3 of 22) +Vuser 2:query 10 completed in 2.57 seconds +Vuser 2:Executing Query 9 (7 of 22) +Vuser 7:query 20 completed in 0.481 seconds +Vuser 7:Executing Query 21 (4 of 22) +Vuser 3:query 7 completed in 1.417 seconds +Vuser 3:Executing Query 1 (7 of 22) +Vuser 4:query 21 completed in 9.109 seconds +Vuser 4:Executing Query 14 (3 of 22) +Vuser 5:query 21 completed in 9.025 seconds +Vuser 5:Executing Query 15 (2 of 22) +Vuser 1:query 18 completed in 4.576 seconds +Vuser 1:Executing Query 5 (4 of 22) +Vuser 2:query 9 completed in 3.071 seconds +Vuser 2:Executing Query 2 (8 of 22) +Vuser 2:query 2 completed in 0.198 seconds +Vuser 2:Executing Query 15 (9 of 22) +Vuser 1:query 5 completed in 1.433 seconds +Vuser 1:Executing Query 11 (5 of 22) +Vuser 1:query 11 completed in 0.185 seconds +Vuser 1:Executing Query 7 (6 of 22) +Vuser 4:query 14 completed in 3.626 seconds +Vuser 4:Executing Query 19 (4 of 22) +Vuser 4:query 19 completed in 0.226 seconds +Vuser 4:Executing Query 15 (5 of 22) +Vuser 6:query 15 completed in 8.352 seconds +Vuser 6:Executing Query 13 (4 of 22) +Vuser 1:query 7 completed in 1.378 seconds +Vuser 1:Executing Query 6 (7 of 22) +Vuser 7:query 21 completed in 9.12 seconds +Vuser 7:Executing Query 2 (5 of 22) +Vuser 1:query 6 completed in 3.809 seconds +Vuser 1:Executing Query 20 (8 of 22) +Vuser 7:query 2 completed in 0.182 seconds +Vuser 7:Executing Query 4 (6 of 22) +Vuser 1:query 20 completed in 0.492 seconds +Vuser 1:Executing Query 17 (9 of 22) +Vuser 6:query 13 completed in 4.55 seconds +Vuser 6:Executing Query 6 (5 of 22) +Vuser 5:query 15 completed in 8.475 seconds +Vuser 5:Executing Query 4 (3 of 22) +Vuser 7:query 4 completed in 1.095 seconds +Vuser 7:Executing Query 22 (7 of 22) +Vuser 1:query 17 completed in 0.773 seconds +Vuser 1:Executing Query 12 (10 of 22) +Vuser 7:query 22 completed in 0.214 seconds +Vuser 7:Executing Query 17 (8 of 22) +Vuser 8:query 1 completed in 18.634 seconds +Vuser 8:Executing Query 15 (3 of 22) +Vuser 5:query 4 completed in 1.224 seconds +Vuser 5:Executing Query 6 (4 of 22) +Vuser 7:query 17 completed in 0.795 seconds +Vuser 7:Executing Query 1 (9 of 22) +Vuser 2:query 15 completed in 9.269 seconds +Vuser 2:Executing Query 8 (10 of 22) +Vuser 6:query 6 completed in 3.29 seconds +Vuser 6:Executing Query 8 (6 of 22) +Vuser 4:query 15 completed in 8.818 seconds +Vuser 4:Executing Query 17 (6 of 22) +Vuser 4:query 17 completed in 0.8 seconds +Vuser 4:Executing Query 12 (7 of 22) +Vuser 5:query 6 completed in 3.512 seconds +Vuser 5:Executing Query 7 (5 of 22) +Vuser 1:query 12 completed in 4.581 seconds +Vuser 1:Executing Query 16 (11 of 22) +Vuser 1:query 16 completed in 0.415 seconds +Vuser 1:Executing Query 15 (12 of 22) +Vuser 5:query 7 completed in 1.365 seconds +Vuser 5:Executing Query 16 (6 of 22) +Vuser 5:query 16 completed in 0.424 seconds +Vuser 5:Executing Query 19 (7 of 22) +Vuser 2:query 8 completed in 4.399 seconds +Vuser 2:Executing Query 5 (11 of 22) +Vuser 5:query 19 completed in 0.242 seconds +Vuser 5:Executing Query 18 (8 of 22) +Vuser 2:query 5 completed in 1.108 seconds +Vuser 2:Executing Query 22 (12 of 22) +Vuser 6:query 8 completed in 4.783 seconds +Vuser 6:Executing Query 9 (7 of 22) +Vuser 2:query 22 completed in 0.216 seconds +Vuser 2:Executing Query 12 (13 of 22) +Vuser 4:query 12 completed in 4.449 seconds +Vuser 3:query 1 completed in 18.693 seconds +Vuser 4:Executing Query 6 (8 of 22) +Vuser 3:Executing Query 18 (8 of 22) +Vuser 8:query 15 completed in 9.326 seconds +Vuser 8:Executing Query 17 (4 of 22) +Vuser 8:query 17 completed in 0.796 seconds +Vuser 8:Executing Query 5 (5 of 22) +Vuser 6:query 9 completed in 3.607 seconds +Vuser 6:Executing Query 7 (8 of 22) +Vuser 5:query 18 completed in 4.767 seconds +Vuser 5:Executing Query 14 (9 of 22) +Vuser 4:query 6 completed in 3.672 seconds +Vuser 4:Executing Query 4 (9 of 22) +Vuser 8:query 5 completed in 1.133 seconds +Vuser 8:Executing Query 8 (6 of 22) +Vuser 2:query 12 completed in 4.677 seconds +Vuser 2:Executing Query 7 (14 of 22) +Vuser 6:query 7 completed in 1.599 seconds +Vuser 6:Executing Query 4 (9 of 22) +Vuser 1:query 15 completed in 7.993 seconds +Vuser 3:query 18 completed in 4.765 seconds +Vuser 1:Executing Query 13 (13 of 22) +Vuser 3:Executing Query 22 (9 of 22) +Vuser 4:query 4 completed in 1.306 seconds +Vuser 4:Executing Query 9 (10 of 22) +Vuser 3:query 22 completed in 0.192 seconds +Vuser 3:Executing Query 14 (10 of 22) +Vuser 2:query 7 completed in 1.637 seconds +Vuser 2:Executing Query 13 (15 of 22) +Vuser 6:query 4 completed in 1.306 seconds +Vuser 6:Executing Query 11 (10 of 22) +Vuser 6:query 11 completed in 0.2 seconds +Vuser 6:Executing Query 22 (11 of 22) +Vuser 6:query 22 completed in 0.218 seconds +Vuser 5:query 14 completed in 3.37 seconds +Vuser 6:Executing Query 18 (12 of 22) +Vuser 5:Executing Query 22 (10 of 22) +Vuser 5:query 22 completed in 0.194 seconds +Vuser 5:Executing Query 11 (11 of 22) +Vuser 5:query 11 completed in 0.175 seconds +Vuser 5:Executing Query 13 (12 of 22) +Vuser 8:query 8 completed in 3.936 seconds +Vuser 8:Executing Query 9 (7 of 22) +Vuser 4:query 9 completed in 3.1 seconds +Vuser 4:Executing Query 8 (11 of 22) +Vuser 3:query 14 completed in 3.215 seconds +Vuser 3:Executing Query 9 (11 of 22) +Vuser 1:query 13 completed in 5.425 seconds +Vuser 1:Executing Query 10 (14 of 22) +Vuser 8:query 9 completed in 3.218 seconds +Vuser 8:Executing Query 12 (8 of 22) +Vuser 7:query 1 completed in 18.404 seconds +Vuser 6:query 18 completed in 4.845 seconds +Vuser 7:Executing Query 11 (10 of 22) +Vuser 6:Executing Query 12 (13 of 22) +Vuser 7:query 11 completed in 0.177 seconds +Vuser 7:Executing Query 9 (11 of 22) +Vuser 2:query 13 completed in 5.662 seconds +Vuser 2:Executing Query 18 (16 of 22) +Vuser 3:query 9 completed in 3.173 seconds +Vuser 3:Executing Query 10 (12 of 22) +Vuser 4:query 8 completed in 4.101 seconds +Vuser 5:query 13 completed in 5.569 seconds +Vuser 4:Executing Query 16 (12 of 22) +Vuser 5:Executing Query 3 (13 of 22) +Vuser 4:query 16 completed in 0.383 seconds +Vuser 4:Executing Query 11 (13 of 22) +Vuser 4:query 11 completed in 0.177 seconds +Vuser 4:Executing Query 2 (14 of 22) +Vuser 1:query 10 completed in 2.648 seconds +Vuser 1:Executing Query 2 (15 of 22) +Vuser 4:query 2 completed in 0.184 seconds +Vuser 4:Executing Query 10 (15 of 22) +Vuser 1:query 2 completed in 0.198 seconds +Vuser 1:Executing Query 8 (16 of 22) +Vuser 3:query 10 completed in 2.772 seconds +Vuser 3:Executing Query 15 (13 of 22) +Vuser 5:query 3 completed in 2.112 seconds +Vuser 5:Executing Query 1 (14 of 22) +Vuser 7:query 9 completed in 3.14 seconds +Vuser 7:Executing Query 19 (12 of 22) +Vuser 7:query 19 completed in 0.232 seconds +Vuser 7:Executing Query 3 (13 of 22) +Vuser 6:query 12 completed in 4.118 seconds +Vuser 6:Executing Query 1 (14 of 22) +Vuser 8:query 12 completed in 4.359 seconds +Vuser 8:Executing Query 14 (9 of 22) +Vuser 4:query 10 completed in 2.666 seconds +Vuser 4:Executing Query 18 (16 of 22) +Vuser 2:query 18 completed in 4.572 seconds +Vuser 2:Executing Query 1 (17 of 22) +Vuser 7:query 3 completed in 2.149 seconds +Vuser 7:Executing Query 13 (14 of 22) +Vuser 1:query 8 completed in 4.392 seconds +Vuser 1:Executing Query 14 (17 of 22) +Vuser 8:query 14 completed in 3.514 seconds +Vuser 8:Executing Query 7 (10 of 22) +Vuser 8:query 7 completed in 1.69 seconds +Vuser 8:Executing Query 4 (11 of 22) +Vuser 4:query 18 completed in 4.779 seconds +Vuser 4:Executing Query 1 (17 of 22) +Vuser 1:query 14 completed in 3.32 seconds +Vuser 1:Executing Query 19 (18 of 22) +Vuser 1:query 19 completed in 0.233 seconds +Vuser 1:Executing Query 9 (19 of 22) +Vuser 8:query 4 completed in 1.078 seconds +Vuser 8:Executing Query 3 (12 of 22) +Vuser 7:query 13 completed in 4.779 seconds +Vuser 7:Executing Query 5 (15 of 22) +Vuser 3:query 15 completed in 8.64 seconds +Vuser 3:Executing Query 11 (14 of 22) +Vuser 3:query 11 completed in 0.181 seconds +Vuser 3:Executing Query 20 (15 of 22) +Vuser 7:query 5 completed in 1.597 seconds +Vuser 7:Executing Query 7 (16 of 22) +Vuser 3:query 20 completed in 0.517 seconds +Vuser 3:Executing Query 2 (16 of 22) +Vuser 8:query 3 completed in 2.026 seconds +Vuser 8:Executing Query 20 (13 of 22) +Vuser 3:query 2 completed in 0.198 seconds +Vuser 3:Executing Query 21 (17 of 22) +Vuser 1:query 9 completed in 2.892 seconds +Vuser 1:Executing Query 22 (20 of 22) +Vuser 8:query 20 completed in 0.461 seconds +Vuser 8:Executing Query 16 (14 of 22) +Vuser 1:query 22 completed in 0.175 seconds +Vuser 1:Executing Query 1 (21 of 22) +Vuser 8:query 16 completed in 0.391 seconds +Vuser 8:Executing Query 6 (15 of 22) +Vuser 7:query 7 completed in 1.521 seconds +Vuser 7:Executing Query 10 (17 of 22) +Vuser 7:query 10 completed in 2.703 seconds +Vuser 7:Executing Query 16 (18 of 22) +Vuser 7:query 16 completed in 0.424 seconds +Vuser 7:Executing Query 6 (19 of 22) +Vuser 8:query 6 completed in 3.559 seconds +Vuser 8:Executing Query 22 (16 of 22) +Vuser 8:query 22 completed in 0.216 seconds +Vuser 8:Executing Query 10 (17 of 22) +Vuser 8:query 10 completed in 2.738 seconds +Vuser 8:Executing Query 13 (18 of 22) +Vuser 7:query 6 completed in 3.675 seconds +Vuser 7:Executing Query 14 (20 of 22) +Vuser 6:query 1 completed in 18.319 seconds +Vuser 6:Executing Query 5 (15 of 22) +Vuser 3:query 21 completed in 10.416 seconds +Vuser 3:Executing Query 19 (18 of 22) +Vuser 5:query 1 completed in 20.15 seconds +Vuser 5:Executing Query 2 (15 of 22) +Vuser 3:query 19 completed in 0.235 seconds +Vuser 3:Executing Query 13 (19 of 22) +Vuser 5:query 2 completed in 0.19 seconds +Vuser 5:Executing Query 5 (16 of 22) +Vuser 6:query 5 completed in 1.261 seconds +Vuser 6:Executing Query 16 (16 of 22) +Vuser 7:query 14 completed in 3.435 seconds +Vuser 7:Executing Query 15 (21 of 22) +Vuser 6:query 16 completed in 0.401 seconds +Vuser 6:Executing Query 2 (17 of 22) +Vuser 6:query 2 completed in 0.194 seconds +Vuser 6:Executing Query 14 (18 of 22) +Vuser 2:query 1 completed in 19.897 seconds +Vuser 2:Executing Query 4 (18 of 22) +Vuser 8:query 13 completed in 5.122 seconds +Vuser 8:Executing Query 2 (19 of 22) +Vuser 5:query 5 completed in 1.623 seconds +Vuser 5:Executing Query 8 (17 of 22) +Vuser 8:query 2 completed in 0.205 seconds +Vuser 8:Executing Query 21 (20 of 22) +Vuser 2:query 4 completed in 1.018 seconds +Vuser 2:Executing Query 20 (19 of 22) +Vuser 2:query 20 completed in 0.474 seconds +Vuser 2:Executing Query 3 (20 of 22) +Vuser 6:query 14 completed in 3.55 seconds +Vuser 6:Executing Query 19 (19 of 22) +Vuser 4:query 1 completed in 18.692 seconds +Vuser 4:Executing Query 13 (18 of 22) +Vuser 6:query 19 completed in 0.241 seconds +Vuser 6:Executing Query 20 (20 of 22) +Vuser 2:query 3 completed in 1.985 seconds +Vuser 2:Executing Query 11 (21 of 22) +Vuser 2:query 11 completed in 0.255 seconds +Vuser 2:Executing Query 21 (22 of 22) +Vuser 3:query 13 completed in 5.285 seconds +Vuser 6:query 20 completed in 0.514 seconds +Vuser 3:Executing Query 16 (20 of 22) +Vuser 6:Executing Query 17 (21 of 22) +Vuser 3:query 16 completed in 0.389 seconds +Vuser 3:Executing Query 12 (21 of 22) +Vuser 5:query 8 completed in 4.211 seconds +Vuser 5:Executing Query 20 (18 of 22) +Vuser 6:query 17 completed in 0.936 seconds +Vuser 6:Executing Query 21 (22 of 22) +Vuser 5:query 20 completed in 0.483 seconds +Vuser 5:Executing Query 12 (19 of 22) +Vuser 1:query 1 completed in 18.738 seconds +Vuser 1:Executing Query 4 (22 of 22) +Vuser 7:query 15 completed in 8.681 seconds +Vuser 7:Executing Query 12 (22 of 22) +Vuser 4:query 13 completed in 4.639 seconds +Vuser 4:Executing Query 7 (19 of 22) +Vuser 1:query 4 completed in 1.036 seconds +Vuser 1:Completed 2 query set(s) in 76 seconds +Vuser 1:Geometric mean of query times returning rows (22) is 1.64940 +Vuser 1:FINISHED SUCCESS +Vuser 3:query 12 completed in 4.67 seconds +Vuser 3:Executing Query 3 (22 of 22) +Vuser 8:query 21 completed in 8.721 seconds +Vuser 4:query 7 completed in 1.341 seconds +Vuser 8:Executing Query 18 (21 of 22) +Vuser 4:Executing Query 22 (20 of 22) +Vuser 4:query 22 completed in 0.209 seconds +Vuser 4:Executing Query 3 (21 of 22) +Vuser 5:query 12 completed in 4.495 seconds +Vuser 5:Executing Query 17 (20 of 22) +Vuser 5:query 17 completed in 0.886 seconds +Vuser 5:Executing Query 10 (21 of 22) +Vuser 3:query 3 completed in 1.994 seconds +Vuser 3:Completed 2 query set(s) in 78 seconds +Vuser 3:Geometric mean of query times returning rows (22) is 1.67337 +Vuser 3:FINISHED SUCCESS +Vuser 8:query 18 completed in 2.054 seconds +Vuser 8:Executing Query 11 (22 of 22) +Vuser 4:query 3 completed in 1.907 seconds +Vuser 4:Executing Query 20 (22 of 22) +Vuser 8:query 11 completed in 0.131 seconds +Vuser 8:Completed 2 query set(s) in 74 seconds +Vuser 8:Geometric mean of query times returning rows (22) is 1.57616 +Vuser 8:FINISHED SUCCESS +Vuser 7:query 12 completed in 3.699 seconds +Vuser 7:Completed 2 query set(s) in 76 seconds +Vuser 7:Geometric mean of query times returning rows (22) is 1.67365 +Vuser 7:FINISHED SUCCESS +Vuser 4:query 20 completed in 0.307 seconds +Vuser 4:Completed 2 query set(s) in 77 seconds +Vuser 4:Geometric mean of query times returning rows (22) is 1.63415 +Vuser 4:FINISHED SUCCESS +Vuser 5:query 10 completed in 1.835 seconds +Vuser 5:Executing Query 9 (22 of 22) +Vuser 2:query 21 completed in 8.72 seconds +Vuser 2:Completed 2 query set(s) in 79 seconds +Vuser 2:Geometric mean of query times returning rows (22) is 1.68300 +Vuser 2:FINISHED SUCCESS +Vuser 6:query 21 completed in 7.774 seconds +Vuser 6:Completed 2 query set(s) in 76 seconds +Vuser 6:Geometric mean of query times returning rows (22) is 1.70073 +Vuser 6:FINISHED SUCCESS +Vuser 5:query 9 completed in 2.045 seconds +Vuser 5:Completed 2 query set(s) in 77 seconds +Vuser 5:Geometric mean of query times returning rows (22) is 1.64344 +Vuser 5:FINISHED SUCCESS +ALL VIRTUAL USERS COMPLETE +TPROC-H Driver Script +vudestroy success +TEST SEQUENCE COMPLETE \ No newline at end of file diff --git a/src/VirtualClient/VirtualClient.Actions.UnitTests/HammerDB/HammerDBMetricsParserTests.cs b/src/VirtualClient/VirtualClient.Actions.UnitTests/HammerDB/HammerDBMetricsParserTests.cs index 2902c74400..d59653607f 100644 --- a/src/VirtualClient/VirtualClient.Actions.UnitTests/HammerDB/HammerDBMetricsParserTests.cs +++ b/src/VirtualClient/VirtualClient.Actions.UnitTests/HammerDB/HammerDBMetricsParserTests.cs @@ -1,16 +1,12 @@ namespace VirtualClient.Actions { - using VirtualClient.Common.Contracts; using NUnit.Framework; - using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Reflection; - using System.Text; - using System.Threading.Tasks; + using VirtualClient.Common.Contracts; using VirtualClient.Contracts; - using VirtualClient.Actions; [TestFixture] [Category("Unit")] @@ -19,27 +15,70 @@ public class HammerDBMetricsParserTests private static string examplesDirectory = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "Examples", "HammerDB"); [Test] - public void HammerDBParserVerifyMetrics() + public void PostgreSQLParserThrowIfInvalidOutputFormat() + { + string rawText = File.ReadAllText(Path.Combine(examplesDirectory, "HammerDBIncorrectResultsExample.txt")); + HammerDBMetricsParser testParser = new HammerDBMetricsParser(rawText); + + WorkloadResultsException exception = Assert.Throws(() => testParser.Parse()); + Assert.AreEqual(ErrorReason.InvalidResults, exception.Reason); + } + + [Test] + public void HammerDBParserDetectsTpccBenchmarkAndAggregatesOverallMetrics() { - string rawText = File.ReadAllText(Path.Combine(examplesDirectory, "Results_HammerDB.txt")); + string rawText = File.ReadAllText(Path.Combine(examplesDirectory, "HammerDBMySQL.txt")); HammerDBMetricsParser testParser = new HammerDBMetricsParser(rawText); IList metrics = testParser.Parse(); - Assert.AreEqual(4, metrics.Count); - MetricAssert.Exists(metrics, "Transactions/min", 26163); - MetricAssert.Exists(metrics, "Transactions/sec", 436.05); - MetricAssert.Exists(metrics, "Operations/min", 11400); - MetricAssert.Exists(metrics, "Operations/sec", 190); + Assert.AreEqual("TPCC", testParser.Metadata["Benchmark"]); + + MetricAssert.Exists(metrics, "Operations/sec", 0.18333333333333332d, MetricUnit.OperationsPerSec); + MetricAssert.Exists(metrics, "Transactions/sec", 0.4166666666666667d, MetricUnit.TransactionsPerSec); + + Assert.AreEqual(2, metrics.Count); } [Test] - public void PostgreSQLParserThrowIfInvalidOutputFormat() + public void HammerDBParserDetectsTpchBenchmarkAndAggregatesPerVuserMetrics() { - string rawText = File.ReadAllText(Path.Combine(examplesDirectory, "HammerDBIncorrectResultsExample.txt")); + string rawText = File.ReadAllText(Path.Combine(examplesDirectory, "HammerDBMySQLTPCH.txt")); HammerDBMetricsParser testParser = new HammerDBMetricsParser(rawText); + IList metrics = testParser.Parse(); - WorkloadResultsException exception = Assert.Throws(() => testParser.Parse()); - Assert.AreEqual(ErrorReason.InvalidResults, exception.Reason); + Assert.AreEqual("TPCH", testParser.Metadata["Benchmark"]); + + MetricAssert.Exists(metrics, "Vuser 1 QuerySet1 Duration", 75d, MetricUnit.Seconds); + MetricAssert.Exists(metrics, "Vuser 1 QuerySet1 GeometricMean", 1.62046d, MetricUnit.Seconds); + MetricAssert.Exists(metrics, "Vuser 1 QuerySet2 Duration", 76d, MetricUnit.Seconds); + MetricAssert.Exists(metrics, "Vuser 1 QuerySet2 GeometricMean", 1.6494d, MetricUnit.Seconds); + + MetricAssert.Exists(metrics, "Vuser 2 QuerySet1 Duration", 77d, MetricUnit.Seconds); + MetricAssert.Exists(metrics, "Vuser 2 QuerySet2 Duration", 79d, MetricUnit.Seconds); + MetricAssert.Exists(metrics, "Vuser 2 QuerySet1 GeometricMean", 1.64223d, MetricUnit.Seconds); + MetricAssert.Exists(metrics, "Vuser 2 QuerySet2 GeometricMean", 1.683d, MetricUnit.Seconds); + + Metric allVusersMin = metrics.First(m => m.Name == "AllVusers QueryDurationMin"); + Assert.AreEqual(MetricUnit.Seconds, allVusersMin.Unit); + Assert.That(allVusersMin.Value, Is.GreaterThan(0d)); + + Metric allVusersMax = metrics.First(m => m.Name == "AllVusers QueryDurationMax"); + Assert.AreEqual(MetricUnit.Seconds, allVusersMax.Unit); + Assert.That(allVusersMax.Value, Is.GreaterThan(allVusersMin.Value)); + + Metric allVusersAvg = metrics.First(m => m.Name == "AllVusers QueryDurationAvg"); + Assert.AreEqual(MetricUnit.Seconds, allVusersAvg.Unit); + Assert.That(allVusersAvg.Value, Is.GreaterThan(allVusersMin.Value)); + + Metric allVusersStdev = metrics.First(m => m.Name == "AllVusers QueryDurationStdev"); + Assert.AreEqual(MetricUnit.Seconds, allVusersStdev.Unit); + Assert.That(allVusersStdev.Value, Is.GreaterThan(0d)); + + Metric allVusersP90 = metrics.First(m => m.Name == "AllVusers QueryDurationP90"); + Assert.AreEqual(MetricUnit.Seconds, allVusersP90.Unit); + Assert.That(allVusersP90.Value, Is.GreaterThan(allVusersAvg.Value)); + + Assert.AreEqual(38, metrics.Count); } } } \ No newline at end of file diff --git a/src/VirtualClient/VirtualClient.Actions/HammerDB/HammerDBClientExecutor.cs b/src/VirtualClient/VirtualClient.Actions/HammerDB/HammerDBClientExecutor.cs index 2ef87939b7..f78171ad8b 100644 --- a/src/VirtualClient/VirtualClient.Actions/HammerDB/HammerDBClientExecutor.cs +++ b/src/VirtualClient/VirtualClient.Actions/HammerDB/HammerDBClientExecutor.cs @@ -5,6 +5,7 @@ namespace VirtualClient.Actions { using System; using System.Collections.Generic; + using System.IO; using System.Threading; using System.Threading.Tasks; using Microsoft.Extensions.DependencyInjection; @@ -20,8 +21,6 @@ namespace VirtualClient.Actions /// public class HammerDBClientExecutor : HammerDBExecutor { - private string hammerDBExecutionArguments; - /// /// Initializes a new instance of the class. /// @@ -34,17 +33,6 @@ public HammerDBClientExecutor(IServiceCollection dependencies, IDictionary - /// The total time of execution option passed to HammerDB. - /// - public TimeSpan Duration - { - get - { - return this.Parameters.GetTimeSpanValue(nameof(HammerDBClientExecutor.Duration), TimeSpan.FromMinutes(5)); - } - } - /// /// The retry policy to apply to the client-side execution workflow. /// @@ -116,16 +104,6 @@ await this.ExecuteWorkloadAsync(telemetryContext, cancellationToken) return; } - /// - /// Performs initialization operations for the executor. - /// - protected override async Task InitializeAsync(EventContext telemetryContext, CancellationToken cancellationToken) - { - await base.InitializeAsync(telemetryContext, cancellationToken).ConfigureAwait(false); - - this.hammerDBExecutionArguments = $"--runTransactionsTCLFilePath {this.RunTransactionsTclName}"; - } - private void CaptureMetrics(IProcessProxy process, EventContext telemetryContext, CancellationToken cancellationToken) { if (!cancellationToken.IsCancellationRequested) @@ -149,13 +127,13 @@ private void CaptureMetrics(IProcessProxy process, EventContext telemetryContext this.Logger.LogMetrics( toolName: "HammerDB", scenarioName: this.MetricScenario ?? this.Scenario, - process.StartTime, - process.ExitTime, - metrics, - null, - null, - this.Tags, - telemetryContext); + scenarioStartTime: process.StartTime, + scenarioEndTime: process.ExitTime, + metrics: metrics, + metricCategorization: null, + scenarioArguments: this.HammerDBScenarioArguments, + tags: this.Tags, + eventContext: telemetryContext); } catch (Exception exc) { @@ -172,11 +150,11 @@ private Task ExecuteWorkloadAsync(EventContext telemetryContext, CancellationTok using (BackgroundOperations profiling = BackgroundOperations.BeginProfiling(this, cancellationToken)) { string command = "python3"; - string script = $"{this.HammerDBPackagePath}/run-workload.py"; + string script = Path.Combine(this.HammerDBPackagePath, "run-workload.py"); using (IProcessProxy process = await this.ExecuteCommandAsync( command, - script + " " + this.hammerDBExecutionArguments, + $"{script} --runTransactionsTCLFilePath {this.RunTransactionsTclName}", this.HammerDBPackagePath, telemetryContext, cancellationToken)) diff --git a/src/VirtualClient/VirtualClient.Actions/HammerDB/HammerDBExecutor.cs b/src/VirtualClient/VirtualClient.Actions/HammerDB/HammerDBExecutor.cs index be86aa7046..bb9f8a75f4 100644 --- a/src/VirtualClient/VirtualClient.Actions/HammerDB/HammerDBExecutor.cs +++ b/src/VirtualClient/VirtualClient.Actions/HammerDB/HammerDBExecutor.cs @@ -16,7 +16,6 @@ namespace VirtualClient.Actions using VirtualClient; using VirtualClient.Common; using VirtualClient.Common.Extensions; - using VirtualClient.Common.Platform; using VirtualClient.Common.Telemetry; using VirtualClient.Contracts; @@ -26,6 +25,7 @@ namespace VirtualClient.Actions public class HammerDBExecutor : VirtualClientComponent { private readonly IStateManager stateManager; + private static readonly List Factors = new List { 1, 10, 30, 100, 300, 1000, 3000, 10000, 30000, 100000 }; /// /// Initializes a new instance of the class. @@ -125,14 +125,13 @@ public string WarehouseCount } /// - /// Number of threads. + /// Workload duration. /// - public int? Threads + public TimeSpan Duration { get { - this.Parameters.TryGetValue(nameof(HammerDBClientExecutor.Threads), out IConvertible threads); - return threads?.ToInt32(CultureInfo.InvariantCulture); + return this.Parameters.GetTimeSpanValue(nameof(this.Duration)); } } @@ -148,6 +147,19 @@ public string Workload } } + /// + /// The scale factor option passed to HammerDB (TPCH only). + /// 1 = 1GB, 10 = 10GB, etc. + /// + public string ScaleFactor + { + get + { + this.Parameters.TryGetValue(nameof(HammerDBClientExecutor.ScaleFactor), out IConvertible scaleFactor); + return scaleFactor?.ToString(); + } + } + /// /// The workload option passed to HammerDB. /// @@ -181,6 +193,11 @@ public string SQLServer /// protected string HammerDBPackagePath { get; set; } + /// + /// The true HammerDB scenario arguments used to prepare the database. + /// + protected string HammerDBScenarioArguments { get; set; } + /// /// An interface that can be used to communicate with the underlying system. /// @@ -298,9 +315,8 @@ protected async Task InitializeExecutablesAsync(EventContext telemetryContext, C private async Task PrepareSQLDatabase(EventContext telemetryContext, CancellationToken cancellationToken) { string command = "python3"; - string arguments = $"{this.HammerDBPackagePath}/populate-database.py --createDBTCLPath {this.CreateDBTclName}"; - + using (IProcessProxy process = await this.ExecuteCommandAsync( command, arguments, @@ -318,13 +334,11 @@ private async Task PrepareSQLDatabase(EventContext telemetryContext, Cancellatio private async Task ConfigureCreateHammerDBFile(EventContext telemetryContext, CancellationToken cancellationToken) { - string command = $"python3"; - string arguments = $"{this.HammerDBPackagePath}/configure-workload-generator.py --workload {this.Workload} --sqlServer {this.SQLServer} --port {this.Port}" + - $" --virtualUsers {this.VirtualUsers} --warehouseCount {this.WarehouseCount} --password {this.SuperUserPassword} --dbName {this.DatabaseName} --hostIPAddress {this.ServerIpAddress}"; + this.GenerateCommandLineArguments(); using (IProcessProxy process = await this.ExecuteCommandAsync( - command, - arguments, + $"python3", + this.HammerDBScenarioArguments, this.HammerDBPackagePath, telemetryContext, cancellationToken)) @@ -337,6 +351,31 @@ private async Task ConfigureCreateHammerDBFile(EventContext telemetryContext, Ca } } + private void GenerateCommandLineArguments() + { + string arguments = $"{this.HammerDBPackagePath}/configure-workload-generator.py --workload {this.Workload} --sqlServer {this.SQLServer} --port {this.Port}" + + $" --virtualUsers {this.VirtualUsers} --password {this.SuperUserPassword} --dbName {this.DatabaseName} --hostIPAddress {this.ServerIpAddress}"; + + if (this.Workload.Equals("tpcc", StringComparison.OrdinalIgnoreCase)) + { + arguments += $" --warehouseCount {this.WarehouseCount} --duration {this.Duration.TotalMinutes}"; + } + else if (this.Workload.Equals("tpch", StringComparison.OrdinalIgnoreCase)) + { + if (!Factors.Contains(Convert.ToInt32(this.ScaleFactor))) + { + throw new WorkloadException( + $"The scale factor '{this.ScaleFactor}' is not supported. Supported scale factors include: " + + $"{string.Join(", ", Factors)}", + ErrorReason.InvalidProfileDefinition); + } + + arguments += $" --scaleFactor {this.ScaleFactor} --duration {Math.Round(this.Duration.TotalMinutes / 1.25)}"; + } + + this.HammerDBScenarioArguments = arguments; + } + private static Task OpenFirewallPortsAsync(int port, IFirewallManager firewallManager, CancellationToken cancellationToken) { return firewallManager.EnableInboundConnectionsAsync( diff --git a/src/VirtualClient/VirtualClient.Actions/HammerDB/HammerDBMetricsParser.cs b/src/VirtualClient/VirtualClient.Actions/HammerDB/HammerDBMetricsParser.cs index 48a17b8eef..0f8a46bbcd 100644 --- a/src/VirtualClient/VirtualClient.Actions/HammerDB/HammerDBMetricsParser.cs +++ b/src/VirtualClient/VirtualClient.Actions/HammerDB/HammerDBMetricsParser.cs @@ -6,8 +6,10 @@ namespace VirtualClient.Actions using System; using System.Collections.Generic; using System.Data; + using System.Globalization; using System.Linq; using System.Text.RegularExpressions; + using MathNet.Numerics.Statistics; using VirtualClient; using VirtualClient.Contracts; using DataTableExtensions = VirtualClient.Contracts.DataTableExtensions; @@ -27,6 +29,28 @@ public class HammerDBMetricsParser : MetricsParser /// private static readonly Regex HammerDBDataTableDelimiter = new Regex(@"(\s){2,}", RegexOptions.ExplicitCapture); + /// + /// Regex to detect the benchmark type configured in HammerDB. + /// + private static readonly Regex BenchmarkTypeExpression = new Regex(@"Benchmark set to (?[\w\-]+)\s+for\s+(?.+)", RegexOptions.Compiled | RegexOptions.IgnoreCase); + + /// + /// Regex to capture per-Vuser geometric mean timings. + /// + private static readonly Regex VuserGeometricMeanExpression = new Regex(@"Vuser\s+(?\d+):Geometric mean of query times returning rows\s+\([\d]+\)\s+is\s+(?[\d.]+)", RegexOptions.Compiled | RegexOptions.IgnoreCase); + + /// + /// Regex to capture per-Vuser query set completions. + /// + private static readonly Regex VuserQuerySetExpression = new Regex(@"Vuser\s+(?\d+):Completed\s+(?[\d.]+)\s+query set\(s\)\s+in\s+(?[\d.]+)\s+seconds", RegexOptions.Compiled | RegexOptions.IgnoreCase); + + /// + /// Regex to capture per-Vuser individual query durations. + /// + private static readonly Regex VuserQueryDurationExpression = new Regex(@"Vuser\s+(?\d+):query\s+(?\d+)\s+completed\s+in\s+(?[\d.]+)\s+seconds", RegexOptions.Compiled | RegexOptions.IgnoreCase); + + private HammerDBBenchmark benchmarkType; + /// /// Constructor for /// @@ -36,6 +60,13 @@ public HammerDBMetricsParser(string rawText) { } + private enum HammerDBBenchmark + { + Unknown, + TPCC, + TPCH + } + /// /// Results for PostgreSQL. /// @@ -44,28 +75,50 @@ public HammerDBMetricsParser(string rawText) /// public override IList Parse() { + List metrics = new List(); + try { + this.benchmarkType = this.DetermineBenchmarkType(); + this.Metadata["Benchmark"] = this.benchmarkType.ToString(); + this.Preprocess(); - this.Sections = TextParsingExtensions.Sectionize(this.PreprocessedText, HammerDBSectionDelimiter); - this.ThrowIfInvalidOutputFormat(); - this.CalculateThroughputResult(); - - List metrics = new List(this.HammerDBResult.GetMetrics(nameIndex: 1, valueIndex: 0, metricRelativity: MetricRelativity.HigherIsBetter)); - - metrics.Add(new Metric( - "Operations/sec", - metrics.First(m => m.Name == "Operations/min").Value / 60, - MetricUnit.OperationsPerSec, - relativity: MetricRelativity.HigherIsBetter, - verbosity: 0)); - - metrics.Add(new Metric( - "Transactions/sec", - metrics.First(m => m.Name == "Transactions/min").Value / 60, - MetricUnit.TransactionsPerSec, - relativity: MetricRelativity.HigherIsBetter, - verbosity: 0)); + + if (this.benchmarkType == HammerDBBenchmark.TPCC) + { + this.Sections = TextParsingExtensions.Sectionize(this.PreprocessedText, HammerDBSectionDelimiter); + this.ThrowIfInvalidOutputFormat(); + this.CalculateThroughputResult(); + + List defaultMetrics = new List(this.HammerDBResult.GetMetrics(nameIndex: 1, valueIndex: 0, metricRelativity: MetricRelativity.HigherIsBetter)); + + Metric operationsPerMinute = defaultMetrics.FirstOrDefault(m => string.Equals(m.Name, "Operations/min", StringComparison.OrdinalIgnoreCase)); + if (operationsPerMinute != null) + { + metrics.Add(new Metric( + "Operations/sec", + operationsPerMinute.Value / 60, + MetricUnit.OperationsPerSec, + relativity: MetricRelativity.HigherIsBetter, + verbosity: 0)); + } + + Metric transactionsPerMinute = defaultMetrics.FirstOrDefault(m => string.Equals(m.Name, "Transactions/min", StringComparison.OrdinalIgnoreCase)); + if (transactionsPerMinute != null) + { + metrics.Add(new Metric( + "Transactions/sec", + transactionsPerMinute.Value / 60, + MetricUnit.TransactionsPerSec, + relativity: MetricRelativity.HigherIsBetter, + verbosity: 0)); + } + } + + if (this.benchmarkType == HammerDBBenchmark.TPCH) + { + metrics.AddRange(this.GetTPCHMetrics()); + } return metrics; } @@ -82,7 +135,7 @@ protected override void Preprocess() this.PreprocessedText = Regex.Replace(this.PreprocessedText, $"(\n\r)|(\r\n)", " "); this.PreprocessedText = Regex.Replace(this.PreprocessedText, @"TEST RESULT : System achieved ", $"{Environment.NewLine}{Environment.NewLine}TEST RESULT{Environment.NewLine}"); this.PreprocessedText = Regex.Replace(this.PreprocessedText, @"NOPM from ", $" Operations/min{Environment.NewLine}"); - this.PreprocessedText = Regex.Replace(this.PreprocessedText, @"PostgreSQL TPM", $" Transactions/min{Environment.NewLine}{Environment.NewLine}"); + this.PreprocessedText = Regex.Replace(this.PreprocessedText, @"(PostgreSQL|MySQL) TPM", $" Transactions/min{Environment.NewLine}{Environment.NewLine}"); } private void CalculateThroughputResult() @@ -101,5 +154,187 @@ private void ThrowIfInvalidOutputFormat() throw new SchemaException("The HammerDB output file has incorrect format for parsing"); } } + + private HammerDBBenchmark DetermineBenchmarkType() + { + HammerDBBenchmark benchmark = HammerDBBenchmark.Unknown; + Match match = BenchmarkTypeExpression.Match(this.RawText); + if (match.Success) + { + string normalizedBenchmark = match.Groups["benchmark"].Value.Replace("-", string.Empty).ToUpperInvariant(); + + if (normalizedBenchmark.Contains("TPCH") || normalizedBenchmark.Contains("TPROCH")) + { + benchmark = HammerDBBenchmark.TPCH; + } + else if (normalizedBenchmark.Contains("TPCC") || normalizedBenchmark.Contains("TPROCC")) + { + benchmark = HammerDBBenchmark.TPCC; + } + } + + return benchmark; + } + + private IEnumerable GetTPCHMetrics() + { + List vuserMetrics = new List(); + IDictionary vuserSummaries = new Dictionary(); + + foreach (Match match in VuserQuerySetExpression.Matches(this.RawText)) + { + int vuserId = int.Parse(match.Groups["id"].Value, CultureInfo.InvariantCulture); + HammerDBVuserSummary summary = this.GetOrCreateVuserSummary(vuserSummaries, vuserId); + + int querySetNumber = (int)Math.Round(double.Parse(match.Groups["count"].Value, CultureInfo.InvariantCulture)); + double durationSeconds = double.Parse(match.Groups["duration"].Value, CultureInfo.InvariantCulture); + + summary.QuerySetNumbers.Add(querySetNumber); + summary.QuerySetDurationsByIndex[querySetNumber] = durationSeconds; + } + + foreach (Match match in VuserGeometricMeanExpression.Matches(this.RawText)) + { + int vuserId = int.Parse(match.Groups["id"].Value, CultureInfo.InvariantCulture); + HammerDBVuserSummary summary = this.GetOrCreateVuserSummary(vuserSummaries, vuserId); + + double meanSeconds = double.Parse(match.Groups["mean"].Value, CultureInfo.InvariantCulture); + summary.GeometricMeans.Add(meanSeconds); + + int meanIndex = summary.QuerySetGeometricMeansByIndex.Count; + int querySetNumber = summary.QuerySetNumbers.Count > meanIndex + ? summary.QuerySetNumbers[meanIndex] + : meanIndex + 1; + + summary.QuerySetGeometricMeansByIndex[querySetNumber] = meanSeconds; + } + + foreach (Match match in VuserQueryDurationExpression.Matches(this.RawText)) + { + int vuserId = int.Parse(match.Groups["id"].Value, CultureInfo.InvariantCulture); + HammerDBVuserSummary summary = this.GetOrCreateVuserSummary(vuserSummaries, vuserId); + + double durationSeconds = double.Parse(match.Groups["duration"].Value, CultureInfo.InvariantCulture); + summary.QueryDurationsSeconds.Add(durationSeconds); + } + + foreach (KeyValuePair entry in vuserSummaries.OrderBy(v => v.Key)) + { + int vuserId = entry.Key; + HammerDBVuserSummary summary = entry.Value; + + IDictionary metadata = new Dictionary + { + { "Benchmark", this.benchmarkType.ToString() }, + { "Vuser", vuserId } + }; + + string metricPrefix = $"Vuser {vuserId}"; + + foreach (KeyValuePair entryDuration in summary.QuerySetDurationsByIndex.OrderBy(kvp => kvp.Key)) + { + IDictionary setMetadata = new Dictionary(metadata) + { + { "QuerySet", entryDuration.Key } + }; + + vuserMetrics.Add(new Metric( + $"{metricPrefix} QuerySet{entryDuration.Key} Duration", + entryDuration.Value, + MetricUnit.Seconds, + MetricRelativity.LowerIsBetter, + verbosity: 2, + metadata: setMetadata)); + + if (summary.QuerySetGeometricMeansByIndex.TryGetValue(entryDuration.Key, out double setGeometricMean)) + { + vuserMetrics.Add(new Metric( + $"{metricPrefix} QuerySet{entryDuration.Key} GeometricMean", + setGeometricMean, + MetricUnit.Seconds, + MetricRelativity.LowerIsBetter, + metadata: setMetadata)); + } + } + } + + List allQueryDurations = vuserSummaries.Values.SelectMany(summary => summary.QueryDurationsSeconds).ToList(); + if (allQueryDurations.Count > 0) + { + IDictionary aggregateMetadata = new Dictionary + { + { "Benchmark", this.benchmarkType.ToString() }, + { "Scope", "AllVusers" } + }; + + vuserMetrics.Add(new Metric( + "AllVusers QueryDurationMin", + allQueryDurations.Min(), + MetricUnit.Seconds, + MetricRelativity.LowerIsBetter, + metadata: aggregateMetadata)); + + vuserMetrics.Add(new Metric( + "AllVusers QueryDurationMax", + allQueryDurations.Max(), + MetricUnit.Seconds, + MetricRelativity.LowerIsBetter, + metadata: aggregateMetadata)); + + vuserMetrics.Add(new Metric( + "AllVusers QueryDurationAvg", + allQueryDurations.Average(), + MetricUnit.Seconds, + MetricRelativity.LowerIsBetter, + metadata: aggregateMetadata)); + + vuserMetrics.Add(new Metric( + "AllVusers QueryDurationStdev", + Statistics.StandardDeviation(allQueryDurations), + MetricUnit.Seconds, + MetricRelativity.LowerIsBetter, + metadata: aggregateMetadata)); + + vuserMetrics.Add(new Metric( + "AllVusers QueryDurationP90", + Statistics.Percentile(allQueryDurations, 90), + MetricUnit.Seconds, + MetricRelativity.LowerIsBetter, + metadata: aggregateMetadata)); + + vuserMetrics.Add(new Metric( + "AllVusers QueryDurationP99", + Statistics.Percentile(allQueryDurations, 99), + MetricUnit.Seconds, + MetricRelativity.LowerIsBetter, + metadata: aggregateMetadata)); + } + + return vuserMetrics; + } + + private HammerDBVuserSummary GetOrCreateVuserSummary(IDictionary summaries, int vuserId) + { + if (!summaries.TryGetValue(vuserId, out HammerDBVuserSummary summary)) + { + summary = new HammerDBVuserSummary(); + summaries[vuserId] = summary; + } + + return summary; + } + + private class HammerDBVuserSummary + { + public List QuerySetNumbers { get; } = new List(); + + public Dictionary QuerySetDurationsByIndex { get; } = new Dictionary(); + + public List GeometricMeans { get; } = new List(); + + public Dictionary QuerySetGeometricMeansByIndex { get; } = new Dictionary(); + + public List QueryDurationsSeconds { get; } = new List(); + } } } \ No newline at end of file diff --git a/src/VirtualClient/VirtualClient.Dependencies/MySqlServer/MySqlServerConfiguration.cs b/src/VirtualClient/VirtualClient.Dependencies/MySqlServer/MySqlServerConfiguration.cs index f1dbaeeab9..998201e0f9 100644 --- a/src/VirtualClient/VirtualClient.Dependencies/MySqlServer/MySqlServerConfiguration.cs +++ b/src/VirtualClient/VirtualClient.Dependencies/MySqlServer/MySqlServerConfiguration.cs @@ -91,6 +91,17 @@ public string DiskFilter } } + /// + /// MySQL Admin Username + /// + public string Username + { + get + { + return this.Parameters.GetValue(nameof(this.Username), string.Empty); + } + } + /// /// Database Name to create and utilize /// @@ -217,6 +228,11 @@ private async Task CreateMySQLServerDatabaseAsync(EventContext telemetryContext, arguments += $" --clientIps \"{clientIps}\""; } + if (!string.IsNullOrEmpty(this.Username)) + { + arguments += $" --username {this.Username}"; + } + using (IProcessProxy process = await this.ExecuteCommandAsync( PythonCommand, arguments, @@ -309,11 +325,11 @@ private async Task GetMySQLInnodbDirectoriesAsync(CancellationToken canc this.SystemManager.FileSystem.Directory.CreateDirectory(mysqlPath); } - diskPaths += $"{mysqlPath};"; + diskPaths += $"{mysqlPath}:"; } } - return diskPaths; + return diskPaths.TrimEnd(':'); } private async Task GetMySQLInMemoryCapacityAsync(CancellationToken cancellationToken) diff --git a/src/VirtualClient/VirtualClient.Main/profiles/PERF-MYSQL-HAMMERDB-TPCC.json b/src/VirtualClient/VirtualClient.Main/profiles/PERF-MYSQL-HAMMERDB-TPCC.json new file mode 100644 index 0000000000..a602475694 --- /dev/null +++ b/src/VirtualClient/VirtualClient.Main/profiles/PERF-MYSQL-HAMMERDB-TPCC.json @@ -0,0 +1,171 @@ +{ + "Description": "HammerDB MySQL TPCC Database Server Performance Workload", + "MinimumExecutionInterval": "00:01:00", + "Metadata": { + "RecommendedMinimumExecutionTime": "04:00:00", + "SupportedPlatforms": "linux-x64", + "SupportedOperatingSystems": "Debian,Ubuntu" + }, + "Parameters": { + "DatabaseName": "hammerdb_tpcc", + "DiskFilter": "osdisk:false&sizegreaterthan:256g", + "Port": "3306", + "Duration": "00:20:00", + "VirtualUsers": "{calculate({LogicalCoreCount})}", + "WarehouseCount": "{calculate({SystemMemoryMegabytes} * 15 / 800)}", + "InnodbBufferPoolSize": "{calculate({SystemMemoryBytes} * 80 / 100)}" + }, + "Actions": [ + { + "Type": "HammerDBServerExecutor", + "Parameters": { + "Scenario": "ExecuteServer", + "PackageName": "hammerdb", + "Workload": "tpcc", + "SQLServer": "mysql", + "DatabaseName": "$.Parameters.DatabaseName", + "Port": "$.Parameters.Port", + "VirtualUsers": "$.Parameters.VirtualUsers", + "WarehouseCount": "$.Parameters.WarehouseCount", + "Duration": "$.Parameters.Duration", + "Role": "Server" + } + }, + { + "Type": "HammerDBClientExecutor", + "Parameters": { + "Scenario": "tpcc", + "Workload": "tpcc", + "SQLServer": "mysql", + "PackageName": "hammerdb", + "DatabaseName": "$.Parameters.DatabaseName", + "Port": "$.Parameters.Port", + "VirtualUsers": "$.Parameters.VirtualUsers", + "WarehouseCount": "$.Parameters.WarehouseCount", + "Duration": "$.Parameters.Duration", + "Role": "Client" + } + } + ], + "Dependencies": [ + { + "Type": "FormatDisks", + "Parameters": { + "Scenario": "FormatDisks", + "Role": "Server" + } + }, + { + "Type": "MountDisks", + "Parameters": { + "Scenario": "CreateMountPoints", + "Role": "Server" + } + }, + { + "Type": "LinuxPackageInstallation", + "Parameters": { + "Scenario": "InstallLinuxPackages", + "Packages": "python3,libmysqlclient-dev" + } + }, + { + "Type": "DependencyPackageInstallation", + "Parameters": { + "Scenario": "DownloadMySqlServerPackage", + "BlobContainer": "packages", + "BlobName": "mysql.8.0.36.rev4.zip", + "PackageName": "mysql-server", + "Extract": true, + "Role": "Server" + } + }, + { + "Type": "DependencyPackageInstallation", + "Parameters": { + "Scenario": "DownloadHammerDBPackage", + "BlobContainer": "packages", + "BlobName": "hammerdb.4.12.0.rev3.zip", + "PackageName": "hammerdb", + "Extract": true + } + }, + { + "Type": "MySQLServerInstallation", + "Parameters": { + "Scenario": "InstallMySQLServer", + "Action": "InstallServer", + "Benchmark": "TPCC", + "PackageName": "mysql-server", + "Role": "Server" + } + }, + { + "Type": "MySQLServerConfiguration", + "Parameters": { + "Scenario": "ConfigureMySQLServer", + "Action": "ConfigureServer", + "Benchmark": "TPCC", + "DiskFilter": "$.Parameters.DiskFilter", + "PackageName": "mysql-server", + "Role": "Server" + } + }, + { + "Type": "MySQLServerConfiguration", + "Parameters": { + "Scenario": "SetMySQLGlobalVariables", + "Action": "SetGlobalVariables", + "Benchmark": "TPCC", + "InnodbBufferPoolSize": "$.Parameters.InnodbBufferPoolSize", + "Variables": "MAX_PREPARED_STMT_COUNT=1000000;MAX_CONNECTIONS=100000;innodb_buffer_pool_size={InnodbBufferPoolSize};innodb_lock_wait_timeout=300;innodb_io_capacity=10000;innodb_io_capacity_max=10000;innodb_buffer_pool_dump_at_shutdown=OFF;innodb_change_buffering=0;table_open_cache=20000;", + "PackageName": "mysql-server", + "Role": "Server" + } + }, + { + "Type": "MySQLServerConfiguration", + "Parameters": { + "Scenario": "CreateMySQLDatabase", + "Action": "CreateDatabase", + "Benchmark": "TPCC", + "DatabaseName": "$.Parameters.DatabaseName", + "PackageName": "mysql-server", + "Role": "Server" + } + }, + { + "Type": "HammerDBExecutor", + "Parameters": { + "Scenario": "PopulateMySQLDatabase", + "DatabaseName": "$.Parameters.DatabaseName", + "Workload": "tpcc", + "SQLServer": "mysql", + "PackageName": "hammerdb", + "VirtualUsers": "$.Parameters.VirtualUsers", + "WarehouseCount": "$.Parameters.WarehouseCount", + "Port": "$.Parameters.Port", + "Duration": "$.Parameters.Duration", + "Role": "Server" + } + }, + { + "Type": "MySQLServerConfiguration", + "Parameters": { + "Scenario": "DistributeMySQLDatabase", + "Action": "DistributeDatabase", + "DatabaseName": "$.Parameters.DatabaseName", + "DiskFilter": "$.Parameters.DiskFilter", + "PackageName": "mysql-server", + "Role": "Server" + } + }, + { + "Type": "ApiServer", + "Parameters": { + "Scenario": "StartAPIServer", + "Role": "Server" + } + } + ] +} \ No newline at end of file diff --git a/src/VirtualClient/VirtualClient.Main/profiles/PERF-MYSQL-HAMMERDB-TPCH.json b/src/VirtualClient/VirtualClient.Main/profiles/PERF-MYSQL-HAMMERDB-TPCH.json new file mode 100644 index 0000000000..a2a3253fa5 --- /dev/null +++ b/src/VirtualClient/VirtualClient.Main/profiles/PERF-MYSQL-HAMMERDB-TPCH.json @@ -0,0 +1,171 @@ +{ + "Description": "HammerDB MySQL TPCH Database Server Performance Workload", + "MinimumExecutionInterval": "00:01:00", + "Metadata": { + "RecommendedMinimumExecutionTime": "04:00:00", + "SupportedPlatforms": "linux-x64", + "SupportedOperatingSystems": "Debian,Ubuntu" + }, + "Parameters": { + "DatabaseName": "hammerdb_tpch", + "DiskFilter": "osdisk:false&sizegreaterthan:256g", + "Port": "3306", + "Duration": "00:20:00", + "VirtualUsers": "{calculate({LogicalCoreCount})}", + "ScaleFactor": "10", + "InnodbBufferPoolSize": "{calculate({SystemMemoryBytes} * 80 / 100)}" + }, + "Actions": [ + { + "Type": "HammerDBServerExecutor", + "Parameters": { + "Scenario": "ExecuteServer", + "PackageName": "hammerdb", + "Workload": "tpch", + "SQLServer": "mysql", + "DatabaseName": "$.Parameters.DatabaseName", + "Duration": "$.Parameters.Duration", + "Port": "$.Parameters.Port", + "VirtualUsers": "$.Parameters.VirtualUsers", + "ScaleFactor": "$.Parameters.ScaleFactor", + "Role": "Server" + } + }, + { + "Type": "HammerDBClientExecutor", + "Parameters": { + "Scenario": "tpch", + "Workload": "tpch", + "SQLServer": "mysql", + "PackageName": "hammerdb", + "Duration": "$.Parameters.Duration", + "DatabaseName": "$.Parameters.DatabaseName", + "Port": "$.Parameters.Port", + "VirtualUsers": "$.Parameters.VirtualUsers", + "ScaleFactor": "$.Parameters.ScaleFactor", + "Role": "Client" + } + } + ], + "Dependencies": [ + { + "Type": "FormatDisks", + "Parameters": { + "Scenario": "FormatDisks", + "Role": "Server" + } + }, + { + "Type": "MountDisks", + "Parameters": { + "Scenario": "CreateMountPoints", + "Role": "Server" + } + }, + { + "Type": "LinuxPackageInstallation", + "Parameters": { + "Scenario": "InstallLinuxPackages", + "Packages": "python3,libmysqlclient-dev" + } + }, + { + "Type": "DependencyPackageInstallation", + "Parameters": { + "Scenario": "DownloadMySqlServerPackage", + "BlobContainer": "packages", + "BlobName": "mysql.8.0.36.rev4.zip", + "PackageName": "mysql-server", + "Extract": true, + "Role": "Server" + } + }, + { + "Type": "DependencyPackageInstallation", + "Parameters": { + "Scenario": "DownloadHammerDBPackage", + "BlobContainer": "packages", + "BlobName": "hammerdb.4.12.0.rev3.zip", + "PackageName": "hammerdb", + "Extract": true + } + }, + { + "Type": "MySQLServerInstallation", + "Parameters": { + "Scenario": "InstallMySQLServer", + "Action": "InstallServer", + "Benchmark": "TPCH", + "PackageName": "mysql-server", + "Role": "Server" + } + }, + { + "Type": "MySQLServerConfiguration", + "Parameters": { + "Scenario": "ConfigureMySQLServer", + "Action": "ConfigureServer", + "Benchmark": "TPCH", + "DiskFilter": "$.Parameters.DiskFilter", + "PackageName": "mysql-server", + "Role": "Server" + } + }, + { + "Type": "MySQLServerConfiguration", + "Parameters": { + "Scenario": "SetMySQLGlobalVariables", + "Action": "SetGlobalVariables", + "Benchmark": "TPCH", + "InnodbBufferPoolSize": "$.Parameters.InnodbBufferPoolSize", + "Variables": "MAX_PREPARED_STMT_COUNT=1000000;MAX_CONNECTIONS=100000;innodb_buffer_pool_size={InnodbBufferPoolSize};innodb_lock_wait_timeout=300;innodb_io_capacity=10000;innodb_io_capacity_max=10000;innodb_buffer_pool_dump_at_shutdown=OFF;innodb_change_buffering=0;table_open_cache=20000;", + "PackageName": "mysql-server", + "Role": "Server" + } + }, + { + "Type": "MySQLServerConfiguration", + "Parameters": { + "Scenario": "CreateMySQLDatabase", + "Action": "CreateDatabase", + "Benchmark": "TPCH", + "DatabaseName": "$.Parameters.DatabaseName", + "PackageName": "mysql-server", + "Role": "Server" + } + }, + { + "Type": "HammerDBExecutor", + "Parameters": { + "Scenario": "PopulateMySQLDatabase", + "DatabaseName": "$.Parameters.DatabaseName", + "Workload": "tpch", + "SQLServer": "mysql", + "PackageName": "hammerdb", + "VirtualUsers": "$.Parameters.VirtualUsers", + "ScaleFactor": "$.Parameters.ScaleFactor", + "Port": "$.Parameters.Port", + "Duration": "$.Parameters.Duration", + "Role": "Server" + } + }, + { + "Type": "MySQLServerConfiguration", + "Parameters": { + "Scenario": "DistributeMySQLDatabase", + "Action": "DistributeDatabase", + "DatabaseName": "$.Parameters.DatabaseName", + "DiskFilter": "$.Parameters.DiskFilter", + "PackageName": "mysql-server", + "Role": "Server" + } + }, + { + "Type": "ApiServer", + "Parameters": { + "Scenario": "StartAPIServer", + "Role": "Server" + } + } + ] +} \ No newline at end of file diff --git a/src/VirtualClient/VirtualClient.Main/profiles/PERF-POSTGRESQL-HAMMERDB-TPCC.json b/src/VirtualClient/VirtualClient.Main/profiles/PERF-POSTGRESQL-HAMMERDB-TPCC.json index 4f0378e86f..ddac9d45a8 100644 --- a/src/VirtualClient/VirtualClient.Main/profiles/PERF-POSTGRESQL-HAMMERDB-TPCC.json +++ b/src/VirtualClient/VirtualClient.Main/profiles/PERF-POSTGRESQL-HAMMERDB-TPCC.json @@ -10,6 +10,7 @@ "DatabaseName": "hammerdb_tpcc", "DiskFilter": "osdisk:false&sizegreaterthan:256g", "Port": "5432", + "Duration": "00:20:00", "VirtualUsers": "{calculate({LogicalCoreCount})}", "WarehouseCount": "{calculate({SystemMemoryMegabytes} * 15 / 800)}", "SharedMemoryBuffer": "{calculate({SystemMemoryMegabytes} * 85 / 100)}" @@ -20,12 +21,13 @@ "Parameters": { "Scenario": "ExecuteServer", "PackageName": "hammerdb", - "DatabaseName": "$.Parameters.DatabaseName", "Workload": "tpcc", "SQLServer": "postgresql", + "DatabaseName": "$.Parameters.DatabaseName", "Port": "$.Parameters.Port", "VirtualUsers": "$.Parameters.VirtualUsers", "WarehouseCount": "$.Parameters.WarehouseCount", + "Duration": "$.Parameters.Duration", "Role": "Server" } }, @@ -40,6 +42,7 @@ "Port": "$.Parameters.Port", "VirtualUsers": "$.Parameters.VirtualUsers", "WarehouseCount": "$.Parameters.WarehouseCount", + "Duration": "$.Parameters.Duration", "Role": "Client" } } @@ -81,7 +84,7 @@ "Parameters": { "Scenario": "DownloadHammerDBPackage", "BlobContainer": "packages", - "BlobName": "hammerdb.4.7.0.rev1.zip", + "BlobName": "hammerdb.4.12.0.rev3.zip", "PackageName": "hammerdb", "Extract": true } @@ -117,6 +120,7 @@ "VirtualUsers": 1, "WarehouseCount": 1, "Port": "$.Parameters.Port", + "Duration": "$.Parameters.Duration", "Role": "Server" } }, @@ -143,6 +147,7 @@ "VirtualUsers": "$.Parameters.VirtualUsers", "WarehouseCount": "$.Parameters.WarehouseCount", "Port": "$.Parameters.Port", + "Duration": "$.Parameters.Duration", "Role": "Server" } }, diff --git a/src/VirtualClient/VirtualClient.Main/profiles/PERF-POSTGRESQL-HAMMERDB-TPCH.json b/src/VirtualClient/VirtualClient.Main/profiles/PERF-POSTGRESQL-HAMMERDB-TPCH.json new file mode 100644 index 0000000000..6e69b224ee --- /dev/null +++ b/src/VirtualClient/VirtualClient.Main/profiles/PERF-POSTGRESQL-HAMMERDB-TPCH.json @@ -0,0 +1,162 @@ +{ + "Description": "HammerDB PostgreSQL TPCH Database Server Performance Workload", + "MinimumExecutionInterval": "00:01:00", + "Metadata": { + "RecommendedMinimumExecutionTime": "04:00:00", + "SupportedPlatforms": "linux-x64", + "SupportedOperatingSystems": "Debian,Ubuntu" + }, + "Parameters": { + "DatabaseName": "hammerdb_tpch", + "DiskFilter": "osdisk:false&sizegreaterthan:256g", + "Port": "5432", + "Duration": "00:20:00", + "VirtualUsers": "{calculate({LogicalCoreCount})}", + "ScaleFactor": "10", + "SharedMemoryBuffer": "{calculate({SystemMemoryMegabytes} * 85 / 100)}" + }, + "Actions": [ + { + "Type": "HammerDBServerExecutor", + "Parameters": { + "Scenario": "ExecuteServer", + "PackageName": "hammerdb", + "Workload": "tpch", + "SQLServer": "postgresql", + "DatabaseName": "$.Parameters.DatabaseName", + "Port": "$.Parameters.Port", + "VirtualUsers": "$.Parameters.VirtualUsers", + "ScaleFactor": "$.Parameters.ScaleFactor", + "Duration": "$.Parameters.Duration", + "Role": "Server" + } + }, + { + "Type": "HammerDBClientExecutor", + "Parameters": { + "Scenario": "tpch", + "Workload": "tpch", + "SQLServer": "postgresql", + "PackageName": "hammerdb", + "DatabaseName": "$.Parameters.DatabaseName", + "Port": "$.Parameters.Port", + "VirtualUsers": "$.Parameters.VirtualUsers", + "ScaleFactor": "$.Parameters.ScaleFactor", + "Duration": "$.Parameters.Duration", + "Role": "Client" + } + } + ], + "Dependencies": [ + { + "Type": "FormatDisks", + "Parameters": { + "Scenario": "FormatDisks", + "Role": "Server" + } + }, + { + "Type": "MountDisks", + "Parameters": { + "Scenario": "CreateMountPoints", + "Role": "Server" + } + }, + { + "Type": "LinuxPackageInstallation", + "Parameters": { + "Scenario": "InstallLinuxPackages", + "Packages": "python3" + } + }, + { + "Type": "DependencyPackageInstallation", + "Parameters": { + "Scenario": "DownloadPostgreSQLPackage", + "BlobContainer": "packages", + "BlobName": "postgresql.14.0.0.rev3.zip", + "PackageName": "postgresql", + "Extract": true + } + }, + { + "Type": "DependencyPackageInstallation", + "Parameters": { + "Scenario": "DownloadHammerDBPackage", + "BlobContainer": "packages", + "BlobName": "hammerdb.4.12.0.rev3.zip", + "PackageName": "hammerdb", + "Extract": true + } + }, + { + "Type": "PostgreSQLServerInstallation", + "Parameters": { + "Scenario": "InstallPostgreSQLServer", + "Action": "InstallServer", + "PackageName": "postgresql" + } + }, + { + "Type": "PostgreSQLServerConfiguration", + "Parameters": { + "Scenario": "ConfigurePostgreSQLServer", + "Action": "ConfigureServer", + "PackageName": "postgresql", + "Role": "Server", + "DatabaseName": "$.Parameters.DatabaseName", + "Port": "$.Parameters.Port", + "SharedMemoryBuffer": "$.Parameters.SharedMemoryBuffer" + } + }, + { + "Type": "HammerDBExecutor", + "Parameters": { + "Scenario": "CreatePostgreSQLDatabase", + "DatabaseName": "$.Parameters.DatabaseName", + "Workload": "tpch", + "SQLServer": "postgresql", + "PackageName": "hammerdb", + "VirtualUsers": 1, + "ScaleFactor": 1, + "Port": "$.Parameters.Port", + "Duration": "$.Parameters.Duration", + "Role": "Server" + } + }, + { + "Type": "PostgreSQLServerConfiguration", + "Parameters": { + "Scenario": "DistributePostgreSQLDatabase", + "Action": "DistributeDatabase", + "DatabaseName": "$.Parameters.DatabaseName", + "DiskFilter": "$.Parameters.DiskFilter", + "PackageName": "postgresql", + "Port": "$.Parameters.Port", + "Role": "Server" + } + }, + { + "Type": "HammerDBExecutor", + "Parameters": { + "Scenario": "PopulatePostgreSQLDatabase", + "DatabaseName": "$.Parameters.DatabaseName", + "Workload": "tpch", + "SQLServer": "postgresql", + "PackageName": "hammerdb", + "VirtualUsers": "$.Parameters.VirtualUsers", + "ScaleFactor": "$.Parameters.ScaleFactor", + "Port": "$.Parameters.Port", + "Duration": "$.Parameters.Duration", + "Role": "Server" + } + }, + { + "Type": "ApiServer", + "Parameters": { + "Scenario": "StartAPIServer", + "Role": "Server" + } + } + ] +} \ No newline at end of file From d28e792ee5c2331febb9e819ccb65f6d38838ee3 Mon Sep 17 00:00:00 2001 From: Erica Vellanoweth Date: Mon, 8 Dec 2025 16:02:05 -0800 Subject: [PATCH 2/2] fixing tests --- .../HammerDB/HammeDBServerExecutorTests.cs | 2 ++ .../HammerDB/HammerDBClientExecutorTests.cs | 23 +++++++++---------- .../HammerDB/HammerDBClientExecutor.cs | 2 +- .../HammerDB/HammerDBExecutor.cs | 4 ++-- .../MySQLServerConfigurationTests.cs | 6 ++--- 5 files changed, 19 insertions(+), 18 deletions(-) diff --git a/src/VirtualClient/VirtualClient.Actions.UnitTests/HammerDB/HammeDBServerExecutorTests.cs b/src/VirtualClient/VirtualClient.Actions.UnitTests/HammerDB/HammeDBServerExecutorTests.cs index b5446e82e6..1e54063c02 100644 --- a/src/VirtualClient/VirtualClient.Actions.UnitTests/HammerDB/HammeDBServerExecutorTests.cs +++ b/src/VirtualClient/VirtualClient.Actions.UnitTests/HammerDB/HammeDBServerExecutorTests.cs @@ -99,6 +99,8 @@ public void SetupDefaultBehavior(PlatformID platform, Architecture architecture) this.fixture.Parameters["PackageName"] = "hammerdb"; this.fixture.Parameters["Port"] = 5432; this.fixture.Parameters["DatabaseName"] = "hammerdbtest"; + this.fixture.Parameters["Duration"] = "00:01:00"; + this.fixture.Parameters["Workload"] = "TPCC"; } private class TestHammerDBServerExecutor : HammerDBServerExecutor diff --git a/src/VirtualClient/VirtualClient.Actions.UnitTests/HammerDB/HammerDBClientExecutorTests.cs b/src/VirtualClient/VirtualClient.Actions.UnitTests/HammerDB/HammerDBClientExecutorTests.cs index e3867cc412..d6dd276d03 100644 --- a/src/VirtualClient/VirtualClient.Actions.UnitTests/HammerDB/HammerDBClientExecutorTests.cs +++ b/src/VirtualClient/VirtualClient.Actions.UnitTests/HammerDB/HammerDBClientExecutorTests.cs @@ -44,22 +44,20 @@ public async Task HammerDBClientExecutorRunsTheExpectedWorkloadCommand(PlatformI { this.SetupDefaultBehavior(platform, architecture); - string tempPackagePath; - - if (platform == PlatformID.Win32NT) + string[] expectedCommands = { - tempPackagePath = this.mockPackagePath.Replace(@"\", @"\\"); - } - else + $"python3 {this.fixture.PlatformSpecifics.Combine(this.mockPackagePath, "configure-workload-generator.py")} --workload tpcc --sqlServer postgresql --port 5432 --virtualUsers 1 --password [A-Za-z0-9+/=]+ --dbName hammerdbtest --hostIPAddress [0-9.]+ --warehouseCount 1 --duration 1", + $"python3 {this.fixture.PlatformSpecifics.Combine(this.mockPackagePath, "run-workload.py")} --runTransactionsTCLFilePath runTransactions.tcl" + }; + + if (this.fixture.Platform == PlatformID.Win32NT) { - tempPackagePath = this.mockPackagePath; + for (int i = 0; i < expectedCommands.Length; i++) + { + expectedCommands[i] = expectedCommands[i].Replace(@"\", @"\\"); + } } - string[] expectedCommands = - { - $"python3 {tempPackagePath}/configure-workload-generator.py --workload tpcc --sqlServer postgresql --port 5432 --virtualUsers 1 --warehouseCount 1 --password [A-Za-z0-9+/=]+ --dbName hammerdbtest --hostIPAddress [0-9.]+", - $"python3 {tempPackagePath}/run-workload.py --runTransactionsTCLFilePath runTransactions.tcl" - }; int commandNumber = 0; this.fixture.ProcessManager.OnCreateProcess = (exe, arguments, workingDir) => { @@ -107,6 +105,7 @@ public void SetupDefaultBehavior(PlatformID platform, Architecture architecture) { nameof(HammerDBClientExecutor.SQLServer), "postgresql" }, { nameof(HammerDBClientExecutor.VirtualUsers), "1"}, { nameof(HammerDBClientExecutor.WarehouseCount), "1"}, + { nameof(HammerDBClientExecutor.Duration), "00:01:00" }, { "ServerIpAddress", "localhost"}, { nameof(HammerDBClientExecutor.PackageName), "hammerdb" }, }; diff --git a/src/VirtualClient/VirtualClient.Actions/HammerDB/HammerDBClientExecutor.cs b/src/VirtualClient/VirtualClient.Actions/HammerDB/HammerDBClientExecutor.cs index f78171ad8b..579821edfe 100644 --- a/src/VirtualClient/VirtualClient.Actions/HammerDB/HammerDBClientExecutor.cs +++ b/src/VirtualClient/VirtualClient.Actions/HammerDB/HammerDBClientExecutor.cs @@ -150,7 +150,7 @@ private Task ExecuteWorkloadAsync(EventContext telemetryContext, CancellationTok using (BackgroundOperations profiling = BackgroundOperations.BeginProfiling(this, cancellationToken)) { string command = "python3"; - string script = Path.Combine(this.HammerDBPackagePath, "run-workload.py"); + string script = this.PlatformSpecifics.Combine(this.HammerDBPackagePath, "run-workload.py"); using (IProcessProxy process = await this.ExecuteCommandAsync( command, diff --git a/src/VirtualClient/VirtualClient.Actions/HammerDB/HammerDBExecutor.cs b/src/VirtualClient/VirtualClient.Actions/HammerDB/HammerDBExecutor.cs index bb9f8a75f4..32260d9694 100644 --- a/src/VirtualClient/VirtualClient.Actions/HammerDB/HammerDBExecutor.cs +++ b/src/VirtualClient/VirtualClient.Actions/HammerDB/HammerDBExecutor.cs @@ -315,7 +315,7 @@ protected async Task InitializeExecutablesAsync(EventContext telemetryContext, C private async Task PrepareSQLDatabase(EventContext telemetryContext, CancellationToken cancellationToken) { string command = "python3"; - string arguments = $"{this.HammerDBPackagePath}/populate-database.py --createDBTCLPath {this.CreateDBTclName}"; + string arguments = $"{this.PlatformSpecifics.Combine(this.HammerDBPackagePath, "populate-database.py")} --createDBTCLPath {this.CreateDBTclName}"; using (IProcessProxy process = await this.ExecuteCommandAsync( command, @@ -353,7 +353,7 @@ private async Task ConfigureCreateHammerDBFile(EventContext telemetryContext, Ca private void GenerateCommandLineArguments() { - string arguments = $"{this.HammerDBPackagePath}/configure-workload-generator.py --workload {this.Workload} --sqlServer {this.SQLServer} --port {this.Port}" + + string arguments = $"{this.PlatformSpecifics.Combine(this.HammerDBPackagePath, "configure-workload-generator.py")} --workload {this.Workload} --sqlServer {this.SQLServer} --port {this.Port}" + $" --virtualUsers {this.VirtualUsers} --password {this.SuperUserPassword} --dbName {this.DatabaseName} --hostIPAddress {this.ServerIpAddress}"; if (this.Workload.Equals("tpcc", StringComparison.OrdinalIgnoreCase)) diff --git a/src/VirtualClient/VirtualClient.Dependencies.UnitTests/MySqlServer/MySQLServerConfigurationTests.cs b/src/VirtualClient/VirtualClient.Dependencies.UnitTests/MySqlServer/MySQLServerConfigurationTests.cs index 49d2266a6b..a8e7e74f98 100644 --- a/src/VirtualClient/VirtualClient.Dependencies.UnitTests/MySqlServer/MySQLServerConfigurationTests.cs +++ b/src/VirtualClient/VirtualClient.Dependencies.UnitTests/MySqlServer/MySQLServerConfigurationTests.cs @@ -58,7 +58,7 @@ public async Task MySQLConfigurationExecutesTheExpectedProcessForConfigureServer string[] expectedCommands = { - $"python3 {this.packagePath}/configure.py --serverIp 1.2.3.4 --innoDbDirs \"/home/user/mnt_dev_sdc1/mysql;/home/user/mnt_dev_sdd1/mysql;/home/user/mnt_dev_sde1/mysql;\"", + $"python3 {this.packagePath}/configure.py --serverIp 1.2.3.4 --innoDbDirs \"/home/user/mnt_dev_sdc1/mysql:/home/user/mnt_dev_sdd1/mysql:/home/user/mnt_dev_sde1/mysql\"", }; int commandNumber = 0; @@ -115,7 +115,7 @@ public async Task MySQLConfigurationExecutesTheExpectedProcessForConfigureServer string[] expectedCommands = { - $"python3 {this.packagePath}/configure.py --serverIp 1.2.3.4 --innoDbDirs \"/home/user/mnt_dev_sdc1/mysql;/home/user/mnt_dev_sdd1/mysql;/home/user/mnt_dev_sde1/mysql;\" " + + $"python3 {this.packagePath}/configure.py --serverIp 1.2.3.4 --innoDbDirs \"/home/user/mnt_dev_sdc1/mysql:/home/user/mnt_dev_sdd1/mysql:/home/user/mnt_dev_sde1/mysql\" " + $"--inMemory 8192", }; @@ -326,7 +326,7 @@ public async Task MySQLConfigurationExecutesTheExpectedProcessForDistributeDatab string[] expectedCommands = { - $"python3 {this.packagePath}/distribute-database.py --dbName mysql-test --directories \"/home/user/mnt_dev_sdc1/mysql;/home/user/mnt_dev_sdd1/mysql;/home/user/mnt_dev_sde1/mysql;\"", + $"python3 {this.packagePath}/distribute-database.py --dbName mysql-test --directories \"/home/user/mnt_dev_sdc1/mysql:/home/user/mnt_dev_sdd1/mysql:/home/user/mnt_dev_sde1/mysql\"", }; int commandNumber = 0;