blob: f17f8cf8c84fc03fb1d504d0033a55eb484f8736 [file] [log] [blame]
mbligh0804da92008-07-08 22:45:35 +00001import os, time, re, pwd
mbligh9f857922008-06-05 16:19:07 +00002from autotest_lib.client.bin import test, autotest_utils
mbligh0804da92008-07-08 22:45:35 +00003from autotest_lib.client.common_lib import utils, error
mbligh9f857922008-06-05 16:19:07 +00004
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
mblighc5ddfd12008-08-04 17:15:00 +00009 def initialize(self):
10 self.job.require_gcc()
11
12
jadmanski0afbb632008-06-06 21:10:57 +000013 # http://osdn.dl.sourceforge.net/sourceforge/sysbench/sysbench-0.4.8.tar.gz
14 def setup(self, tarball = 'sysbench-0.4.8.tar.bz2'):
mbligh8b352852008-06-07 01:07:08 +000015 tarball = utils.unmap_url(self.bindir, tarball, self.tmpdir)
jadmanski0afbb632008-06-06 21:10:57 +000016 autotest_utils.extract_tarball_to_dir(tarball, self.srcdir)
17 self.job.setup_dep(['pgsql', 'mysql'])
mblighafce1032007-10-31 21:29:29 +000018
jadmanski0afbb632008-06-06 21:10:57 +000019 os.chdir(self.srcdir)
mblighafce1032007-10-31 21:29:29 +000020
jadmanski0afbb632008-06-06 21:10:57 +000021 pgsql_dir = os.path.join(self.autodir, 'deps/pgsql/pgsql')
22 mysql_dir = os.path.join(self.autodir, 'deps/mysql/mysql')
mblighafce1032007-10-31 21:29:29 +000023
jadmanski0afbb632008-06-06 21:10:57 +000024 # configure wants to get at pg_config, so add its path
mbligh0804da92008-07-08 22:45:35 +000025 utils.system(
26 'PATH=%s/bin:$PATH ./configure --with-mysql=%s --with-pgsql'
27 % (pgsql_dir, mysql_dir))
jadmanski0afbb632008-06-06 21:10:57 +000028 utils.system('make -j %d' % autotest_utils.count_cpus())
mblighafce1032007-10-31 21:29:29 +000029
30
jadmanski0afbb632008-06-06 21:10:57 +000031 def execute(self, db_type = 'pgsql', build = 1, \
32 num_threads = autotest_utils.count_cpus(), max_time = 60, \
33 read_only = 0, args = ''):
34 plib = os.path.join(self.autodir, 'deps/pgsql/pgsql/lib')
35 mlib = os.path.join(self.autodir, 'deps/mysql/mysql/lib/mysql')
mbligh0804da92008-07-08 22:45:35 +000036 ld_path = autotest_utils.prepend_path(plib,
37 autotest_utils.environ('LD_LIBRARY_PATH'))
38 ld_path = autotest_utils.prepend_path(mlib, ld_path)
jadmanski0afbb632008-06-06 21:10:57 +000039 os.environ['LD_LIBRARY_PATH'] = ld_path
mblighafce1032007-10-31 21:29:29 +000040
jadmanski0afbb632008-06-06 21:10:57 +000041 # The databases don't want to run as root so run them as nobody
42 self.dbuser = 'nobody'
43 self.dbuid = pwd.getpwnam(self.dbuser)[2]
44 self.sudo = 'sudo -u ' + self.dbuser + ' '
mblighafce1032007-10-31 21:29:29 +000045
jadmanski0afbb632008-06-06 21:10:57 +000046 # Check for nobody user
47 try:
48 utils.system(self.sudo + '/bin/true')
49 except:
mbligh0804da92008-07-08 22:45:35 +000050 raise error.TestError('Unable to run as nobody')
mblighafce1032007-10-31 21:29:29 +000051
jadmanski0afbb632008-06-06 21:10:57 +000052 if (db_type == 'pgsql'):
mbligh8b352852008-06-07 01:07:08 +000053 self.execute_pgsql(build, num_threads, max_time, read_only, args)
jadmanski0afbb632008-06-06 21:10:57 +000054 elif (db_type == 'mysql'):
mbligh8b352852008-06-07 01:07:08 +000055 self.execute_mysql(build, num_threads, max_time, read_only, args)
mblighafce1032007-10-31 21:29:29 +000056
57
jadmanski0afbb632008-06-06 21:10:57 +000058 def execute_pgsql(self, build, num_threads, max_time, read_only, args):
59 bin = os.path.join(self.autodir, 'deps/pgsql/pgsql/bin')
60 data = os.path.join(self.autodir, 'deps/pgsql/pgsql/data')
61 log = os.path.join(self.debugdir, 'pgsql.log')
mblighafce1032007-10-31 21:29:29 +000062
jadmanski0afbb632008-06-06 21:10:57 +000063 if build == 1:
64 utils.system('rm -rf ' + data)
65 os.mkdir(data)
66 os.chown(data, self.dbuid, 0)
67 utils.system(self.sudo + bin + '/initdb -D ' + data)
mblighafce1032007-10-31 21:29:29 +000068
jadmanski0afbb632008-06-06 21:10:57 +000069 # Database must be able to write its output into debugdir
70 os.chown(self.debugdir, self.dbuid, 0)
mbligh8b352852008-06-07 01:07:08 +000071 utils.system(self.sudo + bin + '/pg_ctl -D %s -l %s start' %(data, log))
mblighafce1032007-10-31 21:29:29 +000072
jadmanski0afbb632008-06-06 21:10:57 +000073 # Wait for database to start
74 time.sleep(5)
mblighafce1032007-10-31 21:29:29 +000075
jadmanski0afbb632008-06-06 21:10:57 +000076 try:
mbligh0804da92008-07-08 22:45:35 +000077 base_cmd = self.srcdir + '/sysbench/sysbench --test=oltp ' \
mbligh8b352852008-06-07 01:07:08 +000078 '--db-driver=pgsql --pgsql-user=' + self.dbuser
mblighafce1032007-10-31 21:29:29 +000079
jadmanski0afbb632008-06-06 21:10:57 +000080 if build == 1:
81 utils.system(self.sudo + bin + '/createdb sbtest')
82 cmd = base_cmd +' prepare'
83 utils.system(cmd)
mblighafce1032007-10-31 21:29:29 +000084
jadmanski0afbb632008-06-06 21:10:57 +000085 cmd = base_cmd + \
86 ' --num-threads=' + str(num_threads) + \
87 ' --max-time=' + str(max_time) + \
88 ' --max-requests=0'
mblighafce1032007-10-31 21:29:29 +000089
jadmanski0afbb632008-06-06 21:10:57 +000090 if read_only:
91 cmd = cmd + ' --oltp-read-only=on'
mblighafce1032007-10-31 21:29:29 +000092
jadmanski0afbb632008-06-06 21:10:57 +000093 results = []
jadmanski29956512008-05-16 14:45:24 +000094
jadmanski0afbb632008-06-06 21:10:57 +000095 profilers = self.job.profilers
96 if not profilers.only():
97 results.append(utils.system_output(cmd + ' run',
98 retain_output=True))
mblighafce1032007-10-31 21:29:29 +000099
jadmanski0afbb632008-06-06 21:10:57 +0000100 # Do a profiling run if necessary
101 if profilers.present():
102 profilers.start(self)
103 results.append("Profiling run ...")
104 results.append(utils.system_output(cmd + ' run',
105 retain_output=True))
106 profilers.stop(self)
107 profilers.report(self)
108 except:
109 utils.system(self.sudo + bin + '/pg_ctl -D ' + data + ' stop')
110 raise
mblighafce1032007-10-31 21:29:29 +0000111
jadmanski0afbb632008-06-06 21:10:57 +0000112 utils.system(self.sudo + bin + '/pg_ctl -D ' + data + ' stop')
mblighafce1032007-10-31 21:29:29 +0000113
jadmanski0afbb632008-06-06 21:10:57 +0000114 self.__format_results("\n".join(results))
mblighafce1032007-10-31 21:29:29 +0000115
116
jadmanski0afbb632008-06-06 21:10:57 +0000117 def execute_mysql(self, build, num_threads, max_time, read_only, args):
118 bin = os.path.join(self.autodir, 'deps/mysql/mysql/bin')
119 data = os.path.join(self.autodir, 'deps/mysql/mysql/var')
120 log = os.path.join(self.debugdir, 'mysql.log')
mblighafce1032007-10-31 21:29:29 +0000121
jadmanski0afbb632008-06-06 21:10:57 +0000122 if build == 1:
123 utils.system('rm -rf ' + data)
124 os.mkdir(data)
125 os.chown(data, self.dbuid, 0)
126 utils.system(bin + '/mysql_install_db --user=' + self.dbuser)
mblighafce1032007-10-31 21:29:29 +0000127
jadmanski0afbb632008-06-06 21:10:57 +0000128 utils.system(bin + '/mysqld_safe --log-error=' + log + \
129 ' --user=' + self.dbuser + ' &')
mblighafce1032007-10-31 21:29:29 +0000130
jadmanski0afbb632008-06-06 21:10:57 +0000131 # Wait for database to start
132 time.sleep(5)
mblighafce1032007-10-31 21:29:29 +0000133
jadmanski0afbb632008-06-06 21:10:57 +0000134 try:
mbligh0804da92008-07-08 22:45:35 +0000135 base_cmd = self.srcdir + '/sysbench/sysbench --test=oltp ' \
mbligh8b352852008-06-07 01:07:08 +0000136 '--db-driver=mysql --mysql-user=root'
mblighafce1032007-10-31 21:29:29 +0000137
jadmanski0afbb632008-06-06 21:10:57 +0000138 if build == 1:
139 utils.system('echo "create database sbtest" | ' + \
140 bin + '/mysql -u root')
141 cmd = base_cmd +' prepare'
142 utils.system(cmd)
mblighafce1032007-10-31 21:29:29 +0000143
jadmanski0afbb632008-06-06 21:10:57 +0000144 cmd = base_cmd + \
145 ' --num-threads=' + str(num_threads) + \
146 ' --max-time=' + str(max_time) + \
147 ' --max-requests=0'
mblighafce1032007-10-31 21:29:29 +0000148
jadmanski0afbb632008-06-06 21:10:57 +0000149 if read_only:
150 cmd = cmd + ' --oltp-read-only=on'
mblighafce1032007-10-31 21:29:29 +0000151
jadmanski0afbb632008-06-06 21:10:57 +0000152 results = []
jadmanski29956512008-05-16 14:45:24 +0000153
jadmanski0afbb632008-06-06 21:10:57 +0000154 profilers = self.job.profilers
155 if not profilers.only():
156 results.append(utils.system_output(cmd + ' run',
157 retain_output=True))
mblighafce1032007-10-31 21:29:29 +0000158
jadmanski0afbb632008-06-06 21:10:57 +0000159 # Do a profiling run if necessary
160 if profilers.present():
161 profilers.start(self)
162 results.append("Profiling run ...")
163 results.append(utils.system_output(cmd + ' run',
164 retain_output=True))
165 profilers.stop(self)
166 profilers.report(self)
167 except:
168 utils.system(bin + '/mysqladmin shutdown')
169 raise
mblighafce1032007-10-31 21:29:29 +0000170
jadmanski0afbb632008-06-06 21:10:57 +0000171 utils.system(bin + '/mysqladmin shutdown')
mblighafce1032007-10-31 21:29:29 +0000172
jadmanski0afbb632008-06-06 21:10:57 +0000173 self.__format_results("\n".join(results))
mblighafce1032007-10-31 21:29:29 +0000174
175
jadmanski0afbb632008-06-06 21:10:57 +0000176 def __format_results(self, results):
177 threads = 0
178 tps = 0
mblighafce1032007-10-31 21:29:29 +0000179
jadmanski0afbb632008-06-06 21:10:57 +0000180 out = open(self.resultsdir + '/keyval', 'w')
181 for line in results.split('\n'):
182 threads_re = re.search('Number of threads: (\d+)', line)
183 if threads_re:
184 threads = threads_re.group(1)
mblighafce1032007-10-31 21:29:29 +0000185
jadmanski0afbb632008-06-06 21:10:57 +0000186 tps_re = re.search('transactions:\s+\d+\s+\((\S+) per sec.\)', line)
187 if tps_re:
188 tps = tps_re.group(1)
189 break
mblighafce1032007-10-31 21:29:29 +0000190
jadmanski0afbb632008-06-06 21:10:57 +0000191 print >> out, 'threads=%s\ntps=%s' % (threads, tps)
192 out.close()