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