Merge lp:~akopytov/percona-xtrabackup/test-suite-cleanups-2.1 into lp:percona-xtrabackup/2.1
- test-suite-cleanups-2.1
- Merge into 2.1
Proposed by
Alexey Kopytov
Status: | Merged | ||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Approved by: | Alexey Kopytov | ||||||||||||||||||||||||
Approved revision: | no longer in the source branch. | ||||||||||||||||||||||||
Merged at revision: | 625 | ||||||||||||||||||||||||
Proposed branch: | lp:~akopytov/percona-xtrabackup/test-suite-cleanups-2.1 | ||||||||||||||||||||||||
Merge into: | lp:percona-xtrabackup/2.1 | ||||||||||||||||||||||||
Diff against target: |
1868 lines (+804/-631) 18 files modified
patches/innodb56.patch (+17/-1) src/xtrabackup.cc (+6/-14) test/inc/common.sh (+104/-68) test/run.sh (+653/-96) test/subunit.sh (+4/-1) test/t/bug1085099.sh (+1/-3) test/t/bug664986.sh (+0/-8) test/t/bug996493.sh (+0/-4) test/t/compact_compressed.sh (+10/-5) test/t/ib_stream_incremental.sh (+1/-1) test/t/remote_tablespaces.sh (+1/-1) test/t/undo_tablespaces.sh (+1/-1) test/t/xb_encrypt.sh (+0/-2) test/t/xb_part_range.sh (+2/-12) test/t/xb_perm_basic.sh (+0/-2) test/t/xb_perm_stream.sh (+0/-2) test/t/xb_stats_datadir.sh (+4/-5) test/testrun.c (+0/-405) |
||||||||||||||||||||||||
To merge this branch: | bzr merge lp:~akopytov/percona-xtrabackup/test-suite-cleanups-2.1 | ||||||||||||||||||||||||
Related bugs: |
|
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
George Ormond Lorch III (community) | g2 | Approve | |
Stewart Smith | Pending | ||
Review via email:
|
Commit message
Description of the change
To post a comment you must log in.
Revision history for this message
![](/+icing/build/overlay/assets/skins/sam/images/close.gif)
Alexey Kopytov (akopytov) wrote : | # |
Revision history for this message
![](/+icing/build/overlay/assets/skins/sam/images/close.gif)
Alexey Kopytov (akopytov) wrote : | # |
Would be nice to have this merged sooner rather than later, as I have a pile of other fixes which depends on this branch.
Revision history for this message
![](/+icing/build/overlay/assets/skins/sam/images/close.gif)
George Ormond Lorch III (gl-az) wrote : | # |
Same comments as 2.0 MP, nice work!
review:
Approve
(g2)
Preview Diff
[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1 | === modified file 'patches/innodb56.patch' |
2 | --- patches/innodb56.patch 2013-07-01 12:21:20 +0000 |
3 | +++ patches/innodb56.patch 2013-07-04 07:51:31 +0000 |
4 | @@ -1431,4 +1431,20 @@ |
5 | int main() |
6 | { |
7 | extern void __attribute__((weak)) foo(void); |
8 | - |
9 | +--- a/mysys/my_thr_init.c |
10 | ++++ b/mysys/my_thr_init.c |
11 | +@@ -462,8 +462,12 @@ |
12 | + |
13 | + extern void **my_thread_var_dbug() |
14 | + { |
15 | +- struct st_my_thread_var *tmp= |
16 | +- my_pthread_getspecific(struct st_my_thread_var*,THR_KEY_mysys); |
17 | ++ struct st_my_thread_var *tmp; |
18 | ++ |
19 | ++ if (!my_thread_global_init_done) |
20 | ++ return NULL; |
21 | ++ |
22 | ++ tmp= my_pthread_getspecific(struct st_my_thread_var*,THR_KEY_mysys); |
23 | + return tmp && tmp->init ? &tmp->dbug : 0; |
24 | + } |
25 | + #endif /* DBUG_OFF */ |
26 | |
27 | === modified file 'src/xtrabackup.cc' |
28 | --- src/xtrabackup.cc 2013-06-18 14:49:01 +0000 |
29 | +++ src/xtrabackup.cc 2013-07-04 07:51:31 +0000 |
30 | @@ -3835,6 +3835,8 @@ |
31 | |
32 | ulint fold; |
33 | |
34 | + bool checkpoint_found; |
35 | + |
36 | max_no = ut_dulint_zero; |
37 | |
38 | if (!xb_init_log_block_size()) { |
39 | @@ -3949,6 +3951,8 @@ |
40 | // ' ', 4); |
41 | } |
42 | |
43 | + checkpoint_found = false; |
44 | + |
45 | /* read last checkpoint lsn */ |
46 | for (field = LOG_CHECKPOINT_1; field <= LOG_CHECKPOINT_2; |
47 | field += LOG_CHECKPOINT_2 - LOG_CHECKPOINT_1) { |
48 | @@ -3961,25 +3965,13 @@ |
49 | if (ut_dulint_cmp(checkpoint_no, max_no) >= 0) { |
50 | max_no = checkpoint_no; |
51 | max_lsn = MACH_READ_64(log_buf + field + LOG_CHECKPOINT_LSN); |
52 | -/* |
53 | - mach_write_to_4(log_buf + field + LOG_CHECKPOINT_OFFSET, |
54 | - LOG_FILE_HDR_SIZE + ut_dulint_minus(max_lsn, |
55 | - ut_dulint_align_down(max_lsn,OS_FILE_LOG_BLOCK_SIZE))); |
56 | - |
57 | - ulint fold; |
58 | - fold = ut_fold_binary(log_buf + field, LOG_CHECKPOINT_CHECKSUM_1); |
59 | - mach_write_to_4(log_buf + field + LOG_CHECKPOINT_CHECKSUM_1, fold); |
60 | - |
61 | - fold = ut_fold_binary(log_buf + field + LOG_CHECKPOINT_LSN, |
62 | - LOG_CHECKPOINT_CHECKSUM_2 - LOG_CHECKPOINT_LSN); |
63 | - mach_write_to_4(log_buf + field + LOG_CHECKPOINT_CHECKSUM_2, fold); |
64 | -*/ |
65 | + checkpoint_found = true; |
66 | } |
67 | not_consistent: |
68 | ; |
69 | } |
70 | |
71 | - if (ut_dulint_cmp(max_no, ut_dulint_zero) == 0) { |
72 | + if (!checkpoint_found) { |
73 | msg("xtrabackup: No valid checkpoint found.\n"); |
74 | goto error; |
75 | } |
76 | |
77 | === modified file 'test/inc/common.sh' |
78 | --- test/inc/common.sh 2013-06-28 15:23:23 +0000 |
79 | +++ test/inc/common.sh 2013-07-04 07:51:31 +0000 |
80 | @@ -16,9 +16,12 @@ |
81 | } |
82 | |
83 | |
84 | -function clean() |
85 | +######################################################################## |
86 | +# Remove server var* directories from the worker's var root |
87 | +######################################################################## |
88 | +function remove_var_dirs() |
89 | { |
90 | - rm -rf ${TEST_BASEDIR}/var[0-9] |
91 | + rm -rf ${TEST_VAR_ROOT}/var[0-9] |
92 | } |
93 | |
94 | function die() |
95 | @@ -34,29 +37,33 @@ |
96 | $MYSQL_INSTALL_DB --defaults-file=${MYSQLD_VARDIR}/my.cnf \ |
97 | --basedir=${MYSQL_BASEDIR} \ |
98 | ${MYSQLD_EXTRA_ARGS} |
99 | - cd - |
100 | + cd - >/dev/null 2>&1 |
101 | } |
102 | |
103 | ######################################################################## |
104 | -# Checks whether MySQL is alive |
105 | +# Checks whether MySQL with the PID specified as an argument is alive |
106 | ######################################################################## |
107 | function mysql_ping() |
108 | { |
109 | - $MYSQLADMIN $MYSQL_ARGS --wait=100 ping >/dev/null 2>&1 || return 1 |
110 | -} |
111 | + local pid=$1 |
112 | + local attempts=60 |
113 | + local i |
114 | |
115 | -function kill_leftovers() |
116 | -{ |
117 | - local file |
118 | - for file in ${TEST_BASEDIR}/mysqld*.pid |
119 | + for ((i=1; i<=attempts; i++)) |
120 | do |
121 | - if [ -f $file ] |
122 | - then |
123 | - vlog "Found a leftover mysqld processes with PID `cat $file`, stopping it" |
124 | - kill -9 `cat $file` 2>/dev/null || true |
125 | - rm -f $file |
126 | - fi |
127 | + $MYSQLADMIN $MYSQL_ARGS ping >/dev/null 2>&1 && return 0 |
128 | + sleep 1 |
129 | + # Is the server process still alive? |
130 | + if ! kill -0 $pid >/dev/null 2>&1 |
131 | + then |
132 | + vlog "Server process PID=$pid died." |
133 | + wait $pid |
134 | + return 1 |
135 | + fi |
136 | + vlog "Made $i attempts to connect to server" |
137 | done |
138 | + |
139 | + return 1 |
140 | } |
141 | |
142 | function run_cmd() |
143 | @@ -123,21 +130,14 @@ |
144 | local port |
145 | local lockfile |
146 | |
147 | - for (( port=PORT_BASE+id; port < 65535; port++)) |
148 | + for (( port=3307 + RANDOM; port < 65535; port++)) |
149 | do |
150 | lockfile="/tmp/xtrabackup_port_lock.$port" |
151 | # Try to atomically lock the current port number |
152 | - if ! set -C > $lockfile |
153 | + if ! (set -C; > $lockfile) |
154 | then |
155 | - set +C |
156 | - # check if the process still exists |
157 | - if kill -0 "`cat $lockfile`" |
158 | - then |
159 | - continue; |
160 | - fi |
161 | - # stale file, overwrite it with the current PID |
162 | + continue; |
163 | fi |
164 | - set +C |
165 | echo $$ > $lockfile |
166 | if ! nc -z -w1 localhost $port >/dev/null 2>&1 |
167 | then |
168 | @@ -173,14 +173,14 @@ |
169 | fi |
170 | |
171 | SRV_MYSQLD_IDS[$id]="$id" |
172 | - local vardir="${TEST_BASEDIR}/var${id}" |
173 | + local vardir="${TEST_VAR_ROOT}/var${id}" |
174 | SRV_MYSQLD_VARDIR[$id]="$vardir" |
175 | SRV_MYSQLD_DATADIR[$id]="$vardir/data" |
176 | SRV_MYSQLD_TMPDIR[$id]="$vardir/tmp" |
177 | - SRV_MYSQLD_PIDFILE[$id]="${TEST_BASEDIR}/mysqld${id}.pid" |
178 | + SRV_MYSQLD_PIDFILE[$id]="${TEST_VAR_ROOT}/mysqld${id}.pid" |
179 | SRV_MYSQLD_ERRFILE[$id]="$vardir/data/mysqld${id}.err" |
180 | SRV_MYSQLD_PORT[$id]=`get_free_port $id` |
181 | - SRV_MYSQLD_SOCKET[$id]=`mktemp -t xtrabackup.mysql.sock.XXXXXX` |
182 | + SRV_MYSQLD_SOCKET[$id]=`mktemp -t mysql.sock.XXXXXX` |
183 | } |
184 | |
185 | ######################################################################## |
186 | @@ -245,27 +245,36 @@ |
187 | function start_server_with_id() |
188 | { |
189 | local id=$1 |
190 | + local attempts=0 |
191 | + local max_attempts=5 |
192 | shift |
193 | |
194 | vlog "Starting server with id=$id..." |
195 | |
196 | - init_server_variables $id |
197 | - switch_server $id |
198 | - |
199 | - if [ ! -d "$MYSQLD_VARDIR" ] |
200 | - then |
201 | - vlog "Creating server root directory: $MYSQLD_VARDIR" |
202 | - mkdir "$MYSQLD_VARDIR" |
203 | - fi |
204 | - if [ ! -d "$MYSQLD_TMPDIR" ] |
205 | - then |
206 | - vlog "Creating server temporary directory: $MYSQLD_TMPDIR" |
207 | - mkdir "$MYSQLD_TMPDIR" |
208 | - fi |
209 | - |
210 | - # Create the configuration file used by mysql_install_db, the server |
211 | - # and the xtrabackup binary |
212 | - cat > ${MYSQLD_VARDIR}/my.cnf <<EOF |
213 | + while true |
214 | + do |
215 | + init_server_variables $id |
216 | + switch_server $id |
217 | + |
218 | + if [ ! -d "$MYSQLD_VARDIR" ] |
219 | + then |
220 | + vlog "Creating server root directory: $MYSQLD_VARDIR" |
221 | + mkdir "$MYSQLD_VARDIR" |
222 | + fi |
223 | + if [ ! -d "$MYSQLD_TMPDIR" ] |
224 | + then |
225 | + vlog "Creating server temporary directory: $MYSQLD_TMPDIR" |
226 | + mkdir "$MYSQLD_TMPDIR" |
227 | + fi |
228 | + |
229 | + if [ -f "$MYSQLD_ERRFILE" ] |
230 | + then |
231 | + rm "$MYSQLD_ERRFILE" |
232 | + fi |
233 | + |
234 | + # Create the configuration file used by mysql_install_db, the server |
235 | + # and the xtrabackup binary |
236 | + cat > ${MYSQLD_VARDIR}/my.cnf <<EOF |
237 | [mysqld] |
238 | socket=${MYSQLD_SOCKET} |
239 | port=${MYSQLD_PORT} |
240 | @@ -285,22 +294,42 @@ |
241 | user=root |
242 | EOF |
243 | |
244 | - # Create datadir and call mysql_install_db if it doesn't exist |
245 | - if [ ! -d "$MYSQLD_DATADIR" ] |
246 | - then |
247 | - vlog "Creating server data directory: $MYSQLD_DATADIR" |
248 | - mkdir -p "$MYSQLD_DATADIR" |
249 | - call_mysql_install_db |
250 | - fi |
251 | - |
252 | - # Start the server |
253 | - echo "Starting ${MYSQLD} ${MYSQLD_ARGS} $* " |
254 | - ${MYSQLD} ${MYSQLD_ARGS} $* & |
255 | - if ! mysql_ping |
256 | - then |
257 | - die "Can't start the server!" |
258 | - fi |
259 | - vlog "Server with id=$id has been started on port $MYSQLD_PORT, \ |
260 | + # Create datadir and call mysql_install_db if it doesn't exist |
261 | + if [ ! -d "$MYSQLD_DATADIR" ] |
262 | + then |
263 | + vlog "Creating server data directory: $MYSQLD_DATADIR" |
264 | + mkdir -p "$MYSQLD_DATADIR" |
265 | + call_mysql_install_db |
266 | + fi |
267 | + |
268 | + # Start the server |
269 | + echo "Starting ${MYSQLD} ${MYSQLD_ARGS} $* " |
270 | + ${MYSQLD} ${MYSQLD_ARGS} $* & |
271 | + if ! mysql_ping $! |
272 | + then |
273 | + if grep "another mysqld server running on port" $MYSQLD_ERRFILE |
274 | + then |
275 | + if ((++attempts < max_attempts)) |
276 | + then |
277 | + vlog "Made $attempts attempts to find a free port" |
278 | + reset_server_variables $id |
279 | + free_reserved_port $MYSQLD_PORT |
280 | + continue |
281 | + else |
282 | + vlog "Failed to find a free port after $attempts attempts" |
283 | + fi |
284 | + fi |
285 | + vlog "Can't start the server. Server log (if exists):" |
286 | + vlog "----------------" |
287 | + cat ${MYSQLD_ERRFILE} >&2 || true |
288 | + vlog "----------------" |
289 | + exit -1 |
290 | + else |
291 | + break |
292 | + fi |
293 | + done |
294 | + |
295 | + vlog "Server with id=$id has been started on port $MYSQLD_PORT, \ |
296 | socket $MYSQLD_SOCKET" |
297 | } |
298 | |
299 | @@ -317,7 +346,9 @@ |
300 | |
301 | if [ -f "${MYSQLD_PIDFILE}" ] |
302 | then |
303 | - kill -9 `cat ${MYSQLD_PIDFILE}` |
304 | + local pid=`cat $MYSQLD_PIDFILE` |
305 | + kill -9 $pid |
306 | + wait $pid || true |
307 | rm -f ${MYSQLD_PIDFILE} |
308 | else |
309 | vlog "Server PID file '${MYSQLD_PIDFILE}' doesn't exist!" |
310 | @@ -484,7 +515,8 @@ |
311 | ########################################################################## |
312 | function record_db_state() |
313 | { |
314 | - $MYSQLDUMP $MYSQL_ARGS -t --compact $1 >"$topdir/tmp/$1_old.sql" |
315 | + $MYSQLDUMP $MYSQL_ARGS -t --compact --skip-extended-insert \ |
316 | + $1 >"$topdir/tmp/$1_old.sql" |
317 | } |
318 | |
319 | |
320 | @@ -494,7 +526,8 @@ |
321 | ########################################################################## |
322 | function verify_db_state() |
323 | { |
324 | - $MYSQLDUMP $MYSQL_ARGS -t --compact $1 >"$topdir/tmp/$1_new.sql" |
325 | + $MYSQLDUMP $MYSQL_ARGS -t --compact --skip-extended-insert \ |
326 | + $1 >"$topdir/tmp/$1_new.sql" |
327 | diff -u "$topdir/tmp/$1_old.sql" "$topdir/tmp/$1_new.sql" |
328 | } |
329 | |
330 | @@ -514,14 +547,14 @@ |
331 | return ${PIPESTATUS[0]} |
332 | } |
333 | |
334 | -readonly xb_performed_bmp_inc_backup="xtrabackup: using the full scan for incremental backup" |
335 | -readonly xb_performed_full_scan_inc_backup="xtrabackup: using the changed page bitmap" |
336 | - |
337 | #################################################### |
338 | # Helper functions for testing incremental backups # |
339 | #################################################### |
340 | function check_full_scan_inc_backup() |
341 | { |
342 | + local xb_performed_bmp_inc_backup="xtrabackup: using the full scan for incremental backup" |
343 | + local xb_performed_full_scan_inc_backup="xtrabackup: using the changed page bitmap" |
344 | + |
345 | if ! grep -q "$xb_performed_bmp_inc_backup" $OUTFILE ; |
346 | then |
347 | vlog "xtrabackup did not perform a full scan for the incremental backup." |
348 | @@ -536,6 +569,9 @@ |
349 | |
350 | function check_bitmap_inc_backup() |
351 | { |
352 | + local xb_performed_bmp_inc_backup="xtrabackup: using the full scan for incremental backup" |
353 | + local xb_performed_full_scan_inc_backup="xtrabackup: using the changed page bitmap" |
354 | + |
355 | if ! grep -q "$xb_performed_full_scan_inc_backup" $OUTFILE ; |
356 | then |
357 | vlog "xtrabackup did not use bitmaps for the incremental backup." |
358 | |
359 | === removed file 'test/run.sh' |
360 | --- test/run.sh 2012-11-30 04:28:06 +0000 |
361 | +++ test/run.sh 1970-01-01 00:00:00 +0000 |
362 | @@ -1,14 +0,0 @@ |
363 | -#!/bin/bash |
364 | - |
365 | -XB_BUILD="autodetect" |
366 | -while getopts "fc:" options; do |
367 | - case $options in |
368 | - c ) XB_BUILD="$OPTARG";; |
369 | - f ) ;; # ignored |
370 | - esac |
371 | -done |
372 | - |
373 | -rm -rf results/ var/ test_results.subunit |
374 | - |
375 | -CFLAGS=-g make testrun |
376 | -./testrun -c $XB_BUILD |
377 | |
378 | === renamed file 'test/testrun.sh' => 'test/run.sh' |
379 | --- test/testrun.sh 2013-05-17 11:07:26 +0000 |
380 | +++ test/run.sh 2013-07-04 07:51:31 +0000 |
381 | @@ -2,14 +2,39 @@ |
382 | |
383 | export DEBUG= |
384 | |
385 | +shopt -s extglob |
386 | + |
387 | +set +e |
388 | + |
389 | . inc/common.sh |
390 | - |
391 | -trap kill_leftovers 1 2 3 15 |
392 | - |
393 | -set +e |
394 | +. subunit.sh |
395 | + |
396 | +trap cleanup_on_exit EXIT |
397 | +trap terminate SIGHUP SIGINT SIGQUIT SIGTERM |
398 | |
399 | result=0 |
400 | |
401 | +# Default test timeout in seconds |
402 | +TEST_TIMEOUT=600 |
403 | + |
404 | +# Magic exit code to indicate a skipped test |
405 | +export SKIPPED_EXIT_CODE=200 |
406 | + |
407 | +# Default server installation directory (-d option) |
408 | +MYSQL_BASEDIR=${MYSQL_BASEDIR:-"$PWD/server"} |
409 | + |
410 | +TEST_BASEDIR="$PWD" |
411 | +TEST_VAR_ROOT="$TEST_BASEDIR/var" |
412 | + |
413 | +# Global statistics |
414 | +FAILED_COUNT=0 |
415 | +FAILED_TESTS= |
416 | +SKIPPED_COUNT=0 |
417 | +SKIPPED_TESTS= |
418 | +SUCCESSFUL_COUNT=0 |
419 | +TOTAL_COUNT=0 |
420 | +TOTAL_TIME=0 |
421 | + |
422 | function usage() |
423 | { |
424 | cat <<EOF |
425 | @@ -24,7 +49,183 @@ |
426 | -c conf XtraBackup build configuration as specified to build.sh. |
427 | Default is 'autodetect', i.e. xtrabackup binary is determined based |
428 | on the MySQL version. |
429 | -EOF |
430 | +-j N Run tests in N parallel processes. |
431 | +-T seconds Test timeout (default is $TEST_TIMEOUT seconds). |
432 | +EOF |
433 | +} |
434 | + |
435 | +############################################################################### |
436 | +# Calculate the number of parallel workers automatically based on the number of |
437 | +# available cores |
438 | +############################################################################### |
439 | +function autocalc_nworkers() |
440 | +{ |
441 | + if [ -r /proc/cpuinfo ] |
442 | + then |
443 | + NWORKERS=`grep processor /proc/cpuinfo | wc -l` |
444 | + elif which sysctl >/dev/null 2>&1 |
445 | + then |
446 | + NWORKERS=`sysctl -n hw.ncpu` |
447 | + fi |
448 | + |
449 | + if [[ ! $NWORKERS =~ ^[0-9]+$ || $NWORKERS < 1 ]] |
450 | + then |
451 | + echo "Cannot determine the number of available CPU cures!" |
452 | + exit -1 |
453 | + fi |
454 | + |
455 | + if [ "$NWORKERS" -gt 16 ] |
456 | + then |
457 | + echo "Autodetected number of cores: $NWORKERS" |
458 | + echo "Limiting to 16 to avoid excessive resource consumption" |
459 | + |
460 | + NWORKERS=16 |
461 | + fi |
462 | +} |
463 | + |
464 | +############################################################################### |
465 | +# Kill a specified worker |
466 | +############################################################################### |
467 | +function kill_worker() |
468 | +{ |
469 | + local worker=$1 |
470 | + local pid=${worker_pids[$worker]} |
471 | + |
472 | + worker_pids[$worker]="" |
473 | + |
474 | + if ! kill -0 $pid >/dev/null 2>&1 |
475 | + then |
476 | + wait $pid >/dev/null 2>&1 || true |
477 | + return 0 |
478 | + fi |
479 | + |
480 | + # First send SIGTERM to let worker exit gracefully |
481 | + kill -SIGTERM $pid >/dev/null 2>&1 || true |
482 | + |
483 | + sleep 1 |
484 | + |
485 | + if ! kill -0 $pid >/dev/null 2>&1 |
486 | + then |
487 | + wait $pid >/dev/null 2>&1 || true |
488 | + return 0 |
489 | + fi |
490 | + |
491 | + # Now kill with SIGKILL |
492 | + kill -SIGKILL $pid >/dev/null 2>&1 || true |
493 | + wait $pid >/dev/null 2>&1 || true |
494 | + release_port_locks $pid |
495 | +} |
496 | + |
497 | +######################################################################## |
498 | +# Kill all running workers |
499 | +######################################################################## |
500 | +function kill_all_workers() |
501 | +{ |
502 | + while true |
503 | + do |
504 | + found="" |
505 | + |
506 | + # First send SIGTERM to let workers exit gracefully |
507 | + for ((i = 1; i <= NWORKERS; i++)) |
508 | + do |
509 | + [ -z ${worker_pids[$i]:-""} ] && continue |
510 | + |
511 | + found="yes" |
512 | + |
513 | + if ! kill -0 ${worker_pids[$i]} >/dev/null 2>&1 |
514 | + then |
515 | + worker_pids[$i]="" |
516 | + continue |
517 | + fi |
518 | + |
519 | + kill -SIGTERM ${worker_pids[$i]} >/dev/null 2>&1 || true |
520 | + done |
521 | + |
522 | + [ -z "$found" ] && break |
523 | + |
524 | + sleep 1 |
525 | + |
526 | + # Now kill with SIGKILL |
527 | + for ((i = 1; i <= NWORKERS; i++)) |
528 | + do |
529 | + [ -z ${worker_pids[$i]:-""} ] && continue |
530 | + |
531 | + if ! kill -0 ${worker_pids[$i]} >/dev/null 2>&1 |
532 | + then |
533 | + wait ${worker_pids[$i]} >/dev/null 2>&1 || true |
534 | + worker_pids[$i]="" |
535 | + continue |
536 | + fi |
537 | + |
538 | + kill -SIGKILL ${worker_pids[$i]} >/dev/null 2>&1 || true |
539 | + wait ${worker_pids[$i]} >/dev/null 2>&1 || true |
540 | + release_port_locks ${worker_pids[$i]} |
541 | + worker_pids[$i]="" |
542 | + done |
543 | + done |
544 | +} |
545 | + |
546 | +######################################################################## |
547 | +# Handler called from a fatal signal handler trap |
548 | +######################################################################## |
549 | +function terminate() |
550 | +{ |
551 | + echo "Terminated, cleaning up..." |
552 | + |
553 | + # The following will call cleanup_on_exit() |
554 | + exit 2 |
555 | +} |
556 | + |
557 | +######################################################################## |
558 | +# Display the test run summary and exit |
559 | +######################################################################## |
560 | +function print_status_and_exit() |
561 | +{ |
562 | + local test_time=$((`now` - TEST_START_TIME)) |
563 | + cat <<EOF |
564 | +============================================================================== |
565 | +Spent $TOTAL_TIME of $test_time seconds executing testcases |
566 | + |
567 | +SUMMARY: $TOTAL_COUNT run, $SUCCESSFUL_COUNT successful, $SKIPPED_COUNT skipped, $FAILED_COUNT failed |
568 | + |
569 | +EOF |
570 | + |
571 | + if [ -n "$SKIPPED_TESTS" ] |
572 | + then |
573 | + echo "Skipped tests: $SKIPPED_TESTS" |
574 | + echo |
575 | + fi |
576 | + |
577 | + if [ -n "$FAILED_TESTS" ] |
578 | + then |
579 | + echo "Failed tests: $FAILED_TESTS" |
580 | + echo |
581 | + fi |
582 | + |
583 | + echo "See results/ for detailed output" |
584 | + |
585 | + if [ "$FAILED_COUNT" = 0 ] |
586 | + then |
587 | + exit 0 |
588 | + fi |
589 | + |
590 | + exit 1 |
591 | +} |
592 | + |
593 | +######################################################################## |
594 | +# Cleanup procedure invoked on process exit |
595 | +######################################################################## |
596 | +function cleanup_on_exit() |
597 | +{ |
598 | + kill_servers $TEST_VAR_ROOT |
599 | + |
600 | + remove_var_dirs |
601 | + |
602 | + release_port_locks $$ |
603 | + |
604 | + kill_all_workers |
605 | + |
606 | + cleanup_all_workers |
607 | } |
608 | |
609 | function find_program() |
610 | @@ -52,12 +253,11 @@ |
611 | fi |
612 | } |
613 | |
614 | +######################################################################## |
615 | +# Explore environment and setup global variables |
616 | +######################################################################## |
617 | function set_vars() |
618 | { |
619 | - TEST_BASEDIR=${TEST_BASEDIR:-"$PWD"} |
620 | - MYSQL_BASEDIR=${MYSQL_BASEDIR:-"$PWD/server"} |
621 | - PORT_BASE=$((3306 + $RANDOM)) |
622 | - |
623 | if gnutar --version > /dev/null 2>&1 |
624 | then |
625 | TAR=gnutar |
626 | @@ -88,7 +288,7 @@ |
627 | fi |
628 | DYLD_LIBRARY_PATH="$LD_LIBRARY_PATH" |
629 | |
630 | - export TEST_BASEDIR PORT_BASE TAR MYSQL_BASEDIR MYSQL MYSQLD MYSQLADMIN \ |
631 | + export TAR MYSQL_BASEDIR MYSQL MYSQLD MYSQLADMIN \ |
632 | MYSQL_INSTALL_DB PATH LD_LIBRARY_PATH DYLD_LIBRARY_PATH MYSQLDUMP |
633 | } |
634 | |
635 | @@ -229,7 +429,7 @@ |
636 | return 1 |
637 | fi |
638 | |
639 | - stop_server |
640 | + stop_server >>$OUTFILE 2>&1 |
641 | |
642 | export MYSQL_VERSION MYSQL_VERSION_COMMENT MYSQL_FLAVOR \ |
643 | INNODB_VERSION XTRADB_VERSION INNODB_FLAVOR \ |
644 | @@ -237,39 +437,362 @@ |
645 | DEFAULT_IBDATA_SIZE XB_BUILD |
646 | } |
647 | |
648 | -export SKIPPED_EXIT_CODE=200 |
649 | +########################################################################### |
650 | +# Kill all server processes started by a worker specified with its var root |
651 | +# directory |
652 | +########################################################################### |
653 | +function kill_servers() |
654 | +{ |
655 | + local var_root=$1 |
656 | + local file |
657 | + |
658 | + [ -d $var_root ] || return 0 |
659 | + |
660 | + cd $var_root |
661 | + |
662 | + for file in mysqld*.pid |
663 | + do |
664 | + if [ -f $file ] |
665 | + then |
666 | + vlog "Found a leftover mysqld processes with PID `cat $file`, \ |
667 | +stopping it" |
668 | + kill -9 `cat $file` 2>/dev/null || true |
669 | + rm -f $file |
670 | + fi |
671 | + done |
672 | + |
673 | + cd - >/dev/null 2>&1 |
674 | +} |
675 | + |
676 | +########################################################################### |
677 | +# Kill all server processes started by a worker specified with its number |
678 | +########################################################################### |
679 | +function kill_servers_for_worker() |
680 | +{ |
681 | + local worker=$1 |
682 | + |
683 | + kill_servers $TEST_BASEDIR/var/w$worker |
684 | +} |
685 | + |
686 | +################################################################################ |
687 | +# Clean up all workers (except DEBUG_WORKER if set) We can't use worker* arrays |
688 | +# here and examine the directory structure, because the same functions is called |
689 | +# on startup when we want to cleanup all workers started on previous invokations |
690 | +################################################################################ |
691 | +function cleanup_all_workers() { local worker |
692 | + |
693 | + for worker_dir in $TEST_BASEDIR/var/w+([0-9]) |
694 | + do |
695 | + [ -d $worker_dir ] || continue |
696 | + [[ $worker_dir =~ w([0-9]+)$ ]] || continue |
697 | + |
698 | + worker=${BASH_REMATCH[1]} |
699 | + |
700 | + if [ "$worker" = "$DEBUG_WORKER" ] |
701 | + then |
702 | + echo |
703 | + echo "Skipping cleanup for worker #$worker due to debug mode." |
704 | + echo "You can do post-mortem analysis by examining test data in \ |
705 | +$worker_dir" |
706 | + echo "and the server process if it was running at the failure time." |
707 | + continue |
708 | + fi |
709 | + |
710 | + cleanup_worker $worker |
711 | + done |
712 | +} |
713 | +######################################################################## |
714 | +# Clean up a specified worker |
715 | +######################################################################## |
716 | +function cleanup_worker() |
717 | +{ |
718 | + local worker=$1 |
719 | + local tmpdir |
720 | + |
721 | + kill_servers_for_worker $worker >>$OUTFILE 2>&1 |
722 | + |
723 | + # It is possible that a file is created while rm is in progress |
724 | + # which results in "rm: cannot remove ...: Directory not empty |
725 | + # hence the loop below |
726 | + while true |
727 | + do |
728 | + # Fix permissions as some tests modify them so the following 'rm' fails |
729 | + chmod -R 0700 $TEST_BASEDIR/var/w$worker >/dev/null 2>&1 |
730 | + rm -rf $TEST_BASEDIR/var/w$worker && break |
731 | + done |
732 | + |
733 | + tmpdir=${worker_tmpdirs[$worker]:-""} |
734 | + if [ -n "$tmpdir" ] |
735 | + then |
736 | + rm -rf $tmpdir |
737 | + fi |
738 | +} |
739 | + |
740 | +######################################################################## |
741 | +# Return the number of seconds since the Epoch, UTC |
742 | +######################################################################## |
743 | +function now() |
744 | +{ |
745 | + date '+%s' |
746 | +} |
747 | + |
748 | +######################################################################## |
749 | +# Process the exit code of a specified worker |
750 | +######################################################################## |
751 | +function reap_worker() |
752 | +{ |
753 | + local worker=$1 |
754 | + local pid=${worker_pids[$worker]} |
755 | + local skip_file=${worker_skip_files[$worker]} |
756 | + local tpath=${worker_names[$worker]} |
757 | + local tname=`basename $tpath .sh` |
758 | + local test_time=$((`now` - worker_stime[$worker])) |
759 | + local status_file=${worker_status_files[$worker]} |
760 | + local rc |
761 | + |
762 | + if [ -f "$status_file" ] |
763 | + then |
764 | + rc=`cat $status_file` |
765 | + # Assume exit code 1 if status file is empty |
766 | + rc=${rc:-"1"} |
767 | + else |
768 | + # Assume exit code 1 if status file does not exist |
769 | + rc="1" |
770 | + fi |
771 | + |
772 | + printf "%-40s w%d\t" $tname $worker |
773 | + |
774 | + ((TOTAL_TIME+=test_time)) |
775 | + |
776 | + # Have to call subunit_start_test here, as currently tests cannot be |
777 | + # interleaved in the subunit output |
778 | + subunit_start_test $tpath "${worker_stime_txt[$worker]}" >> $SUBUNIT_OUT |
779 | + |
780 | + if [ $rc -eq 0 ] |
781 | + then |
782 | + echo "[passed] $test_time" |
783 | + |
784 | + SUCCESSFUL_COUNT=$((SUCCESSFUL_COUNT + 1)) |
785 | + subunit_pass_test $tpath >> $SUBUNIT_OUT |
786 | + |
787 | + cleanup_worker $worker |
788 | + elif [ $rc -eq $SKIPPED_EXIT_CODE ] |
789 | + then |
790 | + sreason="" |
791 | + test -r $skip_file && sreason=`cat $skip_file` |
792 | + |
793 | + SKIPPED_COUNT=$((SKIPPED_COUNT + 1)) |
794 | + SKIPPED_TESTS="$SKIPPED_TESTS $tname" |
795 | + |
796 | + echo "[skipped] $sreason" |
797 | + |
798 | + subunit_skip_test $tpath >> $SUBUNIT_OUT |
799 | + |
800 | + cleanup_worker $worker |
801 | + else |
802 | + echo "[failed] $test_time" |
803 | + |
804 | + ( |
805 | + (echo "Something went wrong running $tpath. Exited with $rc"; |
806 | + echo; echo; cat ${worker_outfiles[$worker]} |
807 | + ) | subunit_fail_test $tpath |
808 | + ) >> $SUBUNIT_OUT |
809 | + |
810 | + FAILED_COUNT=$((FAILED_COUNT + 1)) |
811 | + FAILED_TESTS="$FAILED_TESTS $tname" |
812 | + |
813 | + # Return 0 on failed tests in the -f mode |
814 | + if [ -z "$force" ] |
815 | + then |
816 | + |
817 | + if [ -z "$DEBUG" ] |
818 | + then |
819 | + cleanup_worker $worker |
820 | + else |
821 | + DEBUG_WORKER=$worker |
822 | + fi |
823 | + |
824 | + return 1 |
825 | + else |
826 | + cleanup_worker $worker |
827 | + |
828 | + return 0 |
829 | + fi |
830 | + fi |
831 | + |
832 | +} |
833 | + |
834 | +############################################################################# |
835 | +# Check if a specified worker has exceed TEST_TIMEOUT and if so, terminate it |
836 | +############################################################################# |
837 | +function check_timeout_for_worker() |
838 | +{ |
839 | + local worker=$1 |
840 | + local tpath=${worker_names[$worker]} |
841 | + local tname=`basename $tpath .sh` |
842 | + |
843 | + if (( `now` - worker_stime[$worker] > TEST_TIMEOUT )) |
844 | + then |
845 | + kill_worker $worker |
846 | + printf "%-40s w%d\t" $tname $worker |
847 | + echo "[failed] Timed out after $TEST_TIMEOUT seconds." |
848 | + |
849 | + ( |
850 | + # Have to call subunit_start_test here, as currently tests cannot be |
851 | + # interleaved in the subunit output |
852 | + subunit_start_test $tpath "${worker_stime_txt[$worker]}" |
853 | + |
854 | + (echo "Timeout exceeded running $tpath."; |
855 | + echo; echo; cat ${worker_outfiles[$worker]} |
856 | + ) | subunit_fail_test $tpath |
857 | + ) >> $SUBUNIT_OUT |
858 | + |
859 | + FAILED_COUNT=$((FAILED_COUNT + 1)) |
860 | + FAILED_TESTS="$FAILED_TESTS $tname" |
861 | + |
862 | + # Return 0 on failed tests in the -f mode |
863 | + if [ -z "$force" ] |
864 | + then |
865 | + |
866 | + if [ -z "$DEBUG" ] |
867 | + then |
868 | + cleanup_worker $worker |
869 | + else |
870 | + DEBUG_WORKER=$worker |
871 | + fi |
872 | + |
873 | + return 1 |
874 | + else |
875 | + cleanup_worker $worker |
876 | + |
877 | + return 0 |
878 | + fi |
879 | + fi |
880 | +} |
881 | +######################################################################### |
882 | +# Wait for all currently running worker to finish |
883 | +######################################################################### |
884 | +function reap_all_workers() |
885 | +{ |
886 | + while true |
887 | + do |
888 | + found="" |
889 | + |
890 | + for ((i = 1; i <= NWORKERS; i++)) |
891 | + do |
892 | + [ -z ${worker_pids[$i]:-""} ] && continue |
893 | + |
894 | + found="yes" |
895 | + |
896 | + # Check if it's alive |
897 | + if kill -0 ${worker_pids[$i]} >/dev/null 2>&1 |
898 | + then |
899 | + check_timeout_for_worker $i || print_status_and_exit |
900 | + continue |
901 | + fi |
902 | + |
903 | + reap_worker $i || print_status_and_exit |
904 | + |
905 | + worker_pids[$i]="" |
906 | + done |
907 | + |
908 | + [ -z "$found" ] && break |
909 | + |
910 | + sleep 1 |
911 | + done |
912 | +} |
913 | + |
914 | +######################################################################## |
915 | +# Release all port locks reserved by the current process |
916 | +# Used by the EXIT trap (in both normal and abnormal shell termination) |
917 | +######################################################################## |
918 | +function release_port_locks() |
919 | +{ |
920 | + local process=$1 |
921 | + local lockfile |
922 | + |
923 | + # Suppress errors when no port lock files are found |
924 | + shopt -s nullglob |
925 | + |
926 | + for lockfile in /tmp/xtrabackup_port_lock.* |
927 | + do |
928 | + if [ "`cat $lockfile 2>/dev/null`" = $process ] |
929 | + then |
930 | + rm -rf $lockfile |
931 | + fi |
932 | + done |
933 | + |
934 | + shopt -u nullglob |
935 | +} |
936 | + |
937 | +######################################################################## |
938 | +# Report status and release port locks on exit |
939 | +######################################################################## |
940 | +function cleanup_on_test_exit() |
941 | +{ |
942 | + local rc=$? |
943 | + |
944 | + echo $rc > $STATUS_FILE |
945 | + |
946 | + release_port_locks $$ |
947 | +} |
948 | + |
949 | +######################################################################## |
950 | +# Script body |
951 | +######################################################################## |
952 | + |
953 | +TEST_START_TIME=`now` |
954 | |
955 | tname="" |
956 | XTRACE_OPTION="" |
957 | XB_BUILD="autodetect" |
958 | force="" |
959 | -KEEP_RESULTS=0 |
960 | SUBUNIT_OUT=test_results.subunit |
961 | - |
962 | -while getopts "fgh?:t:s:d:c:b:nr:" options; do |
963 | - case $options in |
964 | - f ) force="yes";; |
965 | - t ) tname="$OPTARG";; |
966 | - g ) XTRACE_OPTION="-x"; DEBUG=on;; |
967 | - h ) usage; exit;; |
968 | - s ) tname="$OPTARG/*.sh";; |
969 | - d ) export MYSQL_BASEDIR="$OPTARG";; |
970 | - b ) TEST_BASEDIR="$OPTARG";; |
971 | - c ) XB_BUILD="$OPTARG";; |
972 | - n ) KEEP_RESULTS=1;; |
973 | - r ) SUBUNIT_OUT="$OPTARG";; |
974 | - ? ) echo "Use \`$0 -h' for the list of available options." |
975 | +NWORKERS= |
976 | +DEBUG_WORKER="" |
977 | + |
978 | +while getopts "fgh?:t:s:d:c:j:T:" options; do |
979 | + case $options in |
980 | + f ) force="yes";; |
981 | + t ) |
982 | + |
983 | + tname="$OPTARG"; |
984 | + if ! [ -r "$tname" ] |
985 | + then |
986 | + echo "Cannot find test $tname." |
987 | + exit -1 |
988 | + fi |
989 | + ;; |
990 | + |
991 | + g ) DEBUG=on;; |
992 | + h ) usage; exit;; |
993 | + s ) tname="$OPTARG/*.sh";; |
994 | + d ) export MYSQL_BASEDIR="$OPTARG";; |
995 | + c ) XB_BUILD="$OPTARG";; |
996 | + j ) |
997 | + |
998 | + if [[ ! $OPTARG =~ ^[0-9]+$ || $NWORKERS < 1 ]] |
999 | + then |
1000 | + echo "Wrong -j argument: $OPTARG" |
1001 | + exit -1 |
1002 | + fi |
1003 | + NWORKERS="$OPTARG" |
1004 | + ;; |
1005 | + |
1006 | + T ) |
1007 | + if [[ ! $OPTARG =~ ^[0-9]+$ ]] |
1008 | + then |
1009 | + echo "Wrong -T argument: $OPTARG" |
1010 | + exit -1 |
1011 | + fi |
1012 | + TEST_TIMEOUT="$OPTARG" |
1013 | + ;; |
1014 | + |
1015 | + ? ) echo "Use \`$0 -h' for the list of available options." |
1016 | exit -1;; |
1017 | - esac |
1018 | + esac |
1019 | done |
1020 | |
1021 | -if [ $KEEP_RESULTS -eq 0 ]; |
1022 | -then |
1023 | - rm -rf results |
1024 | - rm -f $SUBUNIT_OUT |
1025 | -fi |
1026 | -mkdir results |
1027 | - |
1028 | set_vars |
1029 | |
1030 | if [ -n "$tname" ] |
1031 | @@ -279,13 +802,17 @@ |
1032 | tests="t/*.sh" |
1033 | fi |
1034 | |
1035 | -failed_count=0 |
1036 | -failed_tests= |
1037 | -total_count=0 |
1038 | - |
1039 | export OUTFILE="$PWD/results/setup" |
1040 | |
1041 | -clean >>$OUTFILE 2>&1 |
1042 | +rm -rf results |
1043 | +mkdir results |
1044 | + |
1045 | +cleanup_all_workers >>$OUTFILE 2>&1 |
1046 | + |
1047 | +rm -rf var test_results.subunit |
1048 | +mkdir var |
1049 | + |
1050 | +echo "Detecting server version..." | tee -a $OUTFILE |
1051 | |
1052 | if ! get_version_info |
1053 | then |
1054 | @@ -297,69 +824,99 @@ |
1055 | tee -a $OUTFILE |
1056 | |
1057 | echo "Using '`basename $XB_BIN`' as xtrabackup binary" | tee -a $OUTFILE |
1058 | + |
1059 | +[ -z "$NWORKERS" ] && autocalc_nworkers |
1060 | + |
1061 | +if [ "$NWORKERS" -gt 1 ] |
1062 | +then |
1063 | + echo "Using $NWORKERS parallel workers" | tee -a $OUTFILE |
1064 | +fi |
1065 | echo | tee -a $OUTFILE |
1066 | |
1067 | -kill_leftovers >>$OUTFILE 2>&1 |
1068 | -clean >>$OUTFILE 2>&1 |
1069 | - |
1070 | -source subunit.sh |
1071 | - |
1072 | -echo "========================================================================" |
1073 | +cat <<EOF |
1074 | +============================================================================== |
1075 | +TEST WORKER RESULT TIME(s) or COMMENT |
1076 | +------------------------------------------------------------------------------ |
1077 | +EOF |
1078 | |
1079 | for t in $tests |
1080 | do |
1081 | - total_count=$((total_count+1)) |
1082 | - |
1083 | - printf "%-40s" $t |
1084 | - subunit_start_test $t >> $SUBUNIT_OUT |
1085 | + # Check if we have available workers |
1086 | + found="" |
1087 | + |
1088 | + while [ -z "$found" ] |
1089 | + do |
1090 | + for ((i = 1; i <= NWORKERS; i++)) |
1091 | + do |
1092 | + if [ -z ${worker_pids[$i]:-""} ] |
1093 | + then |
1094 | + found="yes" |
1095 | + break |
1096 | + else |
1097 | + # Check if it's alive |
1098 | + if kill -0 ${worker_pids[$i]} >/dev/null 2>&1 |
1099 | + then |
1100 | + check_timeout_for_worker $i || print_status_and_exit |
1101 | + continue |
1102 | + fi |
1103 | + reap_worker $i || print_status_and_exit |
1104 | + |
1105 | + worker_pids[$i]="" |
1106 | + found="yes" |
1107 | + |
1108 | + break |
1109 | + fi |
1110 | + done |
1111 | + |
1112 | + if [ -z "$found" ] |
1113 | + then |
1114 | + sleep 1 |
1115 | + fi |
1116 | + done |
1117 | + |
1118 | + worker=$i |
1119 | + |
1120 | + TOTAL_COUNT=$((TOTAL_COUNT+1)) |
1121 | + |
1122 | name=`basename $t .sh` |
1123 | - export OUTFILE="$PWD/results/$name" |
1124 | - export SKIPPED_REASON="$PWD/results/$name.skipped" |
1125 | - bash $XTRACE_OPTION $t > $OUTFILE 2>&1 |
1126 | - rc=$? |
1127 | - |
1128 | - if [[ -z "$DEBUG" || -n "$force" ]] |
1129 | - then |
1130 | - kill_leftovers >>$OUTFILE 2>&1 |
1131 | - clean >>$OUTFILE 2>&1 |
1132 | - fi |
1133 | - |
1134 | - if [ $rc -eq 0 ] |
1135 | - then |
1136 | - echo "[passed]" |
1137 | - subunit_pass_test $t >> $SUBUNIT_OUT |
1138 | - elif [ $rc -eq $SKIPPED_EXIT_CODE ] |
1139 | - then |
1140 | - sreason="" |
1141 | - test -r $SKIPPED_REASON && sreason=`cat $SKIPPED_REASON` |
1142 | - echo "[skipped] $sreason" |
1143 | - subunit_skip_test $t >> $SUBUNIT_OUT |
1144 | - else |
1145 | - echo "[failed]" |
1146 | - |
1147 | - ( |
1148 | - (echo "Something went wrong running $t. Exited with $rc"; |
1149 | - echo; echo; cat $OUTFILE |
1150 | - ) | subunit_fail_test $t |
1151 | - ) >> $SUBUNIT_OUT |
1152 | - |
1153 | - failed_count=$((failed_count+1)) |
1154 | - failed_tests="$failed_tests $t" |
1155 | - result=1 |
1156 | - if [ -z "$force" ] |
1157 | + worker_names[$worker]=$t |
1158 | + worker_outfiles[$worker]="$PWD/results/$name" |
1159 | + worker_skip_files[$worker]="$PWD/results/$name.skipped" |
1160 | + worker_status_files[$worker]="$PWD/results/$name.status" |
1161 | + # Create a unique TMPDIR for each worker so that it can be removed as a part |
1162 | + # of the cleanup procedure. Server socket files will also be created there. |
1163 | + worker_tmpdirs[$worker]="`mktemp -d -t xbtemp.XXXXXX`" |
1164 | + |
1165 | + ( |
1166 | + set -eu |
1167 | + if [ -n "$DEBUG" ] |
1168 | then |
1169 | - break; |
1170 | + set -x |
1171 | fi |
1172 | - fi |
1173 | + |
1174 | + trap "cleanup_on_test_exit" EXIT |
1175 | + |
1176 | + . inc/common.sh |
1177 | + |
1178 | + export OUTFILE=${worker_outfiles[$worker]} |
1179 | + export SKIPPED_REASON=${worker_skip_files[$worker]} |
1180 | + export TEST_VAR_ROOT=$TEST_BASEDIR/var/w$worker |
1181 | + export TMPDIR=${worker_tmpdirs[$worker]} |
1182 | + export STATUS_FILE=${worker_status_files[$worker]} |
1183 | + |
1184 | + mkdir $TEST_VAR_ROOT |
1185 | + |
1186 | + . $t |
1187 | + ) > ${worker_outfiles[$worker]} 2>&1 & |
1188 | + |
1189 | + worker_pids[$worker]=$! |
1190 | + worker_stime[$worker]="`now`" |
1191 | + # Used in subunit reports |
1192 | + worker_stime_txt[$worker]="`date -u '+%Y-%m-%d %H:%M:%S'`" |
1193 | done |
1194 | |
1195 | -echo "========================================================================" |
1196 | -echo |
1197 | - |
1198 | -if [ $result -eq 1 ] |
1199 | -then |
1200 | - echo |
1201 | - echo "$failed_count/$total_count tests have failed: $failed_tests" |
1202 | - echo "See results/ for detailed output" |
1203 | - exit -1 |
1204 | -fi |
1205 | +# Wait for in-progress workers to finish |
1206 | +reap_all_workers |
1207 | + |
1208 | +print_status_and_exit |
1209 | + |
1210 | |
1211 | === modified file 'test/subunit.sh' |
1212 | --- test/subunit.sh 2011-06-12 09:57:00 +0000 |
1213 | +++ test/subunit.sh 2013-07-04 07:51:31 +0000 |
1214 | @@ -15,8 +15,11 @@ |
1215 | # |
1216 | |
1217 | subunit_start_test () { |
1218 | + local stime=$2 |
1219 | # emit the current protocol start-marker for test $1 |
1220 | - echo "time: `date -u '+%Y-%m-%d %H:%M:%S'`" |
1221 | + # adjust time by the number of seconds to execute the test to get the actual |
1222 | + # start time |
1223 | + echo "time: $stime" |
1224 | echo "test: $1" |
1225 | } |
1226 | |
1227 | |
1228 | === modified file 'test/t/bug1085099.sh' |
1229 | --- test/t/bug1085099.sh 2013-03-06 10:04:13 +0000 |
1230 | +++ test/t/bug1085099.sh 2013-07-04 07:51:31 +0000 |
1231 | @@ -13,9 +13,7 @@ |
1232 | # Create a new tmpdir |
1233 | mkdir $topdir/new_tmpdir |
1234 | |
1235 | -# Make the default tmpdir inaccessible and make sure permissions are restored on |
1236 | -# failure |
1237 | -trap "chmod 755 $MYSQLD_TMPDIR" INT TERM EXIT |
1238 | +# Make the default tmpdir inaccessible |
1239 | chmod 000 $MYSQLD_TMPDIR |
1240 | |
1241 | innobackupex --tmpdir=$topdir/new_tmpdir --no-timestamp $topdir/backup |
1242 | |
1243 | === modified file 'test/t/bug664986.sh' |
1244 | --- test/t/bug664986.sh 2013-03-03 11:01:19 +0000 |
1245 | +++ test/t/bug664986.sh 2013-07-04 07:51:31 +0000 |
1246 | @@ -15,14 +15,6 @@ |
1247 | |
1248 | EOF |
1249 | |
1250 | -# Make sure we restore permissions to not leave stale files in Jenkins |
1251 | -# on a test failure |
1252 | -trap "vlog restoring directories and files permissions ; \ |
1253 | - chmod 777 $MYSQLD_DATADIR/test_bug664986_innodb; \ |
1254 | - chmod 777 $MYSQLD_DATADIR/test_bug664986_myisam; \ |
1255 | - chmod 644 $MYSQLD_DATADIR/test_bug664986_innodb/*; \ |
1256 | - chmod 644 $MYSQLD_DATADIR/test_bug664986_myisam/*" INT TERM EXIT |
1257 | - |
1258 | # Test that wrong directory permissions result in a backup failure |
1259 | # for both InnoDB and non-InnoDB files |
1260 | chmod 000 $MYSQLD_DATADIR/test_bug664986_innodb |
1261 | |
1262 | === modified file 'test/t/bug996493.sh' |
1263 | --- test/t/bug996493.sh 2012-11-29 04:37:56 +0000 |
1264 | +++ test/t/bug996493.sh 2013-07-04 07:51:31 +0000 |
1265 | @@ -20,9 +20,6 @@ |
1266 | vlog "Remove my.cnf" |
1267 | mv $topdir/my.cnf $topdir/my.cnf.bak |
1268 | |
1269 | -trap "vlog restoring $topdir/my.cnf ; \ |
1270 | -mv $topdir/my.cnf.bak $topdir/my.cnf" INT TERM EXIT |
1271 | - |
1272 | vlog "Apply log" |
1273 | # Do not run innobackupex, because it pass option --defaults-file |
1274 | # which we should avoid. Our goal is to test that backup-my.cnf |
1275 | @@ -31,7 +28,6 @@ |
1276 | |
1277 | vlog "Get my.cnf back" |
1278 | mv $topdir/my.cnf.bak $topdir/my.cnf |
1279 | -trap "vlog test exit" INT TERM EXIT |
1280 | |
1281 | vlog "Copy back" |
1282 | innobackupex --copy-back $backup_dir |
1283 | |
1284 | === modified file 'test/t/compact_compressed.sh' |
1285 | --- test/t/compact_compressed.sh 2013-01-14 11:02:59 +0000 |
1286 | +++ test/t/compact_compressed.sh 2013-07-04 07:51:31 +0000 |
1287 | @@ -11,8 +11,13 @@ |
1288 | |
1289 | # Use innodb_strict_mode so that failure to use compression results in an |
1290 | # error rather than a warning |
1291 | -mysqld_additional_args="--innodb_strict_mode --innodb_file_per_table \ |
1292 | ---innodb_file_format=Barracuda" |
1293 | +MYSQLD_EXTRA_MY_CNF_OPTS=" |
1294 | +innodb_strict_mode |
1295 | +innodb_file_per_table |
1296 | +innodb_file_format=Barracuda |
1297 | +# Set the minimal log file size to minimize xtrabackup_logfile |
1298 | +# Recovering compressed pages is extremely slow with UNIV_ZIP_DEBUG |
1299 | +innodb_log_file_size=1M" |
1300 | |
1301 | # |
1302 | # Test compact backup of a compressed tablespace with a specific page size |
1303 | @@ -26,7 +31,7 @@ |
1304 | echo "Testing compact backup with compressed page size=${page_size}KB " |
1305 | echo "************************************************************************" |
1306 | |
1307 | - start_server ${mysqld_additional_args} |
1308 | + start_server |
1309 | |
1310 | load_dbase_schema sakila |
1311 | load_dbase_data sakila |
1312 | @@ -52,7 +57,7 @@ |
1313 | |
1314 | rm -r $mysql_datadir |
1315 | |
1316 | - innobackupex --apply-log --rebuild-indexes $backup_dir |
1317 | + innobackupex --apply-log --rebuild-indexes --rebuild-threads=2 $backup_dir |
1318 | |
1319 | vlog "Restoring MySQL datadir" |
1320 | mkdir -p $mysql_datadir |
1321 | @@ -63,7 +68,7 @@ |
1322 | verify_db_state sakila |
1323 | |
1324 | stop_server |
1325 | - clean |
1326 | + remove_var_dirs |
1327 | } |
1328 | |
1329 | |
1330 | |
1331 | === modified file 'test/t/ib_stream_incremental.sh' |
1332 | --- test/t/ib_stream_incremental.sh 2012-06-05 12:35:33 +0000 |
1333 | +++ test/t/ib_stream_incremental.sh 2013-07-04 07:51:31 +0000 |
1334 | @@ -98,7 +98,7 @@ |
1335 | exit -1 |
1336 | fi |
1337 | |
1338 | - clean |
1339 | + remove_var_dirs |
1340 | } |
1341 | |
1342 | stream_format="xbstream" |
1343 | |
1344 | === modified file 'test/t/remote_tablespaces.sh' |
1345 | --- test/t/remote_tablespaces.sh 2013-04-23 06:38:06 +0000 |
1346 | +++ test/t/remote_tablespaces.sh 2013-07-04 07:51:31 +0000 |
1347 | @@ -12,7 +12,7 @@ |
1348 | |
1349 | start_server --innodb_file_per_table |
1350 | |
1351 | -remote_dir=$TEST_BASEDIR/var1/remote_dir |
1352 | +remote_dir=$TEST_VAR_ROOT/var1/remote_dir |
1353 | |
1354 | $MYSQL $MYSQL_ARGS test <<EOF |
1355 | CREATE TABLE t(id INT AUTO_INCREMENT PRIMARY KEY, c INT) |
1356 | |
1357 | === modified file 'test/t/undo_tablespaces.sh' |
1358 | --- test/t/undo_tablespaces.sh 2013-04-27 18:46:54 +0000 |
1359 | +++ test/t/undo_tablespaces.sh 2013-07-04 07:51:31 +0000 |
1360 | @@ -23,7 +23,7 @@ |
1361 | EOF |
1362 | } |
1363 | |
1364 | -undo_directory=$TEST_BASEDIR/var1/undo_dir |
1365 | +undo_directory=$TEST_VAR_ROOT/var1/undo_dir |
1366 | |
1367 | MYSQLD_EXTRA_MY_CNF_OPTS=" |
1368 | innodb_file_per_table=1 |
1369 | |
1370 | === modified file 'test/t/xb_encrypt.sh' |
1371 | --- test/t/xb_encrypt.sh 2013-03-11 19:11:29 +0000 |
1372 | +++ test/t/xb_encrypt.sh 2013-07-04 07:51:31 +0000 |
1373 | @@ -5,8 +5,6 @@ |
1374 | encrypt_algo="AES256" |
1375 | encrypt_key="percona_xtrabackup_is_awesome___" |
1376 | |
1377 | -echo -n "Percona XtraBackup is awesome!!!" > $encrypt_key_file |
1378 | - |
1379 | innobackupex_options="--encrypt=$encrypt_algo --encrypt-key=$encrypt_key --encrypt-threads=4 --encrypt-chunk-size=8K" |
1380 | data_decrypt_cmd="for i in *.xbcrypt; do \ |
1381 | xbcrypt -d -a $encrypt_algo -k $encrypt_key < \$i > \${i:0:\${#i}-8}; \ |
1382 | |
1383 | === modified file 'test/t/xb_part_range.sh' |
1384 | --- test/t/xb_part_range.sh 2012-07-06 05:13:15 +0000 |
1385 | +++ test/t/xb_part_range.sh 2013-07-04 07:51:31 +0000 |
1386 | @@ -1,19 +1,9 @@ |
1387 | . inc/common.sh |
1388 | +. inc/ib_part.sh |
1389 | |
1390 | start_server |
1391 | |
1392 | -function check_partitioning() |
1393 | -{ |
1394 | - $MYSQL $MYSQL_ARGS -Ns -e "show variables like 'have_partitioning'" |
1395 | -} |
1396 | - |
1397 | -PARTITION_CHECK=`check_partitioning` |
1398 | - |
1399 | -if [ -z "$PARTITION_CHECK" ]; then |
1400 | - echo "Requires Partitioning." > $SKIPPED_REASON |
1401 | - stop_server |
1402 | - exit $SKIPPED_EXIT_CODE |
1403 | -fi |
1404 | +require_partitioning |
1405 | |
1406 | run_cmd $MYSQL $MYSQL_ARGS test <<EOF |
1407 | CREATE TABLE test ( |
1408 | |
1409 | === modified file 'test/t/xb_perm_basic.sh' |
1410 | --- test/t/xb_perm_basic.sh 2012-10-15 16:14:59 +0000 |
1411 | +++ test/t/xb_perm_basic.sh 2013-07-04 07:51:31 +0000 |
1412 | @@ -4,6 +4,4 @@ |
1413 | start_server |
1414 | |
1415 | chmod -R 500 $mysql_datadir |
1416 | -trap "vlog restoring permissions on datadir $mysql_datadir ; \ |
1417 | -chmod -R 700 $mysql_datadir" INT TERM EXIT |
1418 | innobackupex --no-timestamp $topdir/backup |
1419 | |
1420 | === modified file 'test/t/xb_perm_stream.sh' |
1421 | --- test/t/xb_perm_stream.sh 2012-10-15 16:14:59 +0000 |
1422 | +++ test/t/xb_perm_stream.sh 2013-07-04 07:51:31 +0000 |
1423 | @@ -5,7 +5,5 @@ |
1424 | |
1425 | # Take backup |
1426 | chmod -R 500 $mysql_datadir |
1427 | -trap "vlog restoring permissions on datadir $mysql_datadir ; \ |
1428 | -chmod -R 700 $mysql_datadir" INT TERM EXIT |
1429 | mkdir -p $topdir/backup |
1430 | innobackupex --stream=tar $topdir/backup > $topdir/backup/out.tar |
1431 | |
1432 | === modified file 'test/t/xb_stats_datadir.sh' |
1433 | --- test/t/xb_stats_datadir.sh 2013-05-02 13:05:59 +0000 |
1434 | +++ test/t/xb_stats_datadir.sh 2013-07-04 07:51:31 +0000 |
1435 | @@ -5,12 +5,11 @@ |
1436 | |
1437 | . inc/common.sh |
1438 | |
1439 | -mkdir ${TEST_BASEDIR}/logs |
1440 | - |
1441 | -trap "rm -rf ${TEST_BASEDIR}/logs" INT TERM EXIT |
1442 | +logdir=${TEST_VAR_ROOT}/logs |
1443 | +mkdir $logdir |
1444 | |
1445 | MYSQLD_EXTRA_MY_CNF_OPTS=" |
1446 | -innodb_log_group_home_dir=${TEST_BASEDIR}/logs |
1447 | +innodb_log_group_home_dir=$logdir |
1448 | " |
1449 | |
1450 | start_server |
1451 | @@ -28,6 +27,6 @@ |
1452 | # we pass all necessary options as an arguments, so if someday this |
1453 | # will be changed, test still will work |
1454 | xtrabackup --stats --datadir=${MYSQLD_DATADIR} \ |
1455 | - --innodb_log_group_home_dir=${TEST_BASEDIR}/logs |
1456 | + --innodb_log_group_home_dir=$logdir |
1457 | |
1458 | vlog "stats did not fail" |
1459 | |
1460 | === removed file 'test/testrun.c' |
1461 | --- test/testrun.c 2013-06-14 00:59:24 +0000 |
1462 | +++ test/testrun.c 1970-01-01 00:00:00 +0000 |
1463 | @@ -1,405 +0,0 @@ |
1464 | -/* |
1465 | - * testrun.c - a parallel test runner for the XtraBackup test suite |
1466 | - */ |
1467 | -/* BEGIN LICENSE |
1468 | - * Copyright (C) 2012 Percona Ireland Ltd. |
1469 | - * |
1470 | - * Written by Stewart Smith |
1471 | - * |
1472 | - * This program is free software: you can redistribute it and/or modify it |
1473 | - * under the terms of the GNU General Public License version 2, as published |
1474 | - * by the Free Software Foundation. |
1475 | - * |
1476 | - * This program is distributed in the hope that it will be useful, but |
1477 | - * WITHOUT ANY WARRANTY; without even the implied warranties of |
1478 | - * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR |
1479 | - * PURPOSE. See the GNU General Public License for more details. |
1480 | - * |
1481 | - * You should have received a copy of the GNU General Public License along |
1482 | - * with this program. If not, see <http://www.gnu.org/licenses/>. |
1483 | - * END LICENSE */ |
1484 | - |
1485 | -#include <stdio.h> |
1486 | -#include <unistd.h> |
1487 | -#include <dirent.h> |
1488 | -#include <string.h> |
1489 | -#include <limits.h> |
1490 | -#include <stdlib.h> |
1491 | -#include <sys/select.h> |
1492 | - |
1493 | -#include <sys/stat.h> |
1494 | -#include <sys/types.h> |
1495 | -#include <sys/wait.h> |
1496 | -#include <fcntl.h> |
1497 | -#include <assert.h> |
1498 | - |
1499 | -#include <signal.h> |
1500 | - |
1501 | -struct testcase |
1502 | -{ |
1503 | - char *name; |
1504 | - char *buf; |
1505 | - size_t end_of_buf; |
1506 | - size_t bufsz; |
1507 | -}; |
1508 | - |
1509 | -pid_t *childpid; |
1510 | -int nchildpid=0; |
1511 | - |
1512 | -static void kill_children(int sig) |
1513 | -{ |
1514 | - int i; |
1515 | - int status; |
1516 | - |
1517 | - (void)sig; |
1518 | - |
1519 | - fprintf(stderr, "Killing child processes...\n"); |
1520 | - |
1521 | - for(i=0; i<nchildpid; i++) |
1522 | - if(childpid[i] > 0) |
1523 | - { |
1524 | - kill(childpid[i], SIGKILL); |
1525 | - wait(&status); |
1526 | - } |
1527 | - |
1528 | - exit(EXIT_SUCCESS); |
1529 | -} |
1530 | - |
1531 | -int collect_testcases_filter(const struct dirent *a) |
1532 | -{ |
1533 | - int l; |
1534 | - |
1535 | - if (a->d_name[0] == '.') |
1536 | - return 0; |
1537 | - |
1538 | - l= strlen(a->d_name); |
1539 | - |
1540 | - if (l > 2 && strncmp(a->d_name + l - 3, ".sh", 3)==0) |
1541 | - return 1; |
1542 | - |
1543 | - return 0; |
1544 | -} |
1545 | - |
1546 | -static int collect_testcases(const char* suitedir, struct testcase **cases) |
1547 | -{ |
1548 | - struct dirent **namelist; |
1549 | - int n; |
1550 | - int i; |
1551 | - |
1552 | - n= scandir(suitedir, &namelist, collect_testcases_filter, alphasort); |
1553 | - |
1554 | - *cases= (struct testcase*) malloc(sizeof(struct testcase)*n); |
1555 | - |
1556 | - for(i=0; i<n; i++) |
1557 | - { |
1558 | - (*cases)[i].name= strdup(namelist[i]->d_name); |
1559 | - (*cases)[i].buf= NULL; |
1560 | - (*cases)[i].end_of_buf= 0; |
1561 | - (*cases)[i].bufsz= 0; |
1562 | - free(namelist[i]); |
1563 | - } |
1564 | - |
1565 | - free(namelist); |
1566 | - |
1567 | - return n; |
1568 | -} |
1569 | - |
1570 | -static void free_testcases(struct testcase *cases, int n) |
1571 | -{ |
1572 | - while (n>0) |
1573 | - { |
1574 | - free(cases[--n].name); |
1575 | - } |
1576 | - free(cases); |
1577 | -} |
1578 | - |
1579 | -static int run_testcase_in_child(int nr, struct testcase *t, pid_t *cpid, const char* xbtarget) |
1580 | -{ |
1581 | - int fd[2]; |
1582 | - |
1583 | - printf("[%d] LAUNCHING - %s\n", nr, t->name); |
1584 | - |
1585 | - if (pipe(fd) == -1) |
1586 | - { |
1587 | - perror("pipe"); |
1588 | - exit(EXIT_FAILURE); |
1589 | - } |
1590 | - |
1591 | - *cpid= fork(); |
1592 | - if (*cpid == 0) |
1593 | - { |
1594 | - /* child */ |
1595 | - close(fd[0]); |
1596 | - |
1597 | - char tname[500]; |
1598 | - snprintf(tname, sizeof(tname), "t/%s",t->name); |
1599 | - |
1600 | - char basedir[PATH_MAX]; |
1601 | - char cwd[PATH_MAX]; |
1602 | - snprintf(basedir, sizeof(basedir), "%s/var/%d", getcwd(cwd,sizeof(cwd)), nr); |
1603 | - |
1604 | - mkdir("var",0700); |
1605 | - mkdir(basedir,0700); |
1606 | - |
1607 | - char logname[PATH_MAX]; |
1608 | - snprintf(logname, sizeof(logname), "%s/var/%d.log", getcwd(cwd,sizeof(cwd)), nr); |
1609 | - |
1610 | - int logfd= open(logname, O_WRONLY|O_APPEND|O_CREAT, 0600); |
1611 | - dup2(logfd, STDOUT_FILENO); |
1612 | - dup2(logfd, STDERR_FILENO); |
1613 | - close(logfd); |
1614 | - |
1615 | - char subunitfd[50]; |
1616 | - snprintf(subunitfd, sizeof(subunitfd), "/dev/fd/%d", fd[1]); |
1617 | - |
1618 | - char* xbtarget_param; |
1619 | - if (xbtarget) |
1620 | - xbtarget_param= strdup(xbtarget); |
1621 | - else |
1622 | - xbtarget_param= NULL; |
1623 | - |
1624 | - char *const newargv[] = {"testrun.sh", "-n", |
1625 | - "-t", tname, |
1626 | - "-b", basedir, |
1627 | - "-r", subunitfd, |
1628 | - (xbtarget)? "-c" : NULL, xbtarget_param, |
1629 | - NULL }; |
1630 | - char *newenviron[] = { NULL }; |
1631 | - execve(newargv[0], newargv, newenviron); |
1632 | - perror("execve"); |
1633 | - exit(EXIT_FAILURE); |
1634 | - } |
1635 | - else |
1636 | - { |
1637 | - /* parent */ |
1638 | - close(fd[1]); |
1639 | - fcntl(fd[0], F_SETFL, O_NONBLOCK); |
1640 | - return fd[0]; |
1641 | - } |
1642 | -} |
1643 | - |
1644 | -static inline void subunit_progress_sign(int fd, int n, char *sign) |
1645 | -{ |
1646 | - char *buf; |
1647 | - const char* fmt= "progress: %s%d\n"; |
1648 | - size_t sz= 1+strlen(fmt)+100; |
1649 | - size_t l; |
1650 | - |
1651 | - buf= (char*)malloc(sz); |
1652 | - |
1653 | - l= snprintf(buf, sz, fmt, sign, n); |
1654 | - assert(l < sz); |
1655 | - |
1656 | - write(fd, buf, l); |
1657 | - |
1658 | - free(buf); |
1659 | -} |
1660 | - |
1661 | -static void run_testcases(struct testcase *testcases, int nrcases, |
1662 | - int njobs, int timeout, const char* xbtarget) |
1663 | -{ |
1664 | - int childfd[njobs]; |
1665 | - int nfds= 0; |
1666 | - int retval; |
1667 | - pid_t chpid[njobs]; |
1668 | - int status; |
1669 | - int next_testcase= 0; |
1670 | - int i; |
1671 | - fd_set rfds; |
1672 | - fd_set efds; |
1673 | - struct timeval tv; |
1674 | - int nchildren; |
1675 | - int childtest[njobs]; |
1676 | - |
1677 | - int subunitfd= open("test_results.subunit", O_TRUNC|O_WRONLY|O_APPEND|O_CREAT, 0600); |
1678 | - subunit_progress_sign(subunitfd, nrcases, ""); |
1679 | - |
1680 | - if (nrcases < njobs) |
1681 | - njobs= nrcases; |
1682 | - |
1683 | - childpid= chpid; |
1684 | - nchildpid= njobs; |
1685 | - |
1686 | - for(i=0; i<njobs; i++) |
1687 | - { |
1688 | - childtest[i]=next_testcase++; |
1689 | - childfd[i]= run_testcase_in_child(i, &testcases[childtest[i]], &childpid[i], xbtarget); |
1690 | - } |
1691 | - |
1692 | - fflush(stdout); |
1693 | - |
1694 | -loop: |
1695 | - FD_ZERO(&efds); |
1696 | - FD_ZERO(&rfds); |
1697 | - |
1698 | - nchildren=0; |
1699 | - |
1700 | - for (i=0; i<njobs; i++) |
1701 | - { |
1702 | - if (childfd[i] != -1) |
1703 | - { |
1704 | - FD_SET(childfd[i], &efds); |
1705 | - FD_SET(childfd[i], &rfds); |
1706 | - nfds= (childfd[i] > nfds)? childfd[i] : nfds; |
1707 | - nchildren++; |
1708 | - } |
1709 | - } |
1710 | - |
1711 | - tv.tv_sec= timeout; |
1712 | - tv.tv_usec= 0; |
1713 | - |
1714 | - retval = select(nfds+1, &rfds, NULL, &efds, &tv); |
1715 | - |
1716 | - if (retval == -1) |
1717 | - perror("select()"); |
1718 | - else if (retval) |
1719 | - { |
1720 | - int childexited=0; |
1721 | - |
1722 | - for (i=0; i<njobs; i++) |
1723 | - { |
1724 | - if(childfd[i] != -1 |
1725 | - && (FD_ISSET(childfd[i], &efds) || FD_ISSET(childfd[i], &rfds))) |
1726 | - { |
1727 | - ssize_t r=0; |
1728 | - |
1729 | - do { |
1730 | - struct testcase *t= &testcases[childtest[i]]; |
1731 | - |
1732 | - if(t->bufsz == t->end_of_buf) |
1733 | - { |
1734 | - t->bufsz+=4000; |
1735 | - t->buf= (char*)realloc(t->buf, t->bufsz); |
1736 | - } |
1737 | - |
1738 | - r= read(childfd[i], t->buf+t->end_of_buf, t->bufsz - t->end_of_buf); |
1739 | - if (r>0) |
1740 | - t->end_of_buf+= r; |
1741 | - } while(r>0); |
1742 | - |
1743 | - pid_t waited= waitpid(childpid[i], &status, WNOHANG); |
1744 | - if (!(WIFEXITED(status) || WIFSIGNALED(status))) |
1745 | - continue; |
1746 | - |
1747 | - if (waited != childpid[i]) |
1748 | - continue; |
1749 | - |
1750 | - write(subunitfd, testcases[childtest[i]].buf, |
1751 | - testcases[childtest[i]].end_of_buf); |
1752 | - |
1753 | - close(childfd[i]); |
1754 | - printf("[%d] completed %s status %d\n", |
1755 | - i, testcases[childtest[i]].name, WEXITSTATUS(status)); |
1756 | - childfd[i]=-1; |
1757 | - nchildren--; |
1758 | - |
1759 | - if (next_testcase < nrcases) |
1760 | - { |
1761 | - childtest[i]=next_testcase++; |
1762 | - childfd[i]= run_testcase_in_child(i, &testcases[childtest[i]], &childpid[i], xbtarget); |
1763 | - nfds= (childfd[i] > nfds)? childfd[i] : nfds; |
1764 | - nchildren++; |
1765 | - } |
1766 | - printf("\nnrchildren= %d, %d tests remaining\n", |
1767 | - nchildren, nrcases-next_testcase); |
1768 | - childexited=1; |
1769 | - fflush(stdout); |
1770 | - } |
1771 | - } |
1772 | - if (childexited) |
1773 | - { |
1774 | - printf ("Running: "); |
1775 | - for(i=0; i<njobs; i++) |
1776 | - if (childfd[i] != -1) |
1777 | - printf("%s ",testcases[childtest[i]].name); |
1778 | - printf("\n"); |
1779 | - } |
1780 | - } |
1781 | - else |
1782 | - { |
1783 | - printf("Timeout\n"); |
1784 | - kill_children(SIGKILL); |
1785 | - exit(EXIT_FAILURE); |
1786 | - } |
1787 | - |
1788 | - if (nchildren==0) |
1789 | - goto end; |
1790 | - |
1791 | - goto loop; |
1792 | - |
1793 | -end: |
1794 | - |
1795 | - close(subunitfd); |
1796 | - return; |
1797 | -} |
1798 | - |
1799 | -int main(int argc, char* argv[]) |
1800 | -{ |
1801 | - const char* suitedir= "t/"; |
1802 | - int njobs= 4; |
1803 | - int opt; |
1804 | - int nrcases; |
1805 | - struct testcase *testcases; |
1806 | - int timeout= 600; |
1807 | - const char* xbtarget= NULL; |
1808 | - |
1809 | - struct sigaction sa; |
1810 | - |
1811 | - sa.sa_flags= 0; |
1812 | - sigemptyset(&sa.sa_mask); |
1813 | - sa.sa_handler = kill_children; |
1814 | - sigaction(SIGHUP, &sa, NULL); |
1815 | - sigaction(SIGINT, &sa, NULL); |
1816 | - sigaction(SIGQUIT, &sa, NULL); |
1817 | - |
1818 | -#ifdef _SC_NPROCESSORS_ONLN |
1819 | - njobs= sysconf(_SC_NPROCESSORS_ONLN); |
1820 | -#endif |
1821 | - |
1822 | -#ifdef _SC_PHYS_PAGES |
1823 | - long nrpages= sysconf(_SC_PHYS_PAGES); |
1824 | - long pagesize= sysconf(_SC_PAGESIZE); |
1825 | - long pages_per_job= (128*(1 << 20)) / pagesize; |
1826 | - nrpages= nrpages/2; |
1827 | - if ((pages_per_job * njobs) > nrpages) |
1828 | - njobs= nrpages / pages_per_job; |
1829 | -#endif |
1830 | - |
1831 | - if (njobs == 0) |
1832 | - njobs= 1; |
1833 | - |
1834 | - while ((opt = getopt(argc, argv, "j:s:t:c:")) != -1) |
1835 | - { |
1836 | - switch (opt) { |
1837 | - case 'c': |
1838 | - xbtarget= optarg; |
1839 | - break; |
1840 | - case 's': |
1841 | - suitedir= optarg; |
1842 | - break; |
1843 | - case 'j': |
1844 | - njobs= atoi(optarg); |
1845 | - break; |
1846 | - case 't': |
1847 | - timeout= atoi(optarg); |
1848 | - break; |
1849 | - default: |
1850 | - fprintf(stderr, "Usage: %s [-s suite] [-j parallel] [-t timeout]\n", |
1851 | - argv[0]); |
1852 | - exit(EXIT_FAILURE); |
1853 | - } |
1854 | - } |
1855 | - |
1856 | - printf("%s running with: -s %s -j %d -t %d\n\n", |
1857 | - argv[0], suitedir,njobs, timeout); |
1858 | - |
1859 | - nrcases= collect_testcases(suitedir, &testcases); |
1860 | - |
1861 | - printf("Found %d testcases\n", nrcases); |
1862 | - |
1863 | - run_testcases(testcases, nrcases, njobs, timeout, xbtarget); |
1864 | - |
1865 | - free_testcases(testcases, nrcases); |
1866 | - |
1867 | - return 0; |
1868 | -} |
http:// jenkins. percona. com/view/ XtraBackup/ job/percona- xtrabackup- 2.1-param/ 360/
Same comments on remaining failures as in the 2.0 MP.