blob: 3845b3837939b78f6b914b780af6b5bd61b8ce34 [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
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
mbligh0804da92008-07-08 22:45:35 +000021 utils.system(
22 'PATH=%s/bin:$PATH ./configure --with-mysql=%s --with-pgsql'
23 % (pgsql_dir, mysql_dir))
jadmanski0afbb632008-06-06 21:10:57 +000024 utils.system('make -j %d' % autotest_utils.count_cpus())
mblighafce1032007-10-31 21:29:29 +000025
26
jadmanski0afbb632008-06-06 21:10:57 +000027 def execute(self, db_type = 'pgsql', build = 1, \
28 num_threads = autotest_utils.count_cpus(), max_time = 60, \
29 read_only = 0, args = ''):
30 plib = os.path.join(self.autodir, 'deps/pgsql/pgsql/lib')
31 mlib = os.path.join(self.autodir, 'deps/mysql/mysql/lib/mysql')
mbligh0804da92008-07-08 22:45:35 +000032 ld_path = autotest_utils.prepend_path(plib,
33 autotest_utils.environ('LD_LIBRARY_PATH'))
34 ld_path = autotest_utils.prepend_path(mlib, ld_path)
jadmanski0afbb632008-06-06 21:10:57 +000035 os.environ['LD_LIBRARY_PATH'] = ld_path
mblighafce1032007-10-31 21:29:29 +000036
jadmanski0afbb632008-06-06 21:10:57 +000037 # The databases don't want to run as root so run them as nobody
38 self.dbuser = 'nobody'
39 self.dbuid = pwd.getpwnam(self.dbuser)[2]
40 self.sudo = 'sudo -u ' + self.dbuser + ' '
mblighafce1032007-10-31 21:29:29 +000041
jadmanski0afbb632008-06-06 21:10:57 +000042 # Check for nobody user
43 try:
44 utils.system(self.sudo + '/bin/true')
45 except:
mbligh0804da92008-07-08 22:45:35 +000046 raise error.TestError('Unable to run as nobody')
mblighafce1032007-10-31 21:29:29 +000047
jadmanski0afbb632008-06-06 21:10:57 +000048 if (db_type == 'pgsql'):
mbligh8b352852008-06-07 01:07:08 +000049 self.execute_pgsql(build, num_threads, max_time, read_only, args)
jadmanski0afbb632008-06-06 21:10:57 +000050 elif (db_type == 'mysql'):
mbligh8b352852008-06-07 01:07:08 +000051 self.execute_mysql(build, num_threads, max_time, 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)
mbligh8b352852008-06-07 01:07:08 +000067 utils.system(self.sudo + bin + '/pg_ctl -D %s -l %s start' %(data, log))
mblighafce1032007-10-31 21:29:29 +000068
jadmanski0afbb632008-06-06 21:10:57 +000069 # Wait for database to start
70 time.sleep(5)
mblighafce1032007-10-31 21:29:29 +000071
jadmanski0afbb632008-06-06 21:10:57 +000072 try:
mbligh0804da92008-07-08 22:45:35 +000073 base_cmd = self.srcdir + '/sysbench/sysbench --test=oltp ' \
mbligh8b352852008-06-07 01:07:08 +000074 '--db-driver=pgsql --pgsql-user=' + self.dbuser
mblighafce1032007-10-31 21:29:29 +000075
jadmanski0afbb632008-06-06 21:10:57 +000076 if build == 1:
77 utils.system(self.sudo + bin + '/createdb sbtest')
78 cmd = base_cmd +' prepare'
79 utils.system(cmd)
mblighafce1032007-10-31 21:29:29 +000080
jadmanski0afbb632008-06-06 21:10:57 +000081 cmd = base_cmd + \
82 ' --num-threads=' + str(num_threads) + \
83 ' --max-time=' + str(max_time) + \
84 ' --max-requests=0'
mblighafce1032007-10-31 21:29:29 +000085
jadmanski0afbb632008-06-06 21:10:57 +000086 if read_only:
87 cmd = cmd + ' --oltp-read-only=on'
mblighafce1032007-10-31 21:29:29 +000088
jadmanski0afbb632008-06-06 21:10:57 +000089 results = []
jadmanski29956512008-05-16 14:45:24 +000090
jadmanski0afbb632008-06-06 21:10:57 +000091 profilers = self.job.profilers
92 if not profilers.only():
93 results.append(utils.system_output(cmd + ' run',
94 retain_output=True))
mblighafce1032007-10-31 21:29:29 +000095
jadmanski0afbb632008-06-06 21:10:57 +000096 # Do a profiling run if necessary
97 if profilers.present():
98 profilers.start(self)
99 results.append("Profiling run ...")
100 results.append(utils.system_output(cmd + ' run',
101 retain_output=True))
102 profilers.stop(self)
103 profilers.report(self)
104 except:
105 utils.system(self.sudo + bin + '/pg_ctl -D ' + data + ' stop')
106 raise
mblighafce1032007-10-31 21:29:29 +0000107
jadmanski0afbb632008-06-06 21:10:57 +0000108 utils.system(self.sudo + bin + '/pg_ctl -D ' + data + ' stop')
mblighafce1032007-10-31 21:29:29 +0000109
jadmanski0afbb632008-06-06 21:10:57 +0000110 self.__format_results("\n".join(results))
mblighafce1032007-10-31 21:29:29 +0000111
112
jadmanski0afbb632008-06-06 21:10:57 +0000113 def execute_mysql(self, build, num_threads, max_time, read_only, args):
114 bin = os.path.join(self.autodir, 'deps/mysql/mysql/bin')
115 data = os.path.join(self.autodir, 'deps/mysql/mysql/var')
116 log = os.path.join(self.debugdir, 'mysql.log')
mblighafce1032007-10-31 21:29:29 +0000117
jadmanski0afbb632008-06-06 21:10:57 +0000118 if build == 1:
119 utils.system('rm -rf ' + data)
120 os.mkdir(data)
121 os.chown(data, self.dbuid, 0)
122 utils.system(bin + '/mysql_install_db --user=' + self.dbuser)
mblighafce1032007-10-31 21:29:29 +0000123
jadmanski0afbb632008-06-06 21:10:57 +0000124 utils.system(bin + '/mysqld_safe --log-error=' + log + \
125 ' --user=' + self.dbuser + ' &')
mblighafce1032007-10-31 21:29:29 +0000126
jadmanski0afbb632008-06-06 21:10:57 +0000127 # Wait for database to start
128 time.sleep(5)
mblighafce1032007-10-31 21:29:29 +0000129
jadmanski0afbb632008-06-06 21:10:57 +0000130 try:
mbligh0804da92008-07-08 22:45:35 +0000131 base_cmd = self.srcdir + '/sysbench/sysbench --test=oltp ' \
mbligh8b352852008-06-07 01:07:08 +0000132 '--db-driver=mysql --mysql-user=root'
mblighafce1032007-10-31 21:29:29 +0000133
jadmanski0afbb632008-06-06 21:10:57 +0000134 if build == 1:
135 utils.system('echo "create database sbtest" | ' + \
136 bin + '/mysql -u root')
137 cmd = base_cmd +' prepare'
138 utils.system(cmd)
mblighafce1032007-10-31 21:29:29 +0000139
jadmanski0afbb632008-06-06 21:10:57 +0000140 cmd = base_cmd + \
141 ' --num-threads=' + str(num_threads) + \
142 ' --max-time=' + str(max_time) + \
143 ' --max-requests=0'
mblighafce1032007-10-31 21:29:29 +0000144
jadmanski0afbb632008-06-06 21:10:57 +0000145 if read_only:
146 cmd = cmd + ' --oltp-read-only=on'
mblighafce1032007-10-31 21:29:29 +0000147
jadmanski0afbb632008-06-06 21:10:57 +0000148 results = []
jadmanski29956512008-05-16 14:45:24 +0000149
jadmanski0afbb632008-06-06 21:10:57 +0000150 profilers = self.job.profilers
151 if not profilers.only():
152 results.append(utils.system_output(cmd + ' run',
153 retain_output=True))
mblighafce1032007-10-31 21:29:29 +0000154
jadmanski0afbb632008-06-06 21:10:57 +0000155 # Do a profiling run if necessary
156 if profilers.present():
157 profilers.start(self)
158 results.append("Profiling run ...")
159 results.append(utils.system_output(cmd + ' run',
160 retain_output=True))
161 profilers.stop(self)
162 profilers.report(self)
163 except:
164 utils.system(bin + '/mysqladmin shutdown')
165 raise
mblighafce1032007-10-31 21:29:29 +0000166
jadmanski0afbb632008-06-06 21:10:57 +0000167 utils.system(bin + '/mysqladmin shutdown')
mblighafce1032007-10-31 21:29:29 +0000168
jadmanski0afbb632008-06-06 21:10:57 +0000169 self.__format_results("\n".join(results))
mblighafce1032007-10-31 21:29:29 +0000170
171
jadmanski0afbb632008-06-06 21:10:57 +0000172 def __format_results(self, results):
173 threads = 0
174 tps = 0
mblighafce1032007-10-31 21:29:29 +0000175
jadmanski0afbb632008-06-06 21:10:57 +0000176 out = open(self.resultsdir + '/keyval', 'w')
177 for line in results.split('\n'):
178 threads_re = re.search('Number of threads: (\d+)', line)
179 if threads_re:
180 threads = threads_re.group(1)
mblighafce1032007-10-31 21:29:29 +0000181
jadmanski0afbb632008-06-06 21:10:57 +0000182 tps_re = re.search('transactions:\s+\d+\s+\((\S+) per sec.\)', line)
183 if tps_re:
184 tps = tps_re.group(1)
185 break
mblighafce1032007-10-31 21:29:29 +0000186
jadmanski0afbb632008-06-06 21:10:57 +0000187 print >> out, 'threads=%s\ntps=%s' % (threads, tps)
188 out.close()