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