Whamcloud - gitweb
LU-6006 tests: add sleep 1 after command in background
[fs/lustre-release.git] / lustre / tests / replay-dual.sh
1 #!/bin/bash
2
3 set -e
4
5 # bug number:  LU-2012 LU-8333 LU-7372
6 ALWAYS_EXCEPT="14b     21b     24 25       $REPLAY_DUAL_EXCEPT"
7 # UPDATE THE COMMENT ABOVE WITH BUG NUMBERS WHEN CHANGING ALWAYS_EXCEPT!
8
9 SAVE_PWD=$PWD
10 PTLDEBUG=${PTLDEBUG:--1}
11 LUSTRE=${LUSTRE:-$(cd $(dirname $0)/..; echo $PWD)}
12 SETUP=${SETUP:-""}
13 CLEANUP=${CLEANUP:-""}
14 MOUNT_2=${MOUNT_2:-"yes"}
15 export MULTIOP=${MULTIOP:-multiop}
16 . $LUSTRE/tests/test-framework.sh
17
18 init_test_env $@
19 . ${CONFIG:=$LUSTRE/tests/cfg/$NAME.sh}
20 init_logging
21
22 remote_mds_nodsh && skip "remote MDS with nodsh" && exit 0
23
24 #                                   7  (min)"
25 [ "$SLOW" = "no" ] && EXCEPT_SLOW="21b"
26
27 [[ $(facet_fstype $SINGLEMDS) == zfs ]] &&
28 # bug number for skipped test:        LU-2230
29         ALWAYS_EXCEPT="$ALWAYS_EXCEPT 21b"
30 if $SHARED_KEY; then
31 # bug number for skipped tests: LU-9795 LU-9795
32         ALWAYS_EXCEPT="         0a      0b      $ALWAYS_EXCEPT"
33 fi
34
35 build_test_filter
36
37 check_and_setup_lustre
38 MOUNTED=$(mounted_lustre_filesystems)
39 if ! $(echo $MOUNTED' ' | grep -w -q $MOUNT2' '); then
40     zconf_mount $HOSTNAME $MOUNT2
41     MOUNTED2=yes
42 fi
43
44 assert_DIR
45 rm -rf $DIR/[df][0-9]*
46
47 [ "$DAEMONFILE" ] && $LCTL debug_daemon start $DAEMONFILE $DAEMONSIZE
48
49 # if there is no CLIENT1 defined, some tests can be ran on localhost
50 CLIENT1=${CLIENT1:-$HOSTNAME}
51 # if CLIENT2 doesn't exist then use CLIENT1 instead
52 # All tests should use CLIENT2 with MOUNT2 only therefore it will work if
53 # $CLIENT2 == CLIENT1
54 # Exception is the test which need two separate nodes
55 CLIENT2=${CLIENT2:-$CLIENT1}
56
57 # LU-482 Avert LVM and VM inability to flush caches in pre .33 kernels
58 if [ $LINUX_VERSION_CODE -lt $(version_code 2.6.33) ]; then
59         sync
60         do_facet $SINGLEMDS "sync; sleep 10; sync; sleep 10; sync"
61 fi
62
63 LU482_FAILED=$(mktemp -u $TMP/$TESTSUITE.lu482.XXXXXX)
64 test_0a() {
65         echo "Check file is LU482_FAILED=$LU482_FAILED"
66         touch $MOUNT2/$tfile-A # force sync FLD/SEQ update before barrier
67         replay_barrier $SINGLEMDS
68 #define OBD_FAIL_PTLRPC_FINISH_REPLAY | OBD_FAIL_ONCE
69         touch $MOUNT2/$tfile
70         createmany -o $MOUNT1/$tfile- 50
71         $LCTL set_param fail_loc=0x80000514
72         facet_failover $SINGLEMDS
73         [ -f "$LU482_FAILED" ] && skip "LU-482 failure" && return 0
74         client_up || return 1
75         umount -f $MOUNT2
76         client_up || return 1
77         zconf_mount `hostname` $MOUNT2 || error "mount2 fais"
78         unlinkmany $MOUNT1/$tfile- 50 || return 2
79         rm $MOUNT2/$tfile || return 3
80         rm $MOUNT2/$tfile-A || return 4
81 }
82 run_test 0a "expired recovery with lost client"
83
84 if [ -f "$LU482_FAILED" ]; then
85         log "Found check file $LU482_FAILED, aborting test script"
86         rm -vf "$LU482_FAILED"
87         complete $SECONDS
88         do_nodes $CLIENTS umount -f $MOUNT2 || true
89         do_nodes $CLIENTS umount -f $MOUNT || true
90         # copied from stopall, but avoid the MDS recovery
91     for num in `seq $OSTCOUNT`; do
92         stop ost$num -f
93         rm -f $TMP/ost${num}active
94     done
95     if ! combined_mgs_mds ; then
96         stop mgs
97     fi
98
99         exit_status
100 fi
101
102 test_0b() {
103     replay_barrier $SINGLEMDS
104     touch $MOUNT2/$tfile
105     touch $MOUNT1/$tfile-2
106     umount $MOUNT2
107     facet_failover $SINGLEMDS
108     umount -f $MOUNT1
109     zconf_mount `hostname` $MOUNT1 || error "mount1 fais"
110     zconf_mount `hostname` $MOUNT2 || error "mount2 fais"
111     # it is uncertain if file-2 exists or not, remove it if it does
112     checkstat $MOUNT1/$tfile-2 && rm $MOUNT1/$tfile-2
113     checkstat $MOUNT2/$tfile && return 2
114     return 0
115 }
116 run_test 0b "lost client during waiting for next transno"
117
118 test_1() {
119     touch $MOUNT1/a
120     replay_barrier $SINGLEMDS
121     touch $MOUNT2/b
122
123     fail $SINGLEMDS
124     checkstat $MOUNT2/a || return 1
125     checkstat $MOUNT1/b || return 2
126     rm $MOUNT2/a $MOUNT1/b
127     checkstat $MOUNT1/a && return 3
128     checkstat $MOUNT2/b && return 4
129     return 0
130 }
131
132 run_test 1 "|X| simple create"
133
134
135 test_2() {
136     replay_barrier $SINGLEMDS
137     mkdir $MOUNT1/adir
138
139     fail $SINGLEMDS
140     checkstat $MOUNT2/adir || return 1
141     rmdir $MOUNT2/adir
142     checkstat $MOUNT2/adir && return 2
143     return 0
144 }
145 run_test 2 "|X| mkdir adir"
146
147 test_3() {
148     replay_barrier $SINGLEMDS
149     mkdir $MOUNT1/adir
150     mkdir $MOUNT2/adir/bdir
151
152     fail $SINGLEMDS
153     checkstat $MOUNT2/adir      || return 1
154     checkstat $MOUNT1/adir/bdir || return 2
155     rmdir $MOUNT2/adir/bdir $MOUNT1/adir
156     checkstat $MOUNT1/adir      && return 3
157     checkstat $MOUNT2/adir/bdir && return 4
158     return 0
159 }
160 run_test 3 "|X| mkdir adir, mkdir adir/bdir "
161
162 test_4() {
163     mkdir $MOUNT1/adir
164     replay_barrier $SINGLEMDS
165     mkdir $MOUNT1/adir  && return 1
166     mkdir $MOUNT2/adir/bdir
167
168     fail $SINGLEMDS
169     checkstat $MOUNT2/adir      || return 2
170     checkstat $MOUNT1/adir/bdir || return 3
171
172     rmdir $MOUNT2/adir/bdir $MOUNT1/adir
173     checkstat $MOUNT1/adir      && return 4
174     checkstat $MOUNT2/adir/bdir && return 5
175     return 0
176 }
177 run_test 4 "|X| mkdir adir (-EEXIST), mkdir adir/bdir "
178
179
180 test_5() {
181     # multiclient version of replay_single.sh/test_8
182     mcreate $MOUNT1/a
183     multiop_bg_pause $MOUNT2/a o_tSc || return  1
184     pid=$!
185     rm -f $MOUNT1/a
186     replay_barrier $SINGLEMDS
187     kill -USR1 $pid
188     wait $pid || return 1
189
190     fail $SINGLEMDS
191     [ -e $MOUNT2/a ] && return 2
192     return 0
193 }
194 run_test 5 "open, unlink |X| close"
195
196
197 test_6() {
198     mcreate $MOUNT1/a
199     multiop_bg_pause $MOUNT2/a o_c || return 1
200     pid1=$!
201     multiop_bg_pause $MOUNT1/a o_c || return 1
202     pid2=$!
203     rm -f $MOUNT1/a
204     replay_barrier $SINGLEMDS
205     kill -USR1 $pid1
206     wait $pid1 || return 1
207
208     fail $SINGLEMDS
209     kill -USR1 $pid2
210     wait $pid2 || return 1
211     [ -e $MOUNT2/a ] && return 2
212     return 0
213 }
214 run_test 6 "open1, open2, unlink |X| close1 [fail $SINGLEMDS] close2"
215
216 test_8() {
217     replay_barrier $SINGLEMDS
218     drop_reint_reply "mcreate $MOUNT1/$tfile"    || return 1
219     fail $SINGLEMDS
220     checkstat $MOUNT2/$tfile || return 2
221     rm $MOUNT1/$tfile || return 3
222
223     return 0
224 }
225 run_test 8 "replay of resent request"
226
227 test_9() {
228     replay_barrier $SINGLEMDS
229     mcreate $MOUNT1/$tfile-1
230     mcreate $MOUNT2/$tfile-2
231     # drop first reint reply
232     do_facet $SINGLEMDS lctl set_param fail_loc=0x80000119
233     fail $SINGLEMDS
234     do_facet $SINGLEMDS lctl set_param fail_loc=0
235
236     rm $MOUNT1/$tfile-[1,2] || return 1
237
238     return 0
239 }
240 run_test 9 "resending a replayed create"
241
242 test_10() {
243     mcreate $MOUNT1/$tfile-1
244     replay_barrier $SINGLEMDS
245     munlink $MOUNT1/$tfile-1
246     mcreate $MOUNT2/$tfile-2
247     # drop first reint reply
248     do_facet $SINGLEMDS lctl set_param fail_loc=0x80000119
249     fail $SINGLEMDS
250     do_facet $SINGLEMDS lctl set_param fail_loc=0
251
252     checkstat $MOUNT1/$tfile-1 && return 1
253     checkstat $MOUNT1/$tfile-2 || return 2
254     rm $MOUNT1/$tfile-2
255
256     return 0
257 }
258 run_test 10 "resending a replayed unlink"
259
260 test_11() {
261         replay_barrier $SINGLEMDS
262         mcreate $DIR1/$tfile-1
263         mcreate $DIR2/$tfile-2
264         mcreate $DIR1/$tfile-3
265         mcreate $DIR2/$tfile-4
266         mcreate $DIR1/$tfile-5
267         # drop all reint replies for a while
268         do_facet $SINGLEMDS $LCTL set_param fail_loc=0x0119
269         # note that with this fail_loc set, facet_failover df will fail
270         facet_failover $SINGLEMDS
271
272         local clients=${CLIENTS:-$HOSTNAME}
273         wait_clients_import_state "$clients" $SINGLEMDS FULL
274
275         do_facet $SINGLEMDS $LCTL set_param fail_loc=0
276
277         rm $DIR1/$tfile-[1-5] || return 1
278
279         return 0
280 }
281 run_test 11 "both clients timeout during replay"
282
283 test_12() {
284     replay_barrier $SINGLEMDS
285
286     multiop_bg_pause $DIR/$tfile mo_c || return 1
287     MULTIPID=$!
288
289 #define OBD_FAIL_LDLM_ENQUEUE_NET                       0x302
290     do_facet $SINGLEMDS lctl set_param fail_loc=0x80000302
291     facet_failover $SINGLEMDS
292     do_facet $SINGLEMDS lctl set_param fail_loc=0
293     clients_up || return 1
294
295     ls $DIR/$tfile
296     kill -USR1 $MULTIPID || return 3
297     wait $MULTIPID || return 4
298     $CHECKSTAT -t file $DIR/$tfile || return 2
299     rm $DIR/$tfile
300
301     return 0
302 }
303 run_test 12 "open resend timeout"
304
305 test_13() {
306     multiop_bg_pause $DIR/$tfile mo_c || return 1
307     MULTIPID=$!
308
309     replay_barrier $SINGLEMDS
310
311     kill -USR1 $MULTIPID || return 3
312     wait $MULTIPID || return 4
313
314     # drop close
315     do_facet $SINGLEMDS lctl set_param fail_loc=0x80000115
316     facet_failover $SINGLEMDS
317     do_facet $SINGLEMDS lctl set_param fail_loc=0
318     clients_up || return 1
319
320     ls $DIR/$tfile
321     $CHECKSTAT -t file $DIR/$tfile || return 2
322     rm $DIR/$tfile
323
324     return 0
325 }
326 run_test 13 "close resend timeout"
327
328 # test 14a removed after 18143 because it shouldn't fail anymore and do the same
329 # as test_15a
330
331 test_14b() {
332         wait_mds_ost_sync
333         wait_delete_completed
334
335         local beforeused=$(df -P $DIR | tail -1 | awk '{ print $3 }')
336
337         mkdir -p $MOUNT1/$tdir
338         $SETSTRIPE -i 0 $MOUNT1/$tdir
339         replay_barrier $SINGLEMDS
340         createmany -o $MOUNT1/$tdir/$tfile- 5
341
342         $SETSTRIPE -i 0 $MOUNT2/$tfile-2
343         dd if=/dev/zero of=$MOUNT2/$tfile-2 bs=1M count=5
344         createmany -o $MOUNT1/$tdir/$tfile-3- 5
345         umount $MOUNT2
346
347         fail $SINGLEMDS
348         wait_recovery_complete $SINGLEMDS || error "MDS recovery not done"
349
350         # first set of files should have been replayed
351         unlinkmany $MOUNT1/$tdir/$tfile- 5 || error "first unlinks failed"
352         unlinkmany $MOUNT1/$tdir/$tfile-3- 5 || error "second unlinks failed"
353
354         zconf_mount $HOSTNAME $MOUNT2 || error "mount $MOUNT2 failed"
355         [ -f $MOUNT2/$tfile-2 ] && error "$MOUNT2/$tfile-2 exists!"
356
357         wait_mds_ost_sync || error "wait_mds_ost_sync failed"
358         wait_delete_completed || error "wait_delete_complete failed"
359
360         local afterused=$(df -P $DIR | tail -1 | awk '{ print $3 }')
361         log "before $beforeused, after $afterused"
362         # leave some margin for some files/dirs to be modified (OI, llog, etc)
363         [ $afterused -le $((beforeused + $(fs_log_size))) ] ||
364                 error "after $afterused > before $beforeused"
365 }
366 run_test 14b "delete ost orphans if gap occured in objids due to VBR"
367
368 test_15a() { # was test_15
369     replay_barrier $SINGLEMDS
370     createmany -o $MOUNT1/$tfile- 25
371     createmany -o $MOUNT2/$tfile-2- 1
372     umount $MOUNT2
373
374     fail $SINGLEMDS
375
376     unlinkmany $MOUNT1/$tfile- 25 || return 2
377     [ -e $MOUNT1/$tfile-2-0 ] && error "$tfile-2-0 exists"
378
379     zconf_mount `hostname` $MOUNT2 || error "mount $MOUNT2 fail"
380     return 0
381 }
382 run_test 15a "timeout waiting for lost client during replay, 1 client completes"
383
384 test_15c() {
385     replay_barrier $SINGLEMDS
386     for ((i = 0; i < 2000; i++)); do
387         echo "data" > "$MOUNT2/${tfile}-$i" || error "create ${tfile}-$i failed"
388     done
389     umount $MOUNT2
390
391     fail $SINGLEMDS
392
393     zconf_mount `hostname` $MOUNT2 || error "mount $MOUNT2 fail"
394     return 0
395 }
396 run_test 15c "remove multiple OST orphans"
397
398 test_16() {
399     replay_barrier $SINGLEMDS
400     createmany -o $MOUNT1/$tfile- 25
401     createmany -o $MOUNT2/$tfile-2- 1
402     umount $MOUNT2
403
404     facet_failover $SINGLEMDS
405     sleep $TIMEOUT
406     fail $SINGLEMDS
407
408     unlinkmany $MOUNT1/$tfile- 25 || return 2
409
410     zconf_mount `hostname` $MOUNT2 || error "mount $MOUNT2 fail"
411     return 0
412
413 }
414 run_test 16 "fail MDS during recovery (3571)"
415
416 test_17() {
417     remote_ost_nodsh && skip "remote OST with nodsh" && return 0
418
419     createmany -o $MOUNT1/$tfile- 25
420     createmany -o $MOUNT2/$tfile-2- 1
421
422     # Make sure the disconnect is lost
423     replay_barrier ost1
424     umount $MOUNT2
425
426     facet_failover ost1
427     sleep $TIMEOUT
428     fail ost1
429
430     unlinkmany $MOUNT1/$tfile- 25 || return 2
431
432     zconf_mount `hostname` $MOUNT2 || error "mount $MOUNT2 fail"
433     return 0
434
435 }
436 run_test 17 "fail OST during recovery (3571)"
437
438 # cleanup with blocked enqueue fails until timer elapses (MDS busy), wait for it
439 export NOW=0
440
441 test_18() { # bug 3822 - evicting client with enqueued lock
442         #set -vx
443         local DLMTRACE=$(do_facet $SINGLEMDS lctl get_param debug)
444         do_facet $SINGLEMDS lctl set_param debug=+dlmtrace
445         mkdir -p $MOUNT1/$tdir || error "mkdir $MOUNT1/$tdir failed"
446         touch $MOUNT1/$tdir/${tfile}0 || error "touch file failed"
447         statmany -s $MOUNT1/$tdir/$tfile 1 500 &
448         OPENPID=$!
449         NOW=$SECONDS
450         #define OBD_FAIL_LDLM_ENQUEUE_BLOCKED    0x30b
451         do_facet $SINGLEMDS lctl set_param fail_loc=0x8000030b  # hold enqueue
452         sleep 1
453         #define OBD_FAIL_LDLM_BL_CALLBACK_NET                   0x305
454         do_facet client lctl set_param ldlm.namespaces.*.early_lock_cancel=0
455         do_facet client lctl set_param fail_loc=0x80000305  # drop cb, evict
456         cancel_lru_locks mdc
457         usleep 500 # wait to ensure first client is one that will be evicted
458         openfile -f O_RDONLY $MOUNT2/$tdir/$tfile
459         wait $OPENPID
460         do_facet client lctl set_param ldlm.namespaces.*.early_lock_cancel=1
461         do_facet $SINGLEMDS lctl debug_kernel |
462                 grep "not entering recovery" && error "client not evicted"
463         do_facet client "lctl set_param fail_loc=0"
464         do_facet $SINGLEMDS "lctl set_param fail_loc=0"
465 }
466 run_test 18 "ldlm_handle_enqueue succeeds on evicted export (3822)"
467
468 test_19() { # Bug 10991 - resend of open request does not fail assertion.
469     replay_barrier $SINGLEMDS
470     drop_ldlm_reply "createmany -o $DIR/$tfile 1" || return 1
471     fail $SINGLEMDS
472     checkstat $DIR2/${tfile}0 || return 2
473     rm $DIR/${tfile}0 || return 3
474
475     return 0
476 }
477 run_test 19 "resend of open request"
478
479 test_20() { #16389
480         local before=$SECONDS
481         replay_barrier $SINGLEMDS
482         touch $DIR1/$tfile.a
483         touch $DIR2/$tfile.b
484         umount $DIR2
485         fail $SINGLEMDS
486         rm $DIR1/$tfile.a
487         zconf_mount $HOSTNAME $DIR2 || error "mount $DIR2 fail"
488         local tier1=$((SECONDS - before))
489
490         before=$SECONDS
491         replay_barrier $SINGLEMDS
492         touch $DIR1/$tfile.a
493         touch $DIR2/$tfile.b
494         umount $DIR2
495         fail $SINGLEMDS
496         rm $DIR1/$tfile.a
497         zconf_mount $HOSTNAME $DIR2 || error "mount $DIR2 fail"
498         local tier2=$((SECONDS - before))
499
500         # timeout is more than 1.5x original timeout
501         ((tier2 < tier1 * 6 / 4)) ||
502                 error "recovery time $tier2 >= 1.5x original time $tier1"
503 }
504 run_test 20 "recovery time is not increasing"
505
506 # commit on sharing tests
507 test_21a() {
508     local param_file=$TMP/$tfile-params
509
510         save_lustre_params $SINGLEMDS "mdt.*.commit_on_sharing" > $param_file
511     do_facet $SINGLEMDS lctl set_param mdt.*.commit_on_sharing=1
512     touch  $MOUNT1/$tfile-1
513     mv  $MOUNT2/$tfile-1 $MOUNT2/$tfile-2
514     mv  $MOUNT1/$tfile-2 $MOUNT1/$tfile-3
515     replay_barrier_nosync $SINGLEMDS
516     umount $MOUNT2
517
518     facet_failover $SINGLEMDS
519
520     # all renames are replayed
521     unlink  $MOUNT1/$tfile-3 || return 2
522
523     zconf_mount `hostname` $MOUNT2 || error "mount $MOUNT2 fail"
524
525     do_facet $SINGLEMDS lctl set_param mdt.*.commit_on_sharing=0
526     rm -rf $MOUNT1/$tfile-*
527     restore_lustre_params < $param_file
528     rm -f $param_file
529     return 0
530 }
531 run_test 21a "commit on sharing"
532
533 test_21b_sub () {
534         local mds=$1
535         do_node $CLIENT1 rm -f $MOUNT1/$tfile-*
536
537         do_facet $mds sync
538         do_node $CLIENT1 touch $MOUNT1/$tfile-1
539         do_node $CLIENT2 mv $MOUNT1/$tfile-1 $MOUNT1/$tfile-2
540         do_node $CLIENT1 mv $MOUNT1/$tfile-2 $MOUNT1/$tfile-3
541
542         replay_barrier_nosync $mds
543         shutdown_client $CLIENT2 $MOUNT1
544
545         facet_failover $mds
546
547         # were renames replayed?
548         local rc=0
549         echo UNLINK $MOUNT1/$tfile-3
550         do_node $CLIENT1 unlink  $MOUNT1/$tfile-3 ||
551                 { echo "unlink $tfile-3 fail!" && rc=1; }
552
553         boot_node $CLIENT2
554         zconf_mount_clients $CLIENT2 $MOUNT1 ||
555                 error "mount $CLIENT2 $MOUNT1 fail"
556
557         return $rc
558 }
559
560 test_21b() {
561         [ -z "$CLIENTS" ] && skip "Need two or more clients" && return
562         [ $CLIENTCOUNT -lt 2 ] &&
563                 { skip "Need 2+ clients, have $CLIENTCOUNT" && return; }
564
565         if [ "$FAILURE_MODE" = "HARD" ] && mixed_mdt_devs; then
566                 skip "Several MDTs on one MDS with FAILURE_MODE=$FAILURE_MODE"
567                 return 0
568         fi
569
570         zconf_umount_clients $CLIENTS $MOUNT2
571         zconf_mount_clients $CLIENTS $MOUNT1
572
573         local param_file=$TMP/$tfile-params
574
575         local mdtidx=$($LFS getstripe -m $MOUNT1)
576         local facet=mds$((mdtidx + 1))
577
578         save_lustre_params $facet "mdt.*.commit_on_sharing" > $param_file
579
580         # COS enabled
581         local COS=1
582         do_facet $facet lctl set_param mdt.*.commit_on_sharing=$COS
583
584         test_21b_sub $facet || error "Not all renames are replayed. COS=$COS"
585
586         # there is still a window when transactions may be written to disk
587         # before the mds device is set R/O. To avoid such a rare test failure,
588         # the check is repeated several times.
589         COS=0
590         local n_attempts=1
591         while true; do
592                 # COS disabled (should fail)
593                 do_facet $facet lctl set_param mdt.*.commit_on_sharing=$COS
594
595                 test_21b_sub $facet || break
596                 n_attempts=$((n_attempts + 1))
597                 [ $n_attempts -gt 3 ] &&
598                         error "can't check if COS works: rename replied w/o COS"
599         done
600         zconf_mount_clients $CLIENTS $MOUNT2
601         restore_lustre_params < $param_file
602         rm -f $param_file
603         return 0
604 }
605 run_test 21b "commit on sharing, two clients"
606
607 checkstat_22() {
608         checkstat $MOUNT1/$remote_dir || return 1
609         checkstat $MOUNT1/$remote_dir/dir || return 2
610         checkstat $MOUNT1/$remote_dir/$tfile-1 || return 3
611         checkstat $MOUNT1/$remote_dir/dir/$tfile-1 || return 4
612         return 0
613 }
614
615 create_remote_dir_files_22() {
616         do_node $CLIENT2 mkdir ${MOUNT2}/$remote_dir/dir || return 1
617         do_node $CLIENT1 createmany -o $MOUNT1/$remote_dir/dir/$tfile- 2 ||
618                                                             return 2
619         do_node $CLIENT2 createmany -o $MOUNT2/$remote_dir/$tfile- 2 ||
620                                                             return 3
621         return 0
622 }
623
624 test_22a () {
625         [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return 0
626         ([ $FAILURE_MODE == "HARD" ] &&
627                 [ "$(facet_host mds1)" == "$(facet_host mds2)" ]) &&
628                 skip "MDTs needs to be on diff hosts for HARD fail mode" &&
629                 return 0
630
631         local MDTIDX=1
632         local remote_dir=${tdir}/remote_dir
633
634         do_node $CLIENT1 mkdir -p $MOUNT1/${tdir}
635
636         # OBD_FAIL_MDS_REINT_NET_REP       0x119
637         do_facet mds$((MDTIDX + 1)) lctl set_param fail_loc=0x119
638         do_node $CLIENT1 $LFS mkdir -i $MDTIDX $MOUNT1/$remote_dir &
639         CLIENT_PID=$!
640         sleep 1
641
642         fail mds$((MDTIDX + 1))
643         wait $CLIENT_PID || error "lfs mkdir failed"
644
645         replay_barrier mds$MDTIDX
646         create_remote_dir_files_22 || error "Remote creation failed $?"
647         fail mds$MDTIDX
648
649         checkstat_22 || error "check stat failed $?"
650
651         rm -rf $MOUNT1/$tdir || error "rmdir remote_dir failed"
652         return 0
653 }
654 run_test 22a "c1 lfs mkdir -i 1 dir1, M1 drop reply & fail, c2 mkdir dir1/dir"
655
656 test_22b () {
657         [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return 0
658         local MDTIDX=1
659         local remote_dir=$tdir/remote_dir
660
661         # OBD_FAIL_MDS_REINT_NET_REP       0x119
662         do_node $CLIENT1 mkdir -p $MOUNT1/${tdir}
663
664         do_facet mds$((MDTIDX + 1)) lctl set_param fail_loc=0x119
665         do_node $CLIENT1 $LFS mkdir -i $MDTIDX $MOUNT1/$remote_dir &
666         CLIENT_PID=$!
667         sleep 1
668
669         fail mds${MDTIDX},mds$((MDTIDX + 1))
670         wait $CLIENT_PID || error "lfs mkdir failed"
671
672         replay_barrier mds$MDTIDX
673         create_remote_dir_files_22 || error "Remote creation failed $?"
674         fail mds${MDTIDX}
675
676         checkstat_22 || error "check stat failed $?"
677
678         rm -rf $MOUNT1/$tdir || error "rmdir remote_dir failed"
679         return 0
680 }
681 run_test 22b "c1 lfs mkdir -i 1 d1, M1 drop reply & fail M0/M1, c2 mkdir d1/dir"
682
683 test_22c () {
684         [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return 0
685         ([ $FAILURE_MODE == "HARD" ] &&
686                 [ "$(facet_host mds1)" == "$(facet_host mds2)" ]) &&
687                 skip "MDTs needs to be on diff hosts for HARD fail mode" &&
688                 return 0
689         local MDTIDX=1
690         local remote_dir=${tdir}/remote_dir
691
692         do_node $CLIENT1 mkdir -p $MOUNT1/${tdir}
693
694         # OBD_FAIL_OUT_UPDATE_NET_REP    0x1701
695         do_facet mds$MDTIDX lctl set_param fail_loc=0x1701
696         do_node $CLIENT1 $LFS mkdir -i $MDTIDX $MOUNT1/$remote_dir &
697         CLIENT_PID=$!
698         sleep 1
699         do_facet mds$MDTIDX lctl set_param fail_loc=0
700
701         fail mds$MDTIDX
702         wait $CLIENT_PID || error "lfs mkdir failed"
703
704         replay_barrier mds$MDTIDX
705         create_remote_dir_files_22 || error "Remote creation failed $?"
706         fail mds$MDTIDX
707
708         checkstat_22 || error "check stat failed $?"
709
710         rm -rf $MOUNT1/$tdir || error "rmdir remote_dir failed"
711         return 0
712 }
713 run_test 22c "c1 lfs mkdir -i 1 d1, M1 drop update & fail M1, c2 mkdir d1/dir"
714
715 test_22d () {
716         [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return 0
717         local MDTIDX=1
718         local remote_dir=${tdir}/remote_dir
719
720         do_node $CLIENT1 mkdir -p $MOUNT1/${tdir}
721
722         # OBD_FAIL_OUT_UPDATE_NET_REP    0x1701
723         do_facet mds$MDTIDX lctl set_param fail_loc=0x1701
724         do_node $CLIENT1 $LFS mkdir -i $MDTIDX $MOUNT1/$remote_dir &
725         CLIENT_PID=$!
726         sleep 1
727         do_facet mds$MDTIDX lctl set_param fail_loc=0
728
729         fail mds${MDTIDX},mds$((MDTIDX + 1))
730         wait $CLIENT_PID || error "lfs mkdir failed"
731
732         replay_barrier mds$MDTIDX
733         create_remote_dir_files_22 || error "Remote creation failed $?"
734         fail mds$MDTIDX
735
736         checkstat_22 || error "check stat failed $?"
737
738         rm -rf $MOUNT1/$tdir || error "rmdir remote_dir failed"
739         return 0
740 }
741 run_test 22d "c1 lfs mkdir -i 1 d1, M1 drop update & fail M0/M1,c2 mkdir d1/dir"
742
743 checkstat_23() {
744         checkstat $MOUNT1/$remote_dir || return 1
745         checkstat $MOUNT1/$remote_dir/$tfile-1 || return 2
746         return 0
747 }
748
749 create_remote_dir_files_23() {
750         do_node $CLIENT2 mkdir ${MOUNT2}/$remote_dir || return 1
751         do_node $CLIENT2 createmany -o $MOUNT2/$remote_dir/$tfile- 2 || return 2
752         return 0
753 }
754
755 test_23a () {
756         [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return 0
757         ([ $FAILURE_MODE == "HARD" ] &&
758                 [ "$(facet_host mds1)" == "$(facet_host mds2)" ]) &&
759                 skip "MDTs needs to be on diff hosts for HARD fail mode" &&
760                 return 0
761         local MDTIDX=1
762         local remote_dir=$tdir/remote_dir
763
764         do_node $CLIENT1 mkdir -p $MOUNT1/${tdir}
765         do_node $CLIENT1 $LFS mkdir -i $MDTIDX $MOUNT1/$remote_dir ||
766                         error "lfs mkdir failed"
767         # OBD_FAIL_MDS_REINT_NET_REP       0x119
768         do_facet mds$((MDTIDX + 1)) lctl set_param fail_loc=0x119
769         do_node $CLIENT1 rmdir $MOUNT1/$remote_dir &
770         local CLIENT_PID=$!
771         sleep 1
772         do_facet mds$((MDTIDX + 1)) lctl set_param fail_loc=0
773
774         fail mds$((MDTIDX + 1))
775         wait $CLIENT_PID || error "rmdir remote dir failed"
776
777         replay_barrier mds${MDTIDX}
778         create_remote_dir_files_23 || error "Remote creation failed $?"
779         fail mds${MDTIDX}
780
781         checkstat_23 || error "check stat failed $?"
782
783         rm -rf $MOUNT1/$tdir || error "rmdir remote_dir failed"
784         return 0
785 }
786 run_test 23a "c1 rmdir d1, M1 drop reply and fail, client2 mkdir d1"
787
788 test_23b () {
789         [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return 0
790         local MDTIDX=1
791         local remote_dir=$tdir/remote_dir
792
793         do_node $CLIENT1 mkdir -p $MOUNT1/${tdir}
794         do_node $CLIENT1 $LFS mkdir -i $MDTIDX $MOUNT1/$remote_dir ||
795                         error "lfs mkdir failed"
796
797         # OBD_FAIL_MDS_REINT_NET_REP       0x119
798         do_facet mds$((MDTIDX + 1)) lctl set_param fail_loc=0x119
799         do_node $CLIENT1 rmdir $MOUNT1/$remote_dir &
800         local CLIENT_PID=$!
801         sleep 1
802         do_facet mds$((MDTIDX + 1)) lctl set_param fail_loc=0
803
804         fail mds${MDTIDX},mds$((MDTIDX + 1))
805         wait $CLIENT_PID || error "rmdir remote dir failed"
806
807         replay_barrier mds${MDTIDX}
808         create_remote_dir_files_23 || error "Remote creation failed $?"
809         fail mds${MDTIDX}
810
811         checkstat_23 || error "check stat failed $?"
812
813         rm -rf $MOUNT1/$tdir || error "rmdir remote_dir failed"
814         return 0
815 }
816 run_test 23b "c1 rmdir d1, M1 drop reply and fail M0/M1, c2 mkdir d1"
817
818 test_23c () {
819         [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return 0
820
821         ([ $FAILURE_MODE == "HARD" ] &&
822                 [ "$(facet_host mds1)" == "$(facet_host mds2)" ]) &&
823                 skip "MDTs needs to be on diff hosts for HARD fail mode" &&
824                 return 0
825         local MDTIDX=1
826         local remote_dir=$tdir/remote_dir
827
828         do_node $CLIENT1 mkdir -p $MOUNT1/${tdir}
829         do_node $CLIENT1 $LFS mkdir -i $MDTIDX $MOUNT1/$remote_dir ||
830                         error "lfs mkdir failed"
831
832         # OBD_FAIL_OUT_UPDATE_NET_REP    0x1701
833         do_facet mds${MDTIDX} lctl set_param fail_loc=0x1701
834         do_node $CLIENT1 rmdir $MOUNT1/$remote_dir &
835         CLIENT_PID=$!
836         sleep 1
837         do_facet mds${MDTIDX} lctl set_param fail_loc=0
838
839         fail mds${MDTIDX}
840         wait $CLIENT_PID || error "rmdir remote dir failed"
841
842         replay_barrier mds${MDTIDX}
843         create_remote_dir_files_23 || error "Remote creation failed $?"
844         fail mds${MDTIDX}
845
846         checkstat_23 || error "check stat failed $?"
847
848         rm -rf $MOUNT1/$tdir || return 6
849         return 0
850 }
851 run_test 23c "c1 rmdir d1, M0 drop update reply and fail M0, c2 mkdir d1"
852
853 test_23d () {
854         [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return 0
855         local MDTIDX=1
856         local remote_dir=$tdir/remote_dir
857
858         do_node $CLIENT1 mkdir -p $MOUNT1/${tdir}
859         do_node $CLIENT1 $LFS mkdir -i $MDTIDX $MOUNT1/$remote_dir ||
860                         error "lfs mkdir failed"
861
862         # OBD_FAIL_UPDATE_OBJ_NET    0x1701
863         do_facet mds${MDTIDX} lctl set_param fail_loc=0x1701
864         do_node $CLIENT1 rmdir $MOUNT1/$remote_dir &
865         CLIENT_PID=$!
866         sleep 1
867         do_facet mds${MDTIDX} lctl set_param fail_loc=0
868
869         fail mds${MDTIDX},mds$((MDTIDX + 1))
870         wait $CLIENT_PID || error "rmdir remote dir failed"
871
872         replay_barrier mds${MDTIDX}
873         create_remote_dir_files_23 || error "Remote creation failed $?"
874         fail mds${MDTIDX}
875
876         checkstat_23 || error "check stat failed $?"
877
878         rm -rf $MOUNT1/$tdir || return 6
879         return 0
880 }
881 run_test 23d "c1 rmdir d1, M0 drop update reply and fail M0/M1, c2 mkdir d1"
882
883 test_24 () {
884         [[ $(lustre_version_code $SINGLEMDS) -gt $(version_code 2.5.2) ]] ||
885                 { skip "Need MDS version newer than 2.5.2"; return 0; }
886
887         touch $MOUNT/$tfile
888         stat $MOUNT/$tfile >&/dev/null
889 # OBD_FAIL_MDS_REINT_NET_REP
890         do_facet $SINGLEMDS $LCTL set_param fail_loc=0x119
891         $TRUNCATE $MOUNT/$tfile 100 &
892         PID=$!
893         sleep 1
894         do_facet $SINGLEMDS lctl set_param fail_loc=0
895         # sync to release rep-ack lock quickly
896         do_nodes $(comma_list $(mdts_nodes)) \
897             "lctl set_param -n osd*.*MDT*.force_sync 1"
898         rm $MOUNT2/$tfile
899         wait
900 }
901 run_test 24 "reconstruct on non-existing object"
902
903 # end commit on sharing tests 
904
905 test_25() {
906         cancel_lru_locks osc
907
908         $SETSTRIPE -i 0 -c 1 $DIR/$tfile
909
910         # get lock for the 1st client
911         dd if=/dev/zero of=$DIR/$tfile count=1 >/dev/null ||
912                 error "failed to write data"
913
914         # get waiting locks for the 2nd client
915         drop_ldlm_cancel "multiop $DIR2/$tfile Ow512" &
916         sleep 1
917
918         # failover, replay and resend replayed waiting locks
919         if [ $(lustre_version_code ost1) -ge $(version_code 2.6.90) ]; then
920                 #define OBD_FAIL_LDLM_SRV_CP_AST      0x325
921                 do_facet ost1 lctl set_param fail_loc=0x80000325
922         else
923                 #define OBD_FAIL_OST_LDLM_REPLY_NET     0x213
924                 do_facet ost1 lctl set_param fail_loc=0x80000213
925         fi
926
927         fail ost1
928
929         # multiop does not finish because CP AST is skipped;
930         # it is ok to kill it in the test, because CP AST is already re-sent
931         # and it does not hung forever in real life
932         killall multiop
933         wait
934 }
935 run_test 25 "replay|resend"
936
937 cleanup_26() {
938         trap 0
939         kill -9 $tar_26_pid
940         kill -9 $dbench_26_pid
941         killall -9 dbench
942 }
943
944 test_26() {
945         local clients=${CLIENTS:-$HOSTNAME}
946
947         zconf_mount_clients $clients $MOUNT
948
949         local duration=600
950         [ "$SLOW" = "no" ] && duration=200
951         # set duration to 900 because it takes some time to boot node
952         [ "$FAILURE_MODE" = HARD ] && duration=900
953
954         local start_ts=$SECONDS
955         local rc=0
956
957         trap cleanup_26 EXIT
958         (
959                 local tar_dir=$DIR/$tdir/run_tar
960                 while true; do
961                         test_mkdir -p -c$MDSCOUNT $tar_dir || break
962                         if [ $MDSCOUNT -ge 2 ]; then
963                                 $LFS setdirstripe -D -c$MDSCOUNT $tar_dir ||
964                                         error "set default dirstripe failed"
965                         fi
966                         cd $tar_dir || break
967                         tar cf - /etc | tar xf - || error "tar failed"
968                         cd $DIR/$tdir || break
969                         rm -rf $tar_dir || break
970                 done
971         )&
972         tar_26_pid=$!
973         echo "Started tar $tar_26_pid"
974
975         (
976                 local dbench_dir=$DIR2/$tdir/run_dbench
977                 while true; do
978                         test_mkdir -p -c$MDSCOUNT $dbench_dir || break
979                         if [ $MDSCOUNT -ge 2 ]; then
980                                 $LFS setdirstripe -D -c$MDSCOUNT $dbench_dir ||
981                                         error "set default dirstripe failed"
982                         fi
983                         cd $dbench_dir || break
984                         rundbench 1 -D $dbench_dir -t 100 &>/dev/null || break
985                         cd $DIR/$tdir || break
986                         rm -rf $dbench_dir || break
987                 done
988         )&
989         dbench_26_pid=$!
990         echo "Started dbench $dbench_26_pid"
991
992         local num_failovers=0
993         local fail_index=1
994         while [ $((SECONDS - start_ts)) -lt $duration ]; do
995                 kill -0 $tar_26_pid || error "tar $tar_26_pid missing"
996                 kill -0 $dbench_26_pid || error "dbench $dbench_26_pid missing"
997                 sleep 2
998                 replay_barrier mds$fail_index
999                 sleep 2 # give clients a time to do operations
1000                 # Increment the number of failovers
1001                 num_failovers=$((num_failovers + 1))
1002                 log "$TESTNAME fail mds$fail_index $num_failovers times"
1003                 fail mds$fail_index
1004                 if [ $fail_index -ge $MDSCOUNT ]; then
1005                         fail_index=1
1006                 else
1007                         fail_index=$((fail_index + 1))
1008                 fi
1009         done
1010         # stop the client loads
1011         kill -0 $tar_26_pid || error "tar $tar_26_pid stopped"
1012         kill -0 $dbench_26_pid || error "dbench $dbench_26_pid stopped"
1013         cleanup_26 || true
1014 }
1015 run_test 26 "dbench and tar with mds failover"
1016
1017 test_28() {
1018         $SETSTRIPE -i 0 -c 1 $DIR2/$tfile
1019         dd if=/dev/zero of=$DIR2/$tfile bs=4096 count=1
1020
1021         #define OBD_FAIL_LDLM_SRV_BL_AST         0x324
1022         do_facet ost1 $LCTL set_param fail_loc=0x80000324
1023
1024         dd if=/dev/zero of=$DIR/$tfile bs=4096 count=1 &
1025         local pid=$!
1026         sleep 2
1027
1028         #define OBD_FAIL_LDLM_GRANT_CHECK        0x32a
1029         do_facet ost1 $LCTL set_param fail_loc=0x32a
1030
1031         fail ost1
1032
1033         sleep 2
1034         cancel_lru_locks OST0000-osc
1035         wait $pid || error "dd failed"
1036 }
1037 run_test 28 "lock replay should be ordered: waiting after granted"
1038
1039 test_32() {
1040         (( $MDSCOUNT < 2 )) && skip_env "needs >= 2 MDTs"
1041
1042         # inject a gap with 10th transaction
1043 #define OBD_FAIL_LLOG_ADD_GAP                      0x131d
1044         do_facet $SINGLEMDS $LCTL set_param fail_loc=0x0000131d fail_val=10
1045         for ((i=0; i < 20; i++)); do
1046                 $LFS setdirstripe -i1 $DIR/$tdir-$i ||
1047                         error "can't mkdir $DIR/$tdir-$i"
1048         done
1049
1050         # prevent update llog cancellation, so next boot MDS has
1051         # process the update llog with gap injected
1052 #define OBD_FAIL_TGT_TXN_NO_CANCEL      0x726
1053         $LCTL set_param fail_loc=0x726
1054
1055         stop mds2
1056         stop mds1
1057
1058         $LCTL set_param fail_loc=0
1059
1060         mount_facet mds1
1061         mount_facet mds2
1062
1063         $LFS df $DIR
1064
1065         local testid=$(echo $TESTNAME | tr '_' ' ')
1066         dmesg | tac | sed "/$testid/,$ d" | grep "This client was evicted" &&
1067                 error "client got evicted due to aborted recovery"
1068         return 0
1069 }
1070 run_test 32 "gap in update llog shouldn't break recovery"
1071
1072 complete $SECONDS
1073 SLEEP=$((SECONDS - $NOW))
1074 [ $SLEEP -lt $TIMEOUT ] && sleep $SLEEP
1075 [ "$MOUNTED2" = yes ] && zconf_umount $HOSTNAME $MOUNT2 || true
1076 check_and_cleanup_lustre
1077 exit_status