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