blob: aef3627f3abef5f9b7d4bed96b4c1eff3219c113 [file] [log] [blame]
mbligh9f857922008-06-05 16:19:07 +00001import time, re, pwd
2from autotest_lib.client.bin import test, autotest_utils
3from autotest_lib.client.common_lib import utils
4
mblighafce1032007-10-31 21:29:29 +00005
6class sysbench(test.test):
jadmanski0afbb632008-06-06 21:10:57 +00007 version = 1
mblighafce1032007-10-31 21:29:29 +00008
jadmanski0afbb632008-06-06 21:10:57 +00009 # http://osdn.dl.sourceforge.net/sourceforge/sysbench/sysbench-0.4.8.tar.gz
10 def setup(self, tarball = 'sysbench-0.4.8.tar.bz2'):
mbligh8b352852008-06-07 01:07:08 +000011 tarball = utils.unmap_url(self.bindir, tarball, self.tmpdir)
jadmanski0afbb632008-06-06 21:10:57 +000012 autotest_utils.extract_tarball_to_dir(tarball, self.srcdir)
13 self.job.setup_dep(['pgsql', 'mysql'])
mblighafce1032007-10-31 21:29:29 +000014
jadmanski0afbb632008-06-06 21:10:57 +000015 os.chdir(self.srcdir)
mblighafce1032007-10-31 21:29:29 +000016
jadmanski0afbb632008-06-06 21:10:57 +000017 pgsql_dir = os.path.join(self.autodir, 'deps/pgsql/pgsql')
18 mysql_dir = os.path.join(self.autodir, 'deps/mysql/mysql')
mblighafce1032007-10-31 21:29:29 +000019
jadmanski0afbb632008-06-06 21:10:57 +000020 # configure wants to get at pg_config, so add its path
21 utils.system('PATH=%s/bin:$PATH ./configure --with-mysql=%s --with-pgsql' % (pgsql_dir, mysql_dir))
22 utils.system('make -j %d' % autotest_utils.count_cpus())
mblighafce1032007-10-31 21:29:29 +000023
24
jadmanski0afbb632008-06-06 21:10:57 +000025 def execute(self, db_type = 'pgsql', build = 1, \
26 num_threads = autotest_utils.count_cpus(), max_time = 60, \
27 read_only = 0, args = ''):
28 plib = os.path.join(self.autodir, 'deps/pgsql/pgsql/lib')
29 mlib = os.path.join(self.autodir, 'deps/mysql/mysql/lib/mysql')
30 ld_path = prepend_path(plib, environ('LD_LIBRARY_PATH'))
31 ld_path = prepend_path(mlib, ld_path)
32 os.environ['LD_LIBRARY_PATH'] = ld_path
mblighafce1032007-10-31 21:29:29 +000033
jadmanski0afbb632008-06-06 21:10:57 +000034 # The databases don't want to run as root so run them as nobody
35 self.dbuser = 'nobody'
36 self.dbuid = pwd.getpwnam(self.dbuser)[2]
37 self.sudo = 'sudo -u ' + self.dbuser + ' '
mblighafce1032007-10-31 21:29:29 +000038
jadmanski0afbb632008-06-06 21:10:57 +000039 # Check for nobody user
40 try:
41 utils.system(self.sudo + '/bin/true')
42 except:
43 raise TestError('Unable to run as nobody')
mblighafce1032007-10-31 21:29:29 +000044
jadmanski0afbb632008-06-06 21:10:57 +000045 if (db_type == 'pgsql'):
mbligh8b352852008-06-07 01:07:08 +000046 self.execute_pgsql(build, num_threads, max_time, read_only, args)
jadmanski0afbb632008-06-06 21:10:57 +000047 elif (db_type == 'mysql'):
mbligh8b352852008-06-07 01:07:08 +000048 self.execute_mysql(build, num_threads, max_time, read_only, args)
mblighafce1032007-10-31 21:29:29 +000049
50
jadmanski0afbb632008-06-06 21:10:57 +000051 def execute_pgsql(self, build, num_threads, max_time, read_only, args):
52 bin = os.path.join(self.autodir, 'deps/pgsql/pgsql/bin')
53 data = os.path.join(self.autodir, 'deps/pgsql/pgsql/data')
54 log = os.path.join(self.debugdir, 'pgsql.log')
mblighafce1032007-10-31 21:29:29 +000055
jadmanski0afbb632008-06-06 21:10:57 +000056 if build == 1:
57 utils.system('rm -rf ' + data)
58 os.mkdir(data)
59 os.chown(data, self.dbuid, 0)
60 utils.system(self.sudo + bin + '/initdb -D ' + data)
mblighafce1032007-10-31 21:29:29 +000061
jadmanski0afbb632008-06-06 21:10:57 +000062 # Database must be able to write its output into debugdir
63 os.chown(self.debugdir, self.dbuid, 0)
mbligh8b352852008-06-07 01:07:08 +000064 utils.system(self.sudo + bin + '/pg_ctl -D %s -l %s start' %(data, log))
mblighafce1032007-10-31 21:29:29 +000065
jadmanski0afbb632008-06-06 21:10:57 +000066 # Wait for database to start
67 time.sleep(5)
mblighafce1032007-10-31 21:29:29 +000068
jadmanski0afbb632008-06-06 21:10:57 +000069 try:
mbligh8b352852008-06-07 01:07:08 +000070 base_cmd = self.srcdir + '/sysbench/sysbench --test=oltp '
71 '--db-driver=pgsql --pgsql-user=' + self.dbuser
mblighafce1032007-10-31 21:29:29 +000072
jadmanski0afbb632008-06-06 21:10:57 +000073 if build == 1:
74 utils.system(self.sudo + bin + '/createdb sbtest')
75 cmd = base_cmd +' prepare'
76 utils.system(cmd)
mblighafce1032007-10-31 21:29:29 +000077
jadmanski0afbb632008-06-06 21:10:57 +000078 cmd = base_cmd + \
79 ' --num-threads=' + str(num_threads) + \
80 ' --max-time=' + str(max_time) + \
81 ' --max-requests=0'
mblighafce1032007-10-31 21:29:29 +000082
jadmanski0afbb632008-06-06 21:10:57 +000083 if read_only:
84 cmd = cmd + ' --oltp-read-only=on'
mblighafce1032007-10-31 21:29:29 +000085
jadmanski0afbb632008-06-06 21:10:57 +000086 results = []
jadmanski29956512008-05-16 14:45:24 +000087
jadmanski0afbb632008-06-06 21:10:57 +000088 profilers = self.job.profilers
89 if not profilers.only():
90 results.append(utils.system_output(cmd + ' run',
91 retain_output=True))
mblighafce1032007-10-31 21:29:29 +000092
jadmanski0afbb632008-06-06 21:10:57 +000093 # Do a profiling run if necessary
94 if profilers.present():
95 profilers.start(self)
96 results.append("Profiling run ...")
97 results.append(utils.system_output(cmd + ' run',
98 retain_output=True))
99 profilers.stop(self)
100 profilers.report(self)
101 except:
102 utils.system(self.sudo + bin + '/pg_ctl -D ' + data + ' stop')
103 raise
mblighafce1032007-10-31 21:29:29 +0000104
jadmanski0afbb632008-06-06 21:10:57 +0000105 utils.system(self.sudo + bin + '/pg_ctl -D ' + data + ' stop')
mblighafce1032007-10-31 21:29:29 +0000106
jadmanski0afbb632008-06-06 21:10:57 +0000107 self.__format_results("\n".join(results))
mblighafce1032007-10-31 21:29:29 +0000108
109
jadmanski0afbb632008-06-06 21:10:57 +0000110 def execute_mysql(self, build, num_threads, max_time, read_only, args):
111 bin = os.path.join(self.autodir, 'deps/mysql/mysql/bin')
112 data = os.path.join(self.autodir, 'deps/mysql/mysql/var')
113 log = os.path.join(self.debugdir, 'mysql.log')
mblighafce1032007-10-31 21:29:29 +0000114
jadmanski0afbb632008-06-06 21:10:57 +0000115 if build == 1:
116 utils.system('rm -rf ' + data)
117 os.mkdir(data)
118 os.chown(data, self.dbuid, 0)
119 utils.system(bin + '/mysql_install_db --user=' + self.dbuser)
mblighafce1032007-10-31 21:29:29 +0000120
jadmanski0afbb632008-06-06 21:10:57 +0000121 utils.system(bin + '/mysqld_safe --log-error=' + log + \
122 ' --user=' + self.dbuser + ' &')
mblighafce1032007-10-31 21:29:29 +0000123
jadmanski0afbb632008-06-06 21:10:57 +0000124 # Wait for database to start
125 time.sleep(5)
mblighafce1032007-10-31 21:29:29 +0000126
jadmanski0afbb632008-06-06 21:10:57 +0000127 try:
mbligh8b352852008-06-07 01:07:08 +0000128 base_cmd = self.srcdir + '/sysbench/sysbench --test=oltp '
129 '--db-driver=mysql --mysql-user=root'
mblighafce1032007-10-31 21:29:29 +0000130
jadmanski0afbb632008-06-06 21:10:57 +0000131 if build == 1:
132 utils.system('echo "create database sbtest" | ' + \
133 bin + '/mysql -u root')
134 cmd = base_cmd +' prepare'
135 utils.system(cmd)
mblighafce1032007-10-31 21:29:29 +0000136
jadmanski0afbb632008-06-06 21:10:57 +0000137 cmd = base_cmd + \
138 ' --num-threads=' + str(num_threads) + \
139 ' --max-time=' + str(max_time) + \
140 ' --max-requests=0'
mblighafce1032007-10-31 21:29:29 +0000141
jadmanski0afbb632008-06-06 21:10:57 +0000142 if read_only:
143 cmd = cmd + ' --oltp-read-only=on'
mblighafce1032007-10-31 21:29:29 +0000144
jadmanski0afbb632008-06-06 21:10:57 +0000145 results = []
jadmanski29956512008-05-16 14:45:24 +0000146
jadmanski0afbb632008-06-06 21:10:57 +0000147 profilers = self.job.profilers
148 if not profilers.only():
149 results.append(utils.system_output(cmd + ' run',
150 retain_output=True))
mblighafce1032007-10-31 21:29:29 +0000151
jadmanski0afbb632008-06-06 21:10:57 +0000152 # Do a profiling run if necessary
153 if profilers.present():
154 profilers.start(self)
155 results.append("Profiling run ...")
156 results.append(utils.system_output(cmd + ' run',
157 retain_output=True))
158 profilers.stop(self)
159 profilers.report(self)
160 except:
161 utils.system(bin + '/mysqladmin shutdown')
162 raise
mblighafce1032007-10-31 21:29:29 +0000163
jadmanski0afbb632008-06-06 21:10:57 +0000164 utils.system(bin + '/mysqladmin shutdown')
mblighafce1032007-10-31 21:29:29 +0000165
jadmanski0afbb632008-06-06 21:10:57 +0000166 self.__format_results("\n".join(results))
mblighafce1032007-10-31 21:29:29 +0000167
168
jadmanski0afbb632008-06-06 21:10:57 +0000169 def __format_results(self, results):
170 threads = 0
171 tps = 0
mblighafce1032007-10-31 21:29:29 +0000172
jadmanski0afbb632008-06-06 21:10:57 +0000173 out = open(self.resultsdir + '/keyval', 'w')
174 for line in results.split('\n'):
175 threads_re = re.search('Number of threads: (\d+)', line)
176 if threads_re:
177 threads = threads_re.group(1)
mblighafce1032007-10-31 21:29:29 +0000178
jadmanski0afbb632008-06-06 21:10:57 +0000179 tps_re = re.search('transactions:\s+\d+\s+\((\S+) per sec.\)', line)
180 if tps_re:
181 tps = tps_re.group(1)
182 break
mblighafce1032007-10-31 21:29:29 +0000183
jadmanski0afbb632008-06-06 21:10:57 +0000184 print >> out, 'threads=%s\ntps=%s' % (threads, tps)
185 out.close()