mbligh | 9f85792 | 2008-06-05 16:19:07 +0000 | [diff] [blame^] | 1 | import time, re, pwd |
| 2 | from autotest_lib.client.bin import test, autotest_utils |
| 3 | from autotest_lib.client.common_lib import utils |
| 4 | |
mbligh | afce103 | 2007-10-31 21:29:29 +0000 | [diff] [blame] | 5 | |
| 6 | class 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'): |
mbligh | 9f85792 | 2008-06-05 16:19:07 +0000 | [diff] [blame^] | 11 | tarball = autotest_utils.unmap_url(self.bindir, tarball, |
| 12 | self.tmpdir) |
| 13 | autotest_utils.extract_tarball_to_dir(tarball, self.srcdir) |
mbligh | afce103 | 2007-10-31 21:29:29 +0000 | [diff] [blame] | 14 | 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 |
mbligh | 9f85792 | 2008-06-05 16:19:07 +0000 | [diff] [blame^] | 22 | utils.system('PATH=%s/bin:$PATH ./configure --with-mysql=%s --with-pgsql' % (pgsql_dir, mysql_dir)) |
| 23 | utils.system('make -j %d' % count_cpus()) |
mbligh | afce103 | 2007-10-31 21:29:29 +0000 | [diff] [blame] | 24 | |
| 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: |
mbligh | 9f85792 | 2008-06-05 16:19:07 +0000 | [diff] [blame^] | 42 | utils.system(self.sudo + '/bin/true') |
mbligh | afce103 | 2007-10-31 21:29:29 +0000 | [diff] [blame] | 43 | except: |
mbligh | 642b03e | 2008-01-14 16:53:15 +0000 | [diff] [blame] | 44 | raise TestError('Unable to run as nobody') |
mbligh | afce103 | 2007-10-31 21:29:29 +0000 | [diff] [blame] | 45 | |
| 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: |
mbligh | 9f85792 | 2008-06-05 16:19:07 +0000 | [diff] [blame^] | 60 | utils.system('rm -rf ' + data) |
mbligh | afce103 | 2007-10-31 21:29:29 +0000 | [diff] [blame] | 61 | os.mkdir(data) |
| 62 | os.chown(data, self.dbuid, 0) |
mbligh | 9f85792 | 2008-06-05 16:19:07 +0000 | [diff] [blame^] | 63 | utils.system(self.sudo + bin + '/initdb -D ' + data) |
mbligh | afce103 | 2007-10-31 21:29:29 +0000 | [diff] [blame] | 64 | |
| 65 | # Database must be able to write its output into debugdir |
| 66 | os.chown(self.debugdir, self.dbuid, 0) |
mbligh | 9f85792 | 2008-06-05 16:19:07 +0000 | [diff] [blame^] | 67 | utils.system(self.sudo + bin + '/pg_ctl -D ' + data + \ |
mbligh | afce103 | 2007-10-31 21:29:29 +0000 | [diff] [blame] | 68 | ' -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: |
mbligh | 9f85792 | 2008-06-05 16:19:07 +0000 | [diff] [blame^] | 79 | utils.system(self.sudo + bin + '/createdb sbtest') |
mbligh | afce103 | 2007-10-31 21:29:29 +0000 | [diff] [blame] | 80 | cmd = base_cmd +' prepare' |
mbligh | 9f85792 | 2008-06-05 16:19:07 +0000 | [diff] [blame^] | 81 | utils.system(cmd) |
mbligh | afce103 | 2007-10-31 21:29:29 +0000 | [diff] [blame] | 82 | |
| 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 | |
jadmanski | 2995651 | 2008-05-16 14:45:24 +0000 | [diff] [blame] | 91 | results = [] |
| 92 | |
mbligh | afce103 | 2007-10-31 21:29:29 +0000 | [diff] [blame] | 93 | profilers = self.job.profilers |
mbligh | 642b03e | 2008-01-14 16:53:15 +0000 | [diff] [blame] | 94 | if not profilers.only(): |
mbligh | 9f85792 | 2008-06-05 16:19:07 +0000 | [diff] [blame^] | 95 | results.append(utils.system_output(cmd + ' run', |
jadmanski | 2995651 | 2008-05-16 14:45:24 +0000 | [diff] [blame] | 96 | retain_output=True)) |
mbligh | afce103 | 2007-10-31 21:29:29 +0000 | [diff] [blame] | 97 | |
| 98 | # Do a profiling run if necessary |
| 99 | if profilers.present(): |
| 100 | profilers.start(self) |
jadmanski | 2995651 | 2008-05-16 14:45:24 +0000 | [diff] [blame] | 101 | results.append("Profiling run ...") |
mbligh | 9f85792 | 2008-06-05 16:19:07 +0000 | [diff] [blame^] | 102 | results.append(utils.system_output(cmd + ' run', |
jadmanski | 2995651 | 2008-05-16 14:45:24 +0000 | [diff] [blame] | 103 | retain_output=True)) |
mbligh | afce103 | 2007-10-31 21:29:29 +0000 | [diff] [blame] | 104 | profilers.stop(self) |
| 105 | profilers.report(self) |
| 106 | except: |
mbligh | 9f85792 | 2008-06-05 16:19:07 +0000 | [diff] [blame^] | 107 | utils.system(self.sudo + bin + '/pg_ctl -D ' + data + ' stop') |
mbligh | ec75576 | 2008-01-17 16:25:22 +0000 | [diff] [blame] | 108 | raise |
mbligh | afce103 | 2007-10-31 21:29:29 +0000 | [diff] [blame] | 109 | |
mbligh | 9f85792 | 2008-06-05 16:19:07 +0000 | [diff] [blame^] | 110 | utils.system(self.sudo + bin + '/pg_ctl -D ' + data + ' stop') |
mbligh | afce103 | 2007-10-31 21:29:29 +0000 | [diff] [blame] | 111 | |
jadmanski | 2995651 | 2008-05-16 14:45:24 +0000 | [diff] [blame] | 112 | self.__format_results("\n".join(results)) |
mbligh | afce103 | 2007-10-31 21:29:29 +0000 | [diff] [blame] | 113 | |
| 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: |
mbligh | 9f85792 | 2008-06-05 16:19:07 +0000 | [diff] [blame^] | 121 | utils.system('rm -rf ' + data) |
mbligh | afce103 | 2007-10-31 21:29:29 +0000 | [diff] [blame] | 122 | os.mkdir(data) |
| 123 | os.chown(data, self.dbuid, 0) |
mbligh | 9f85792 | 2008-06-05 16:19:07 +0000 | [diff] [blame^] | 124 | utils.system(bin + '/mysql_install_db --user=' + self.dbuser) |
mbligh | afce103 | 2007-10-31 21:29:29 +0000 | [diff] [blame] | 125 | |
mbligh | 9f85792 | 2008-06-05 16:19:07 +0000 | [diff] [blame^] | 126 | utils.system(bin + '/mysqld_safe --log-error=' + log + \ |
mbligh | afce103 | 2007-10-31 21:29:29 +0000 | [diff] [blame] | 127 | ' --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: |
mbligh | 9f85792 | 2008-06-05 16:19:07 +0000 | [diff] [blame^] | 138 | utils.system('echo "create database sbtest" | ' + \ |
mbligh | afce103 | 2007-10-31 21:29:29 +0000 | [diff] [blame] | 139 | bin + '/mysql -u root') |
| 140 | cmd = base_cmd +' prepare' |
mbligh | 9f85792 | 2008-06-05 16:19:07 +0000 | [diff] [blame^] | 141 | utils.system(cmd) |
mbligh | afce103 | 2007-10-31 21:29:29 +0000 | [diff] [blame] | 142 | |
| 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 | |
jadmanski | 2995651 | 2008-05-16 14:45:24 +0000 | [diff] [blame] | 151 | results = [] |
| 152 | |
mbligh | afce103 | 2007-10-31 21:29:29 +0000 | [diff] [blame] | 153 | profilers = self.job.profilers |
| 154 | if not profilers.only(): |
mbligh | 9f85792 | 2008-06-05 16:19:07 +0000 | [diff] [blame^] | 155 | results.append(utils.system_output(cmd + ' run', |
jadmanski | 2995651 | 2008-05-16 14:45:24 +0000 | [diff] [blame] | 156 | retain_output=True)) |
mbligh | afce103 | 2007-10-31 21:29:29 +0000 | [diff] [blame] | 157 | |
| 158 | # Do a profiling run if necessary |
| 159 | if profilers.present(): |
| 160 | profilers.start(self) |
jadmanski | 2995651 | 2008-05-16 14:45:24 +0000 | [diff] [blame] | 161 | results.append("Profiling run ...") |
mbligh | 9f85792 | 2008-06-05 16:19:07 +0000 | [diff] [blame^] | 162 | results.append(utils.system_output(cmd + ' run', |
jadmanski | 2995651 | 2008-05-16 14:45:24 +0000 | [diff] [blame] | 163 | retain_output=True)) |
mbligh | afce103 | 2007-10-31 21:29:29 +0000 | [diff] [blame] | 164 | profilers.stop(self) |
| 165 | profilers.report(self) |
| 166 | except: |
mbligh | 9f85792 | 2008-06-05 16:19:07 +0000 | [diff] [blame^] | 167 | utils.system(bin + '/mysqladmin shutdown') |
mbligh | ec75576 | 2008-01-17 16:25:22 +0000 | [diff] [blame] | 168 | raise |
mbligh | afce103 | 2007-10-31 21:29:29 +0000 | [diff] [blame] | 169 | |
mbligh | 9f85792 | 2008-06-05 16:19:07 +0000 | [diff] [blame^] | 170 | utils.system(bin + '/mysqladmin shutdown') |
mbligh | afce103 | 2007-10-31 21:29:29 +0000 | [diff] [blame] | 171 | |
jadmanski | 2995651 | 2008-05-16 14:45:24 +0000 | [diff] [blame] | 172 | self.__format_results("\n".join(results)) |
mbligh | afce103 | 2007-10-31 21:29:29 +0000 | [diff] [blame] | 173 | |
| 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() |