mbligh | 0804da9 | 2008-07-08 22:45:35 +0000 | [diff] [blame] | 1 | import os, time, re, pwd |
mbligh | 53da18e | 2009-01-05 21:13:26 +0000 | [diff] [blame] | 2 | from autotest_lib.client.bin import test, utils |
| 3 | from autotest_lib.client.common_lib import error |
mbligh | 9f85792 | 2008-06-05 16:19:07 +0000 | [diff] [blame] | 4 | |
mbligh | afce103 | 2007-10-31 21:29:29 +0000 | [diff] [blame] | 5 | |
| 6 | class sysbench(test.test): |
jadmanski | 0afbb63 | 2008-06-06 21:10:57 +0000 | [diff] [blame] | 7 | version = 1 |
mbligh | afce103 | 2007-10-31 21:29:29 +0000 | [diff] [blame] | 8 | |
mbligh | c5ddfd1 | 2008-08-04 17:15:00 +0000 | [diff] [blame] | 9 | def initialize(self): |
| 10 | self.job.require_gcc() |
mbligh | 057c2bd | 2008-08-28 18:26:49 +0000 | [diff] [blame] | 11 | self.results = [] |
mbligh | c5ddfd1 | 2008-08-04 17:15:00 +0000 | [diff] [blame] | 12 | |
jadmanski | 0afbb63 | 2008-06-06 21:10:57 +0000 | [diff] [blame] | 13 | # http://osdn.dl.sourceforge.net/sourceforge/sysbench/sysbench-0.4.8.tar.gz |
| 14 | def setup(self, tarball = 'sysbench-0.4.8.tar.bz2'): |
mbligh | 8b35285 | 2008-06-07 01:07:08 +0000 | [diff] [blame] | 15 | tarball = utils.unmap_url(self.bindir, tarball, self.tmpdir) |
mbligh | 53da18e | 2009-01-05 21:13:26 +0000 | [diff] [blame] | 16 | utils.extract_tarball_to_dir(tarball, self.srcdir) |
jadmanski | 0afbb63 | 2008-06-06 21:10:57 +0000 | [diff] [blame] | 17 | self.job.setup_dep(['pgsql', 'mysql']) |
mbligh | afce103 | 2007-10-31 21:29:29 +0000 | [diff] [blame] | 18 | |
jadmanski | 0afbb63 | 2008-06-06 21:10:57 +0000 | [diff] [blame] | 19 | os.chdir(self.srcdir) |
mbligh | afce103 | 2007-10-31 21:29:29 +0000 | [diff] [blame] | 20 | |
jadmanski | 0afbb63 | 2008-06-06 21:10:57 +0000 | [diff] [blame] | 21 | pgsql_dir = os.path.join(self.autodir, 'deps/pgsql/pgsql') |
| 22 | mysql_dir = os.path.join(self.autodir, 'deps/mysql/mysql') |
mbligh | afce103 | 2007-10-31 21:29:29 +0000 | [diff] [blame] | 23 | |
jadmanski | 0afbb63 | 2008-06-06 21:10:57 +0000 | [diff] [blame] | 24 | # configure wants to get at pg_config, so add its path |
mbligh | 0804da9 | 2008-07-08 22:45:35 +0000 | [diff] [blame] | 25 | utils.system( |
| 26 | 'PATH=%s/bin:$PATH ./configure --with-mysql=%s --with-pgsql' |
| 27 | % (pgsql_dir, mysql_dir)) |
Eric Li | 6f27d4f | 2010-09-29 10:55:17 -0700 | [diff] [blame] | 28 | utils.make('-j %d' % utils.count_cpus()) |
mbligh | afce103 | 2007-10-31 21:29:29 +0000 | [diff] [blame] | 29 | |
| 30 | |
mbligh | 057c2bd | 2008-08-28 18:26:49 +0000 | [diff] [blame] | 31 | def run_once(self, db_type = 'pgsql', build = 1, \ |
mbligh | 53da18e | 2009-01-05 21:13:26 +0000 | [diff] [blame] | 32 | num_threads = utils.count_cpus(), max_time = 60, \ |
jadmanski | 0afbb63 | 2008-06-06 21:10:57 +0000 | [diff] [blame] | 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') |
mbligh | 53da18e | 2009-01-05 21:13:26 +0000 | [diff] [blame] | 36 | ld_path = utils.prepend_path(plib, |
| 37 | utils.environ('LD_LIBRARY_PATH')) |
| 38 | ld_path = utils.prepend_path(mlib, ld_path) |
jadmanski | 0afbb63 | 2008-06-06 21:10:57 +0000 | [diff] [blame] | 39 | os.environ['LD_LIBRARY_PATH'] = ld_path |
mbligh | afce103 | 2007-10-31 21:29:29 +0000 | [diff] [blame] | 40 | |
jadmanski | 0afbb63 | 2008-06-06 21:10:57 +0000 | [diff] [blame] | 41 | # 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 + ' ' |
mbligh | afce103 | 2007-10-31 21:29:29 +0000 | [diff] [blame] | 45 | |
jadmanski | 0afbb63 | 2008-06-06 21:10:57 +0000 | [diff] [blame] | 46 | # Check for nobody user |
| 47 | try: |
| 48 | utils.system(self.sudo + '/bin/true') |
| 49 | except: |
mbligh | 0804da9 | 2008-07-08 22:45:35 +0000 | [diff] [blame] | 50 | raise error.TestError('Unable to run as nobody') |
mbligh | afce103 | 2007-10-31 21:29:29 +0000 | [diff] [blame] | 51 | |
jadmanski | 0afbb63 | 2008-06-06 21:10:57 +0000 | [diff] [blame] | 52 | if (db_type == 'pgsql'): |
mbligh | 8b35285 | 2008-06-07 01:07:08 +0000 | [diff] [blame] | 53 | self.execute_pgsql(build, num_threads, max_time, read_only, args) |
jadmanski | 0afbb63 | 2008-06-06 21:10:57 +0000 | [diff] [blame] | 54 | elif (db_type == 'mysql'): |
mbligh | 8b35285 | 2008-06-07 01:07:08 +0000 | [diff] [blame] | 55 | self.execute_mysql(build, num_threads, max_time, read_only, args) |
mbligh | afce103 | 2007-10-31 21:29:29 +0000 | [diff] [blame] | 56 | |
| 57 | |
jadmanski | 0afbb63 | 2008-06-06 21:10:57 +0000 | [diff] [blame] | 58 | 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') |
mbligh | afce103 | 2007-10-31 21:29:29 +0000 | [diff] [blame] | 62 | |
jadmanski | 0afbb63 | 2008-06-06 21:10:57 +0000 | [diff] [blame] | 63 | 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) |
mbligh | afce103 | 2007-10-31 21:29:29 +0000 | [diff] [blame] | 68 | |
jadmanski | 0afbb63 | 2008-06-06 21:10:57 +0000 | [diff] [blame] | 69 | # Database must be able to write its output into debugdir |
| 70 | os.chown(self.debugdir, self.dbuid, 0) |
mbligh | 8b35285 | 2008-06-07 01:07:08 +0000 | [diff] [blame] | 71 | utils.system(self.sudo + bin + '/pg_ctl -D %s -l %s start' %(data, log)) |
mbligh | afce103 | 2007-10-31 21:29:29 +0000 | [diff] [blame] | 72 | |
jadmanski | 0afbb63 | 2008-06-06 21:10:57 +0000 | [diff] [blame] | 73 | # Wait for database to start |
| 74 | time.sleep(5) |
mbligh | afce103 | 2007-10-31 21:29:29 +0000 | [diff] [blame] | 75 | |
jadmanski | 0afbb63 | 2008-06-06 21:10:57 +0000 | [diff] [blame] | 76 | try: |
mbligh | 0804da9 | 2008-07-08 22:45:35 +0000 | [diff] [blame] | 77 | base_cmd = self.srcdir + '/sysbench/sysbench --test=oltp ' \ |
mbligh | 8b35285 | 2008-06-07 01:07:08 +0000 | [diff] [blame] | 78 | '--db-driver=pgsql --pgsql-user=' + self.dbuser |
mbligh | afce103 | 2007-10-31 21:29:29 +0000 | [diff] [blame] | 79 | |
jadmanski | 0afbb63 | 2008-06-06 21:10:57 +0000 | [diff] [blame] | 80 | if build == 1: |
| 81 | utils.system(self.sudo + bin + '/createdb sbtest') |
| 82 | cmd = base_cmd +' prepare' |
| 83 | utils.system(cmd) |
mbligh | afce103 | 2007-10-31 21:29:29 +0000 | [diff] [blame] | 84 | |
jadmanski | 0afbb63 | 2008-06-06 21:10:57 +0000 | [diff] [blame] | 85 | cmd = base_cmd + \ |
| 86 | ' --num-threads=' + str(num_threads) + \ |
| 87 | ' --max-time=' + str(max_time) + \ |
| 88 | ' --max-requests=0' |
mbligh | afce103 | 2007-10-31 21:29:29 +0000 | [diff] [blame] | 89 | |
jadmanski | 0afbb63 | 2008-06-06 21:10:57 +0000 | [diff] [blame] | 90 | if read_only: |
| 91 | cmd = cmd + ' --oltp-read-only=on' |
mbligh | afce103 | 2007-10-31 21:29:29 +0000 | [diff] [blame] | 92 | |
mbligh | 057c2bd | 2008-08-28 18:26:49 +0000 | [diff] [blame] | 93 | self.results.append(utils.system_output(cmd + ' run', |
| 94 | retain_output=True)) |
jadmanski | 2995651 | 2008-05-16 14:45:24 +0000 | [diff] [blame] | 95 | |
jadmanski | 0afbb63 | 2008-06-06 21:10:57 +0000 | [diff] [blame] | 96 | except: |
| 97 | utils.system(self.sudo + bin + '/pg_ctl -D ' + data + ' stop') |
| 98 | raise |
mbligh | afce103 | 2007-10-31 21:29:29 +0000 | [diff] [blame] | 99 | |
jadmanski | 0afbb63 | 2008-06-06 21:10:57 +0000 | [diff] [blame] | 100 | utils.system(self.sudo + bin + '/pg_ctl -D ' + data + ' stop') |
mbligh | afce103 | 2007-10-31 21:29:29 +0000 | [diff] [blame] | 101 | |
mbligh | afce103 | 2007-10-31 21:29:29 +0000 | [diff] [blame] | 102 | |
jadmanski | 0afbb63 | 2008-06-06 21:10:57 +0000 | [diff] [blame] | 103 | 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') |
mbligh | afce103 | 2007-10-31 21:29:29 +0000 | [diff] [blame] | 107 | |
jadmanski | 0afbb63 | 2008-06-06 21:10:57 +0000 | [diff] [blame] | 108 | 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) |
mbligh | afce103 | 2007-10-31 21:29:29 +0000 | [diff] [blame] | 113 | |
jadmanski | 0afbb63 | 2008-06-06 21:10:57 +0000 | [diff] [blame] | 114 | utils.system(bin + '/mysqld_safe --log-error=' + log + \ |
| 115 | ' --user=' + self.dbuser + ' &') |
mbligh | afce103 | 2007-10-31 21:29:29 +0000 | [diff] [blame] | 116 | |
jadmanski | 0afbb63 | 2008-06-06 21:10:57 +0000 | [diff] [blame] | 117 | # Wait for database to start |
| 118 | time.sleep(5) |
mbligh | afce103 | 2007-10-31 21:29:29 +0000 | [diff] [blame] | 119 | |
jadmanski | 0afbb63 | 2008-06-06 21:10:57 +0000 | [diff] [blame] | 120 | try: |
mbligh | 0804da9 | 2008-07-08 22:45:35 +0000 | [diff] [blame] | 121 | base_cmd = self.srcdir + '/sysbench/sysbench --test=oltp ' \ |
mbligh | 8b35285 | 2008-06-07 01:07:08 +0000 | [diff] [blame] | 122 | '--db-driver=mysql --mysql-user=root' |
mbligh | afce103 | 2007-10-31 21:29:29 +0000 | [diff] [blame] | 123 | |
jadmanski | 0afbb63 | 2008-06-06 21:10:57 +0000 | [diff] [blame] | 124 | if build == 1: |
| 125 | utils.system('echo "create database sbtest" | ' + \ |
| 126 | bin + '/mysql -u root') |
| 127 | cmd = base_cmd +' prepare' |
| 128 | utils.system(cmd) |
mbligh | afce103 | 2007-10-31 21:29:29 +0000 | [diff] [blame] | 129 | |
jadmanski | 0afbb63 | 2008-06-06 21:10:57 +0000 | [diff] [blame] | 130 | cmd = base_cmd + \ |
| 131 | ' --num-threads=' + str(num_threads) + \ |
| 132 | ' --max-time=' + str(max_time) + \ |
| 133 | ' --max-requests=0' |
mbligh | afce103 | 2007-10-31 21:29:29 +0000 | [diff] [blame] | 134 | |
jadmanski | 0afbb63 | 2008-06-06 21:10:57 +0000 | [diff] [blame] | 135 | if read_only: |
| 136 | cmd = cmd + ' --oltp-read-only=on' |
mbligh | afce103 | 2007-10-31 21:29:29 +0000 | [diff] [blame] | 137 | |
mbligh | 057c2bd | 2008-08-28 18:26:49 +0000 | [diff] [blame] | 138 | self.results.append(utils.system_output(cmd + ' run', |
| 139 | retain_output=True)) |
jadmanski | 2995651 | 2008-05-16 14:45:24 +0000 | [diff] [blame] | 140 | |
jadmanski | 0afbb63 | 2008-06-06 21:10:57 +0000 | [diff] [blame] | 141 | except: |
| 142 | utils.system(bin + '/mysqladmin shutdown') |
| 143 | raise |
mbligh | afce103 | 2007-10-31 21:29:29 +0000 | [diff] [blame] | 144 | |
jadmanski | 0afbb63 | 2008-06-06 21:10:57 +0000 | [diff] [blame] | 145 | utils.system(bin + '/mysqladmin shutdown') |
mbligh | afce103 | 2007-10-31 21:29:29 +0000 | [diff] [blame] | 146 | |
mbligh | afce103 | 2007-10-31 21:29:29 +0000 | [diff] [blame] | 147 | |
mbligh | 057c2bd | 2008-08-28 18:26:49 +0000 | [diff] [blame] | 148 | def postprocess(self): |
| 149 | self.__format_results("\n".join(self.results)) |
mbligh | afce103 | 2007-10-31 21:29:29 +0000 | [diff] [blame] | 150 | |
jadmanski | 0afbb63 | 2008-06-06 21:10:57 +0000 | [diff] [blame] | 151 | def __format_results(self, results): |
| 152 | threads = 0 |
| 153 | tps = 0 |
mbligh | afce103 | 2007-10-31 21:29:29 +0000 | [diff] [blame] | 154 | |
jadmanski | 0afbb63 | 2008-06-06 21:10:57 +0000 | [diff] [blame] | 155 | 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) |
mbligh | afce103 | 2007-10-31 21:29:29 +0000 | [diff] [blame] | 160 | |
jadmanski | 0afbb63 | 2008-06-06 21:10:57 +0000 | [diff] [blame] | 161 | tps_re = re.search('transactions:\s+\d+\s+\((\S+) per sec.\)', line) |
| 162 | if tps_re: |
| 163 | tps = tps_re.group(1) |
| 164 | break |
mbligh | afce103 | 2007-10-31 21:29:29 +0000 | [diff] [blame] | 165 | |
lmr | 4c607f2 | 2009-06-02 11:50:38 +0000 | [diff] [blame] | 166 | out.write('threads=%s\ntps=%s' % (threads, tps)) |
jadmanski | 0afbb63 | 2008-06-06 21:10:57 +0000 | [diff] [blame] | 167 | out.close() |