blob: 571c37f6dc5d0192fb3c89c6c1b4be974c55b284 [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'):
11 tarball = utils.unmap_url(self.bindir, tarball,
12 self.tmpdir)
13 autotest_utils.extract_tarball_to_dir(tarball, self.srcdir)
14 self.job.setup_dep(['pgsql', 'mysql'])
mblighafce1032007-10-31 21:29:29 +000015
jadmanski0afbb632008-06-06 21:10:57 +000016 os.chdir(self.srcdir)
mblighafce1032007-10-31 21:29:29 +000017
jadmanski0afbb632008-06-06 21:10:57 +000018 pgsql_dir = os.path.join(self.autodir, 'deps/pgsql/pgsql')
19 mysql_dir = os.path.join(self.autodir, 'deps/mysql/mysql')
mblighafce1032007-10-31 21:29:29 +000020
jadmanski0afbb632008-06-06 21:10:57 +000021 # configure wants to get at pg_config, so add its path
22 utils.system('PATH=%s/bin:$PATH ./configure --with-mysql=%s --with-pgsql' % (pgsql_dir, mysql_dir))
23 utils.system('make -j %d' % autotest_utils.count_cpus())
mblighafce1032007-10-31 21:29:29 +000024
25
jadmanski0afbb632008-06-06 21:10:57 +000026 def execute(self, db_type = 'pgsql', build = 1, \
27 num_threads = autotest_utils.count_cpus(), max_time = 60, \
28 read_only = 0, args = ''):
29 plib = os.path.join(self.autodir, 'deps/pgsql/pgsql/lib')
30 mlib = os.path.join(self.autodir, 'deps/mysql/mysql/lib/mysql')
31 ld_path = prepend_path(plib, environ('LD_LIBRARY_PATH'))
32 ld_path = prepend_path(mlib, ld_path)
33 os.environ['LD_LIBRARY_PATH'] = ld_path
mblighafce1032007-10-31 21:29:29 +000034
jadmanski0afbb632008-06-06 21:10:57 +000035 # The databases don't want to run as root so run them as nobody
36 self.dbuser = 'nobody'
37 self.dbuid = pwd.getpwnam(self.dbuser)[2]
38 self.sudo = 'sudo -u ' + self.dbuser + ' '
mblighafce1032007-10-31 21:29:29 +000039
jadmanski0afbb632008-06-06 21:10:57 +000040 # Check for nobody user
41 try:
42 utils.system(self.sudo + '/bin/true')
43 except:
44 raise TestError('Unable to run as nobody')
mblighafce1032007-10-31 21:29:29 +000045
jadmanski0afbb632008-06-06 21:10:57 +000046 if (db_type == 'pgsql'):
47 self.execute_pgsql(build, num_threads, max_time, \
48 read_only, args)
49 elif (db_type == 'mysql'):
50 self.execute_mysql(build, num_threads, max_time, \
51 read_only, args)
mblighafce1032007-10-31 21:29:29 +000052
53
jadmanski0afbb632008-06-06 21:10:57 +000054 def execute_pgsql(self, build, num_threads, max_time, read_only, args):
55 bin = os.path.join(self.autodir, 'deps/pgsql/pgsql/bin')
56 data = os.path.join(self.autodir, 'deps/pgsql/pgsql/data')
57 log = os.path.join(self.debugdir, 'pgsql.log')
mblighafce1032007-10-31 21:29:29 +000058
jadmanski0afbb632008-06-06 21:10:57 +000059 if build == 1:
60 utils.system('rm -rf ' + data)
61 os.mkdir(data)
62 os.chown(data, self.dbuid, 0)
63 utils.system(self.sudo + bin + '/initdb -D ' + data)
mblighafce1032007-10-31 21:29:29 +000064
jadmanski0afbb632008-06-06 21:10:57 +000065 # Database must be able to write its output into debugdir
66 os.chown(self.debugdir, self.dbuid, 0)
67 utils.system(self.sudo + bin + '/pg_ctl -D ' + data + \
68 ' -l ' + log + ' start')
mblighafce1032007-10-31 21:29:29 +000069
jadmanski0afbb632008-06-06 21:10:57 +000070 # Wait for database to start
71 time.sleep(5)
mblighafce1032007-10-31 21:29:29 +000072
jadmanski0afbb632008-06-06 21:10:57 +000073 try:
74 base_cmd = self.srcdir + '/sysbench/sysbench ' + \
75 '--test=oltp --db-driver=pgsql ' + \
76 '--pgsql-user=' + self.dbuser
mblighafce1032007-10-31 21:29:29 +000077
jadmanski0afbb632008-06-06 21:10:57 +000078 if build == 1:
79 utils.system(self.sudo + bin + '/createdb sbtest')
80 cmd = base_cmd +' prepare'
81 utils.system(cmd)
mblighafce1032007-10-31 21:29:29 +000082
jadmanski0afbb632008-06-06 21:10:57 +000083 cmd = base_cmd + \
84 ' --num-threads=' + str(num_threads) + \
85 ' --max-time=' + str(max_time) + \
86 ' --max-requests=0'
mblighafce1032007-10-31 21:29:29 +000087
jadmanski0afbb632008-06-06 21:10:57 +000088 if read_only:
89 cmd = cmd + ' --oltp-read-only=on'
mblighafce1032007-10-31 21:29:29 +000090
jadmanski0afbb632008-06-06 21:10:57 +000091 results = []
jadmanski29956512008-05-16 14:45:24 +000092
jadmanski0afbb632008-06-06 21:10:57 +000093 profilers = self.job.profilers
94 if not profilers.only():
95 results.append(utils.system_output(cmd + ' run',
96 retain_output=True))
mblighafce1032007-10-31 21:29:29 +000097
jadmanski0afbb632008-06-06 21:10:57 +000098 # Do a profiling run if necessary
99 if profilers.present():
100 profilers.start(self)
101 results.append("Profiling run ...")
102 results.append(utils.system_output(cmd + ' run',
103 retain_output=True))
104 profilers.stop(self)
105 profilers.report(self)
106 except:
107 utils.system(self.sudo + bin + '/pg_ctl -D ' + data + ' stop')
108 raise
mblighafce1032007-10-31 21:29:29 +0000109
jadmanski0afbb632008-06-06 21:10:57 +0000110 utils.system(self.sudo + bin + '/pg_ctl -D ' + data + ' stop')
mblighafce1032007-10-31 21:29:29 +0000111
jadmanski0afbb632008-06-06 21:10:57 +0000112 self.__format_results("\n".join(results))
mblighafce1032007-10-31 21:29:29 +0000113
114
jadmanski0afbb632008-06-06 21:10:57 +0000115 def execute_mysql(self, build, num_threads, max_time, read_only, args):
116 bin = os.path.join(self.autodir, 'deps/mysql/mysql/bin')
117 data = os.path.join(self.autodir, 'deps/mysql/mysql/var')
118 log = os.path.join(self.debugdir, 'mysql.log')
mblighafce1032007-10-31 21:29:29 +0000119
jadmanski0afbb632008-06-06 21:10:57 +0000120 if build == 1:
121 utils.system('rm -rf ' + data)
122 os.mkdir(data)
123 os.chown(data, self.dbuid, 0)
124 utils.system(bin + '/mysql_install_db --user=' + self.dbuser)
mblighafce1032007-10-31 21:29:29 +0000125
jadmanski0afbb632008-06-06 21:10:57 +0000126 utils.system(bin + '/mysqld_safe --log-error=' + log + \
127 ' --user=' + self.dbuser + ' &')
mblighafce1032007-10-31 21:29:29 +0000128
jadmanski0afbb632008-06-06 21:10:57 +0000129 # Wait for database to start
130 time.sleep(5)
mblighafce1032007-10-31 21:29:29 +0000131
jadmanski0afbb632008-06-06 21:10:57 +0000132 try:
133 base_cmd = self.srcdir + '/sysbench/sysbench ' + \
134 '--test=oltp --db-driver=mysql ' + \
135 '--mysql-user=root'
mblighafce1032007-10-31 21:29:29 +0000136
jadmanski0afbb632008-06-06 21:10:57 +0000137 if build == 1:
138 utils.system('echo "create database sbtest" | ' + \
139 bin + '/mysql -u root')
140 cmd = base_cmd +' prepare'
141 utils.system(cmd)
mblighafce1032007-10-31 21:29:29 +0000142
jadmanski0afbb632008-06-06 21:10:57 +0000143 cmd = base_cmd + \
144 ' --num-threads=' + str(num_threads) + \
145 ' --max-time=' + str(max_time) + \
146 ' --max-requests=0'
mblighafce1032007-10-31 21:29:29 +0000147
jadmanski0afbb632008-06-06 21:10:57 +0000148 if read_only:
149 cmd = cmd + ' --oltp-read-only=on'
mblighafce1032007-10-31 21:29:29 +0000150
jadmanski0afbb632008-06-06 21:10:57 +0000151 results = []
jadmanski29956512008-05-16 14:45:24 +0000152
jadmanski0afbb632008-06-06 21:10:57 +0000153 profilers = self.job.profilers
154 if not profilers.only():
155 results.append(utils.system_output(cmd + ' run',
156 retain_output=True))
mblighafce1032007-10-31 21:29:29 +0000157
jadmanski0afbb632008-06-06 21:10:57 +0000158 # Do a profiling run if necessary
159 if profilers.present():
160 profilers.start(self)
161 results.append("Profiling run ...")
162 results.append(utils.system_output(cmd + ' run',
163 retain_output=True))
164 profilers.stop(self)
165 profilers.report(self)
166 except:
167 utils.system(bin + '/mysqladmin shutdown')
168 raise
mblighafce1032007-10-31 21:29:29 +0000169
jadmanski0afbb632008-06-06 21:10:57 +0000170 utils.system(bin + '/mysqladmin shutdown')
mblighafce1032007-10-31 21:29:29 +0000171
jadmanski0afbb632008-06-06 21:10:57 +0000172 self.__format_results("\n".join(results))
mblighafce1032007-10-31 21:29:29 +0000173
174
jadmanski0afbb632008-06-06 21:10:57 +0000175 def __format_results(self, results):
176 threads = 0
177 tps = 0
mblighafce1032007-10-31 21:29:29 +0000178
jadmanski0afbb632008-06-06 21:10:57 +0000179 out = open(self.resultsdir + '/keyval', 'w')
180 for line in results.split('\n'):
181 threads_re = re.search('Number of threads: (\d+)', line)
182 if threads_re:
183 threads = threads_re.group(1)
mblighafce1032007-10-31 21:29:29 +0000184
jadmanski0afbb632008-06-06 21:10:57 +0000185 tps_re = re.search('transactions:\s+\d+\s+\((\S+) per sec.\)', line)
186 if tps_re:
187 tps = tps_re.group(1)
188 break
mblighafce1032007-10-31 21:29:29 +0000189
jadmanski0afbb632008-06-06 21:10:57 +0000190 print >> out, 'threads=%s\ntps=%s' % (threads, tps)
191 out.close()