2
# -*- mode: python; indent-tabs-mode: nil; -*-
3
# vim:expandtab:shiftwidth=2:tabstop=2:smarttab:
5
# Copyright (C) 2011 Patrick Crews
6
# Copyright (C) 2012 Sharan Kumar
9
# This program is free software; you can redistribute it and/or modify
10
# it under the terms of the GNU General Public License as published by
11
# the Free Software Foundation; either version 2 of the License, or
12
# (at your option) any later version.
14
# This program is distributed in the hope that it will be useful,
15
# but WITHOUT ANY WARRANTY; without even the implied warranty of
16
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17
# GNU General Public License for more details.
19
# You should have received a copy of the GNU General Public License
20
# along with this program; if not, write to the Free Software
21
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
28
from lib.util.drizzleslap_methods import prepare_drizzleslap
29
from lib.util.drizzleslap_methods import execute_drizzleslap
30
from lib.util.drizzleslap_methods import process_drizzleslap_output
31
from lib.util.mysqlBaseTestCase import mysqlBaseTestCase
32
from lib.util.database_connect import results_db_connect
33
from lib.util.mailing_report import kewpieSendMail
34
from lib.opts.test_run_options import parse_qp_options
36
# TODO: make server_options vary depending on the type of server being used here
38
#server_requirements = [['innodb.buffer-pool-size=256M innodb.log-file-size=64M innodb.log-buffer-size=8M innodb.thread-concurrency=0 innodb.additional-mem-pool-size=16M table-open-cache=4096 table-definition-cache=4096 mysql-protocol.max-connections=2048']]
40
#server_requirements = [['innodb_buffer_pool_size=256M innodb_log_file_size=64M innodb_log_buffer_size=8M innodb_thread_concurrency=0 innodb_additional_mem_pool_size=16M table_open_cache=4096 table_definition_cache=4096 max_connections=2048']]
41
server_requirements = [[]]
46
class basicTest(mysqlBaseTestCase):
48
def test_drizzleslap(self):
49
self.logging = test_executor.logging
50
master_server = servers[0]
53
test_groups = ['guid','guid-scale',
55
'mixed','mixed-commit','mixed-commit-scale','mixed-scale',
57
'update','update-commit','update-commit-scale','update-scale',
58
'write','write-commit','write-commit-scale','write-scale']
60
# test options specific to each test group
61
test_options = {'guid':" --auto-generate-sql-guid-primary --auto-generate-sql-load-type=write --number-of-queries=100000",
62
'guid-scale':" --auto-generate-sql-guid-primary --auto-generate-sql-load-type=write --auto-generate-sql-execute-number=1000",
63
'key':"--auto-generate-sql-add-autoincrement --auto-generate-sql-load-type=key --number-of-queries=100000",
64
'key-scale':"--auto-generate-sql-add-autoincrement --auto-generate-sql-load-type=key --auto-generate-sql-execute-number=1000",
65
'mixed':" --auto-generate-sql-add-autoincrement --auto-generate-sql-load-type=mixed --number-of-queries=100000",
66
'mixed-commit':" --auto-generate-sql-add-autoincrement --auto-generate-sql-load-type=mixed --number-of-queries=100000 --commit=8",
67
'mixed-commit-scale':" --auto-generate-sql-add-autoincrement --auto-generate-sql-load-type=mixed --auto-generate-sql-execute-number=1000 --commit=8",
68
'mixed-scale':" --auto-generate-sql-add-autoincrement --auto-generate-sql-load-type=mixed --auto-generate-sql-execute-number=1000",
69
'scan':" --auto-generate-sql-add-autoincrement --auto-generate-sql-load-type=read --number-of-queries=100000",
70
'scan-scale':" --auto-generate-sql-add-autoincrement --auto-generate-sql-load-type=read --auto-generate-sql-execute-number=1000",
71
'update':" --auto-generate-sql-add-autoincrement --auto-generate-sql-load-type=update --number-of-queries=100000 --auto-generate-sql-write-number=50000",
72
'update-commit':" --auto-generate-sql-add-autoincrement --auto-generate-sql-load-type=update --number-of-queries=100000 --auto-generate-sql-write-number=50000 --commit=8 ",
73
'update-commit-scale':" --auto-generate-sql-add-autoincrement --auto-generate-sql-load-type=update --auto-generate-sql-execute-number=1000 --auto-generate-sql-write-number=50000 --commit=8 ",
74
'update-scale':" --auto-generate-sql-add-autoincrement --auto-generate-sql-load-type=update --auto-generate-sql-execute-number=1000 --auto-generate-sql-write-number=50000",
75
'write':"--auto-generate-sql-add-autoincrement --auto-generate-sql-load-type=write --number-of-queries=100000",
76
'write-commit':" --auto-generate-sql-add-autoincrement --auto-generate-sql-load-type=write --number-of-queries=100000 --commit=8",
77
'write-commit-scale':"--auto-generate-sql-add-autoincrement --auto-generate-sql-load-type=write --auto-generate-sql-execute-number=1000 --commit=8 ",
78
'write-scale':" --auto-generate-sql-add-autoincrement --auto-generate-sql-load-type=write --auto-generate-sql-execute-number=1000"
81
# our base test command
82
test_cmd = [ "drizzleslap_tests"
83
, "--%s-table-engine=innodb" %master_server.type
84
, "--%s-user=root" %master_server.type
85
, "--%s-db=test" %master_server.type
86
, "--%s-port=%d" %(master_server.type, master_server.master_port)
87
, "--%s-host=localhost" %master_server.type
88
, "--db-driver=%s" %master_server.type
91
if master_server.type == 'drizzle':
92
test_cmd.append("--drizzle-mysql=on")
93
if master_server.type == 'mysql':
94
test_cmd.append("--mysql-socket=%s" %master_server.socket_file)
96
# We sleep for a minute to wait
98
# how many times to run drizzleslap at each concurrency
101
# setting concurreny for drizzleslap. This concurrency is fixed
105
# we setup once. This is a readwrite test and we don't
106
# alter the test bed once it is created
107
exec_cmd = " ".join(test_cmd)
108
retcode, output = prepare_drizzleslap(test_executor, exec_cmd)
109
err_msg = ("drizzleslap 'prepare' phase failed.\n"
111
"output: %s" %(retcode,output))
112
self.assertEqual(retcode, 0, msg = err_msg)
115
for concurrency in concurrencies:
117
for group in test_groups:
118
exec_cmd = " ".join(test_cmd)
119
exec_cmd = exec_cmd.join(test_options[group])
120
exec_cmd += "--num-threads=%d" %concurrency
122
for test_iteration in range(iterations):
124
retcode, output = execute_drizzleslap(test_executor, exec_cmd)
125
self.assertEqual(retcode, 0, msg = output)
126
parsed_output = process_drizzleslap_output(output)
127
self.logging.info(parsed_output)
129
#gathering the data from the output
132
'run_id':re.compile()
133
, 'engine_name':re.compile()
134
, 'test_name':re.compile()
135
, 'queries_average':re.compile()
136
, 'queries_min':re.compile()
137
, 'queries_max':re.compile()
138
, 'total_time':re.compile()
139
, 'stddev':re.compile()
140
, 'iterations':re.compile()
141
, 'concurrency':re.compile()
142
, 'concurrency2':re.compile()
143
, 'queries_per_client':re.compile()
147
for line in output.split("\n"):
149
result=regexes[key].match(line)
151
run[key]=float(result.group(1))
154
# fetching test results from results_db database
155
sql_select="SELECT * FROM drizzleslap_run_iterations WHERE concurrency=%d AND iteration=%d" % (concurrency,test_iteration)
156
self.logging.info("dsn_string:%s" % dsn_string)
157
fetch=results_db_connect(dsn_string,"select",sql_select)
158
fetch['concurrency']=concurrency
159
fetch['iteration']=test_iteration
161
# deleting record with current concurrency and iteration
162
if fetch['concurrency']==concurrency and fetch['iteration']==test_iteration:
163
sql_delete="DELETE FROM drizzleslap_run_iterations WHERE concurrency=%d AND iteration=%d" % (concurrency,test_iteration)
164
results_db_connect(dsn_string,"delete",sql_delete)
166
# updating the results_db database with test results
167
# it for historical comparison over the life of the code...
168
sql_insert="""INSERT INTO drizzleslap_run_iterations VALUES (%d,'%s','%s',%0.3f,%0.3f,%0.3f,%0.3f,%0.3f,%d,%d,%d,%d )""" % (
172
float(run['queries_avg']),
173
float(run['queries_min']),
174
float(run['queries_max']),
175
float(run['total_time']),
176
float(run['stddev']),
177
int(run['iterations']),
178
int(run['concurrency']),
179
int(run['concurrency2']),
180
int(run['queries_per_client']) )
182
results_db_connect(dsn_string,"insert",sql_insert)
184
#TODO get drizzleslap test result ( should modify this and add util method too )
185
#getting test result as report for sysbench
186
sys_report=getSysbenchReport(run,fetch)
188
#mailing sysbench report
190
kewpieSendMail(test_executor,mail_tgt,sys_report)
194
server_manager.reset_servers(test_executor.name)