blob: 7a19745f64b85df24a8c6556f890316b40a5211e [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):
7 version = 1
8
9 # http://osdn.dl.sourceforge.net/sourceforge/sysbench/sysbench-0.4.8.tar.gz
10 def setup(self, tarball = 'sysbench-0.4.8.tar.bz2'):
mbligh9f857922008-06-05 16:19:07 +000011 tarball = autotest_utils.unmap_url(self.bindir, tarball,
12 self.tmpdir)
13 autotest_utils.extract_tarball_to_dir(tarball, self.srcdir)
mblighafce1032007-10-31 21:29:29 +000014 self.job.setup_dep(['pgsql', 'mysql'])
15
16 os.chdir(self.srcdir)
17
18 pgsql_dir = os.path.join(self.autodir, 'deps/pgsql/pgsql')
19 mysql_dir = os.path.join(self.autodir, 'deps/mysql/mysql')
20
21 # configure wants to get at pg_config, so add its path
mbligh9f857922008-06-05 16:19:07 +000022 utils.system('PATH=%s/bin:$PATH ./configure --with-mysql=%s --with-pgsql' % (pgsql_dir, mysql_dir))
23 utils.system('make -j %d' % count_cpus())
mblighafce1032007-10-31 21:29:29 +000024
25
26 def execute(self, db_type = 'pgsql', build = 1, \
27 num_threads = 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
34
35 # 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 + ' '
39
40 # Check for nobody user
41 try:
mbligh9f857922008-06-05 16:19:07 +000042 utils.system(self.sudo + '/bin/true')
mblighafce1032007-10-31 21:29:29 +000043 except:
mbligh642b03e2008-01-14 16:53:15 +000044 raise TestError('Unable to run as nobody')
mblighafce1032007-10-31 21:29:29 +000045
46 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)
52
53
54 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')
58
59 if build == 1:
mbligh9f857922008-06-05 16:19:07 +000060 utils.system('rm -rf ' + data)
mblighafce1032007-10-31 21:29:29 +000061 os.mkdir(data)
62 os.chown(data, self.dbuid, 0)
mbligh9f857922008-06-05 16:19:07 +000063 utils.system(self.sudo + bin + '/initdb -D ' + data)
mblighafce1032007-10-31 21:29:29 +000064
65 # Database must be able to write its output into debugdir
66 os.chown(self.debugdir, self.dbuid, 0)
mbligh9f857922008-06-05 16:19:07 +000067 utils.system(self.sudo + bin + '/pg_ctl -D ' + data + \
mblighafce1032007-10-31 21:29:29 +000068 ' -l ' + log + ' start')
69
70 # Wait for database to start
71 time.sleep(5)
72
73 try:
74 base_cmd = self.srcdir + '/sysbench/sysbench ' + \
75 '--test=oltp --db-driver=pgsql ' + \
76 '--pgsql-user=' + self.dbuser
77
78 if build == 1:
mbligh9f857922008-06-05 16:19:07 +000079 utils.system(self.sudo + bin + '/createdb sbtest')
mblighafce1032007-10-31 21:29:29 +000080 cmd = base_cmd +' prepare'
mbligh9f857922008-06-05 16:19:07 +000081 utils.system(cmd)
mblighafce1032007-10-31 21:29:29 +000082
83 cmd = base_cmd + \
84 ' --num-threads=' + str(num_threads) + \
85 ' --max-time=' + str(max_time) + \
86 ' --max-requests=0'
87
88 if read_only:
89 cmd = cmd + ' --oltp-read-only=on'
90
jadmanski29956512008-05-16 14:45:24 +000091 results = []
92
mblighafce1032007-10-31 21:29:29 +000093 profilers = self.job.profilers
mbligh642b03e2008-01-14 16:53:15 +000094 if not profilers.only():
mbligh9f857922008-06-05 16:19:07 +000095 results.append(utils.system_output(cmd + ' run',
jadmanski29956512008-05-16 14:45:24 +000096 retain_output=True))
mblighafce1032007-10-31 21:29:29 +000097
98 # Do a profiling run if necessary
99 if profilers.present():
100 profilers.start(self)
jadmanski29956512008-05-16 14:45:24 +0000101 results.append("Profiling run ...")
mbligh9f857922008-06-05 16:19:07 +0000102 results.append(utils.system_output(cmd + ' run',
jadmanski29956512008-05-16 14:45:24 +0000103 retain_output=True))
mblighafce1032007-10-31 21:29:29 +0000104 profilers.stop(self)
105 profilers.report(self)
106 except:
mbligh9f857922008-06-05 16:19:07 +0000107 utils.system(self.sudo + bin + '/pg_ctl -D ' + data + ' stop')
mblighec755762008-01-17 16:25:22 +0000108 raise
mblighafce1032007-10-31 21:29:29 +0000109
mbligh9f857922008-06-05 16:19:07 +0000110 utils.system(self.sudo + bin + '/pg_ctl -D ' + data + ' stop')
mblighafce1032007-10-31 21:29:29 +0000111
jadmanski29956512008-05-16 14:45:24 +0000112 self.__format_results("\n".join(results))
mblighafce1032007-10-31 21:29:29 +0000113
114
115 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')
119
120 if build == 1:
mbligh9f857922008-06-05 16:19:07 +0000121 utils.system('rm -rf ' + data)
mblighafce1032007-10-31 21:29:29 +0000122 os.mkdir(data)
123 os.chown(data, self.dbuid, 0)
mbligh9f857922008-06-05 16:19:07 +0000124 utils.system(bin + '/mysql_install_db --user=' + self.dbuser)
mblighafce1032007-10-31 21:29:29 +0000125
mbligh9f857922008-06-05 16:19:07 +0000126 utils.system(bin + '/mysqld_safe --log-error=' + log + \
mblighafce1032007-10-31 21:29:29 +0000127 ' --user=' + self.dbuser + ' &')
128
129 # Wait for database to start
130 time.sleep(5)
131
132 try:
133 base_cmd = self.srcdir + '/sysbench/sysbench ' + \
134 '--test=oltp --db-driver=mysql ' + \
135 '--mysql-user=root'
136
137 if build == 1:
mbligh9f857922008-06-05 16:19:07 +0000138 utils.system('echo "create database sbtest" | ' + \
mblighafce1032007-10-31 21:29:29 +0000139 bin + '/mysql -u root')
140 cmd = base_cmd +' prepare'
mbligh9f857922008-06-05 16:19:07 +0000141 utils.system(cmd)
mblighafce1032007-10-31 21:29:29 +0000142
143 cmd = base_cmd + \
144 ' --num-threads=' + str(num_threads) + \
145 ' --max-time=' + str(max_time) + \
146 ' --max-requests=0'
147
148 if read_only:
149 cmd = cmd + ' --oltp-read-only=on'
150
jadmanski29956512008-05-16 14:45:24 +0000151 results = []
152
mblighafce1032007-10-31 21:29:29 +0000153 profilers = self.job.profilers
154 if not profilers.only():
mbligh9f857922008-06-05 16:19:07 +0000155 results.append(utils.system_output(cmd + ' run',
jadmanski29956512008-05-16 14:45:24 +0000156 retain_output=True))
mblighafce1032007-10-31 21:29:29 +0000157
158 # Do a profiling run if necessary
159 if profilers.present():
160 profilers.start(self)
jadmanski29956512008-05-16 14:45:24 +0000161 results.append("Profiling run ...")
mbligh9f857922008-06-05 16:19:07 +0000162 results.append(utils.system_output(cmd + ' run',
jadmanski29956512008-05-16 14:45:24 +0000163 retain_output=True))
mblighafce1032007-10-31 21:29:29 +0000164 profilers.stop(self)
165 profilers.report(self)
166 except:
mbligh9f857922008-06-05 16:19:07 +0000167 utils.system(bin + '/mysqladmin shutdown')
mblighec755762008-01-17 16:25:22 +0000168 raise
mblighafce1032007-10-31 21:29:29 +0000169
mbligh9f857922008-06-05 16:19:07 +0000170 utils.system(bin + '/mysqladmin shutdown')
mblighafce1032007-10-31 21:29:29 +0000171
jadmanski29956512008-05-16 14:45:24 +0000172 self.__format_results("\n".join(results))
mblighafce1032007-10-31 21:29:29 +0000173
174
175 def __format_results(self, results):
176 threads = 0
177 tps = 0
178
179 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)
184
185 tps_re = re.search('transactions:\s+\d+\s+\((\S+) per sec.\)', line)
186 if tps_re:
187 tps = tps_re.group(1)
188 break
189
190 print >> out, 'threads=%s\ntps=%s' % (threads, tps)
191 out.close()