blob: 8a5400ce3f35490a0b63dd7b806747fcb72e6fae [file] [log] [blame]
mbligh0804da92008-07-08 22:45:35 +00001import os, time, re, pwd
mbligh53da18e2009-01-05 21:13:26 +00002from autotest_lib.client.bin import test, utils
3from autotest_lib.client.common_lib import 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()
mbligh057c2bd2008-08-28 18:26:49 +000011 self.results = []
mblighc5ddfd12008-08-04 17:15:00 +000012
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)
mbligh53da18e2009-01-05 21:13:26 +000016 utils.extract_tarball_to_dir(tarball, self.srcdir)
jadmanski0afbb632008-06-06 21:10:57 +000017 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))
Eric Li6f27d4f2010-09-29 10:55:17 -070028 utils.make('-j %d' % utils.count_cpus())
mblighafce1032007-10-31 21:29:29 +000029
30
mbligh057c2bd2008-08-28 18:26:49 +000031 def run_once(self, db_type = 'pgsql', build = 1, \
mbligh53da18e2009-01-05 21:13:26 +000032 num_threads = utils.count_cpus(), max_time = 60, \
jadmanski0afbb632008-06-06 21:10:57 +000033 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')
mbligh53da18e2009-01-05 21:13:26 +000036 ld_path = utils.prepend_path(plib,
37 utils.environ('LD_LIBRARY_PATH'))
38 ld_path = 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
mbligh057c2bd2008-08-28 18:26:49 +000093 self.results.append(utils.system_output(cmd + ' run',
94 retain_output=True))
jadmanski29956512008-05-16 14:45:24 +000095
jadmanski0afbb632008-06-06 21:10:57 +000096 except:
97 utils.system(self.sudo + bin + '/pg_ctl -D ' + data + ' stop')
98 raise
mblighafce1032007-10-31 21:29:29 +000099
jadmanski0afbb632008-06-06 21:10:57 +0000100 utils.system(self.sudo + bin + '/pg_ctl -D ' + data + ' stop')
mblighafce1032007-10-31 21:29:29 +0000101
mblighafce1032007-10-31 21:29:29 +0000102
jadmanski0afbb632008-06-06 21:10:57 +0000103 def execute_mysql(self, build, num_threads, max_time, read_only, args):
104 bin = os.path.join(self.autodir, 'deps/mysql/mysql/bin')
105 data = os.path.join(self.autodir, 'deps/mysql/mysql/var')
106 log = os.path.join(self.debugdir, 'mysql.log')
mblighafce1032007-10-31 21:29:29 +0000107
jadmanski0afbb632008-06-06 21:10:57 +0000108 if build == 1:
109 utils.system('rm -rf ' + data)
110 os.mkdir(data)
111 os.chown(data, self.dbuid, 0)
112 utils.system(bin + '/mysql_install_db --user=' + self.dbuser)
mblighafce1032007-10-31 21:29:29 +0000113
jadmanski0afbb632008-06-06 21:10:57 +0000114 utils.system(bin + '/mysqld_safe --log-error=' + log + \
115 ' --user=' + self.dbuser + ' &')
mblighafce1032007-10-31 21:29:29 +0000116
jadmanski0afbb632008-06-06 21:10:57 +0000117 # Wait for database to start
118 time.sleep(5)
mblighafce1032007-10-31 21:29:29 +0000119
jadmanski0afbb632008-06-06 21:10:57 +0000120 try:
mbligh0804da92008-07-08 22:45:35 +0000121 base_cmd = self.srcdir + '/sysbench/sysbench --test=oltp ' \
mbligh8b352852008-06-07 01:07:08 +0000122 '--db-driver=mysql --mysql-user=root'
mblighafce1032007-10-31 21:29:29 +0000123
jadmanski0afbb632008-06-06 21:10:57 +0000124 if build == 1:
125 utils.system('echo "create database sbtest" | ' + \
126 bin + '/mysql -u root')
127 cmd = base_cmd +' prepare'
128 utils.system(cmd)
mblighafce1032007-10-31 21:29:29 +0000129
jadmanski0afbb632008-06-06 21:10:57 +0000130 cmd = base_cmd + \
131 ' --num-threads=' + str(num_threads) + \
132 ' --max-time=' + str(max_time) + \
133 ' --max-requests=0'
mblighafce1032007-10-31 21:29:29 +0000134
jadmanski0afbb632008-06-06 21:10:57 +0000135 if read_only:
136 cmd = cmd + ' --oltp-read-only=on'
mblighafce1032007-10-31 21:29:29 +0000137
mbligh057c2bd2008-08-28 18:26:49 +0000138 self.results.append(utils.system_output(cmd + ' run',
139 retain_output=True))
jadmanski29956512008-05-16 14:45:24 +0000140
jadmanski0afbb632008-06-06 21:10:57 +0000141 except:
142 utils.system(bin + '/mysqladmin shutdown')
143 raise
mblighafce1032007-10-31 21:29:29 +0000144
jadmanski0afbb632008-06-06 21:10:57 +0000145 utils.system(bin + '/mysqladmin shutdown')
mblighafce1032007-10-31 21:29:29 +0000146
mblighafce1032007-10-31 21:29:29 +0000147
mbligh057c2bd2008-08-28 18:26:49 +0000148 def postprocess(self):
149 self.__format_results("\n".join(self.results))
mblighafce1032007-10-31 21:29:29 +0000150
jadmanski0afbb632008-06-06 21:10:57 +0000151 def __format_results(self, results):
152 threads = 0
153 tps = 0
mblighafce1032007-10-31 21:29:29 +0000154
jadmanski0afbb632008-06-06 21:10:57 +0000155 out = open(self.resultsdir + '/keyval', 'w')
156 for line in results.split('\n'):
157 threads_re = re.search('Number of threads: (\d+)', line)
158 if threads_re:
159 threads = threads_re.group(1)
mblighafce1032007-10-31 21:29:29 +0000160
jadmanski0afbb632008-06-06 21:10:57 +0000161 tps_re = re.search('transactions:\s+\d+\s+\((\S+) per sec.\)', line)
162 if tps_re:
163 tps = tps_re.group(1)
164 break
mblighafce1032007-10-31 21:29:29 +0000165
lmr4c607f22009-06-02 11:50:38 +0000166 out.write('threads=%s\ntps=%s' % (threads, tps))
jadmanski0afbb632008-06-06 21:10:57 +0000167 out.close()