Whamcloud - gitweb
b=23954 MGS device has stopped when we try to start the second mgs
[fs/lustre-release.git] / lustre / tests / replay-dual.sh
1 #!/bin/bash
2
3 set -e
4
5 # bug number:  10124
6 ALWAYS_EXCEPT="15c   $REPLAY_DUAL_EXCEPT"
7
8 LFS=${LFS:-lfs}
9 SETSTRIPE=${SETSTRIPE:-"$LFS setstripe"}
10 GETSTRIPE=${GETSTRIPE:-"$LFS getstripe"}
11 SAVE_PWD=$PWD
12 PTLDEBUG=${PTLDEBUG:--1}
13 LUSTRE=${LUSTRE:-$(cd $(dirname $0)/..; echo $PWD)}
14 SETUP=${SETUP:-""}
15 CLEANUP=${CLEANUP:-""}
16 MOUNT_2=${MOUNT_2:-"yes"}
17 . $LUSTRE/tests/test-framework.sh
18
19 init_test_env $@
20 . ${CONFIG:=$LUSTRE/tests/cfg/$NAME.sh}
21 init_logging
22
23 remote_mds_nodsh && skip "remote MDS with nodsh" && exit 0
24
25 [ "$SLOW" = "no" ] && EXCEPT_SLOW="21b"
26
27 build_test_filter
28
29 check_and_setup_lustre
30 MOUNTED=$(mounted_lustre_filesystems)
31 if ! $(echo $MOUNTED | grep -w -q $MOUNT2); then
32     zconf_mount $HOSTNAME $MOUNT2
33     MOUNTED2=yes
34 fi
35
36 assert_DIR
37 rm -rf $DIR/[df][0-9]*
38
39 [ "$DAEMONFILE" ] && $LCTL debug_daemon start $DAEMONFILE $DAEMONSIZE
40
41 test_0a() {
42     touch $MOUNT2/$tfile-A # force sync FLD/SEQ update before barrier
43     replay_barrier $SINGLEMDS
44 #define OBD_FAIL_PTLRPC_FINISH_REPLAY | OBD_FAIL_ONCE
45     touch $MOUNT2/$tfile
46     createmany -o $MOUNT1/$tfile- 50
47     $LCTL set_param fail_loc=0x80000514
48     facet_failover $SINGLEMDS
49     client_up || return 1
50     umount -f $MOUNT2
51     client_up || return 1
52     zconf_mount `hostname` $MOUNT2 || error "mount2 fais"
53     unlinkmany $MOUNT1/$tfile- 50 || return 2
54     rm $MOUNT2/$tfile || return 3
55     rm $MOUNT2/$tfile-A || return 4
56 }
57 run_test 0a "expired recovery with lost client"
58
59 test_0b() {
60     replay_barrier $SINGLEMDS
61     touch $MOUNT2/$tfile
62     touch $MOUNT1/$tfile-2
63     umount $MOUNT2
64     facet_failover $SINGLEMDS
65     umount -f $MOUNT1
66     zconf_mount `hostname` $MOUNT1 || error "mount1 fais"
67     zconf_mount `hostname` $MOUNT2 || error "mount2 fais"
68     checkstat $MOUNT1/$tfile-2 && return 1
69     checkstat $MOUNT2/$tfile && return 2
70     return 0
71 }
72 run_test 0b "lost client during waiting for next transno"
73
74 test_1() {
75     touch $MOUNT1/a
76     replay_barrier $SINGLEMDS
77     touch $MOUNT2/b
78
79     fail $SINGLEMDS
80     checkstat $MOUNT2/a || return 1
81     checkstat $MOUNT1/b || return 2
82     rm $MOUNT2/a $MOUNT1/b
83     checkstat $MOUNT1/a && return 3
84     checkstat $MOUNT2/b && return 4
85     return 0
86 }
87
88 run_test 1 "|X| simple create"
89
90
91 test_2() {
92     replay_barrier $SINGLEMDS
93     mkdir $MOUNT1/adir
94
95     fail $SINGLEMDS
96     checkstat $MOUNT2/adir || return 1
97     rmdir $MOUNT2/adir
98     checkstat $MOUNT2/adir && return 2
99     return 0
100 }
101 run_test 2 "|X| mkdir adir"
102
103 test_3() {
104     replay_barrier $SINGLEMDS
105     mkdir $MOUNT1/adir
106     mkdir $MOUNT2/adir/bdir
107
108     fail $SINGLEMDS
109     checkstat $MOUNT2/adir      || return 1
110     checkstat $MOUNT1/adir/bdir || return 2
111     rmdir $MOUNT2/adir/bdir $MOUNT1/adir
112     checkstat $MOUNT1/adir      && return 3
113     checkstat $MOUNT2/adir/bdir && return 4
114     return 0
115 }
116 run_test 3 "|X| mkdir adir, mkdir adir/bdir "
117
118 test_4() {
119     mkdir $MOUNT1/adir
120     replay_barrier $SINGLEMDS
121     mkdir $MOUNT1/adir  && return 1
122     mkdir $MOUNT2/adir/bdir
123
124     fail $SINGLEMDS
125     checkstat $MOUNT2/adir      || return 2
126     checkstat $MOUNT1/adir/bdir || return 3
127
128     rmdir $MOUNT2/adir/bdir $MOUNT1/adir
129     checkstat $MOUNT1/adir      && return 4
130     checkstat $MOUNT2/adir/bdir && return 5
131     return 0
132 }
133 run_test 4 "|X| mkdir adir (-EEXIST), mkdir adir/bdir "
134
135
136 test_5() {
137     # multiclient version of replay_single.sh/test_8
138     mcreate $MOUNT1/a
139     multiop_bg_pause $MOUNT2/a o_tSc || return  1
140     pid=$!
141     rm -f $MOUNT1/a
142     replay_barrier $SINGLEMDS
143     kill -USR1 $pid
144     wait $pid || return 1
145
146     fail $SINGLEMDS
147     [ -e $MOUNT2/a ] && return 2
148     return 0
149 }
150 run_test 5 "open, unlink |X| close"
151
152
153 test_6() {
154     mcreate $MOUNT1/a
155     multiop_bg_pause $MOUNT2/a o_c || return 1
156     pid1=$!
157     multiop_bg_pause $MOUNT1/a o_c || return 1
158     pid2=$!
159     rm -f $MOUNT1/a
160     replay_barrier $SINGLEMDS
161     kill -USR1 $pid1
162     wait $pid1 || return 1
163
164     fail $SINGLEMDS
165     kill -USR1 $pid2
166     wait $pid2 || return 1
167     [ -e $MOUNT2/a ] && return 2
168     return 0
169 }
170 run_test 6 "open1, open2, unlink |X| close1 [fail $SINGLEMDS] close2"
171
172 test_8() {
173     replay_barrier $SINGLEMDS
174     drop_reint_reply "mcreate $MOUNT1/$tfile"    || return 1
175     fail $SINGLEMDS
176     checkstat $MOUNT2/$tfile || return 2
177     rm $MOUNT1/$tfile || return 3
178
179     return 0
180 }
181 run_test 8 "replay of resent request"
182
183 test_9() {
184     replay_barrier $SINGLEMDS
185     mcreate $MOUNT1/$tfile-1
186     mcreate $MOUNT2/$tfile-2
187     # drop first reint reply
188     do_facet $SINGLEMDS lctl set_param fail_loc=0x80000119
189     fail $SINGLEMDS
190     do_facet $SINGLEMDS lctl set_param fail_loc=0
191
192     rm $MOUNT1/$tfile-[1,2] || return 1
193
194     return 0
195 }
196 run_test 9 "resending a replayed create"
197
198 test_10() {
199     mcreate $MOUNT1/$tfile-1
200     replay_barrier $SINGLEMDS
201     munlink $MOUNT1/$tfile-1
202     mcreate $MOUNT2/$tfile-2
203     # drop first reint reply
204     do_facet $SINGLEMDS lctl set_param fail_loc=0x80000119
205     fail $SINGLEMDS
206     do_facet $SINGLEMDS lctl set_param fail_loc=0
207
208     checkstat $MOUNT1/$tfile-1 && return 1
209     checkstat $MOUNT1/$tfile-2 || return 2
210     rm $MOUNT1/$tfile-2
211
212     return 0
213 }
214 run_test 10 "resending a replayed unlink"
215
216 test_11() {
217     replay_barrier $SINGLEMDS
218     mcreate $MOUNT1/$tfile-1
219     mcreate $MOUNT2/$tfile-2
220     mcreate $MOUNT1/$tfile-3
221     mcreate $MOUNT2/$tfile-4
222     mcreate $MOUNT1/$tfile-5
223     # drop all reint replies for a while
224     do_facet $SINGLEMDS lctl set_param fail_loc=0x0119
225     # note that with this fail_loc set, facet_failover df will fail
226     facet_failover $SINGLEMDS
227     #sleep for while, let both clients reconnect and timeout
228     sleep $((TIMEOUT * 2))
229     do_facet $SINGLEMDS lctl set_param fail_loc=0
230
231     rm $MOUNT1/$tfile-[1-5] || return 1
232
233     return 0
234 }
235 run_test 11 "both clients timeout during replay"
236
237 test_12() {
238     replay_barrier $SINGLEMDS
239
240     multiop_bg_pause $DIR/$tfile mo_c || return 1
241     MULTIPID=$!
242
243 #define OBD_FAIL_LDLM_ENQUEUE            0x302
244     do_facet $SINGLEMDS lctl set_param fail_loc=0x80000302
245     facet_failover $SINGLEMDS
246     do_facet $SINGLEMDS lctl set_param fail_loc=0
247     clients_up || return 1
248
249     ls $DIR/$tfile
250     kill -USR1 $MULTIPID || return 3
251     wait $MULTIPID || return 4
252     $CHECKSTAT -t file $DIR/$tfile || return 2
253     rm $DIR/$tfile
254
255     return 0
256 }
257 run_test 12 "open resend timeout"
258
259 test_13() {
260     multiop_bg_pause $DIR/$tfile mo_c || return 1
261     MULTIPID=$!
262
263     replay_barrier $SINGLEMDS
264
265     kill -USR1 $MULTIPID || return 3
266     wait $MULTIPID || return 4
267
268     # drop close
269     do_facet $SINGLEMDS lctl set_param fail_loc=0x80000115
270     facet_failover $SINGLEMDS
271     do_facet $SINGLEMDS lctl set_param fail_loc=0
272     clients_up || return 1
273
274     ls $DIR/$tfile
275     $CHECKSTAT -t file $DIR/$tfile || return 2
276     rm $DIR/$tfile
277
278     return 0
279 }
280 run_test 13 "close resend timeout"
281
282 # test 14a removed after 18143 because it shouldn't fail anymore and do the same
283 # as test_15a
284
285 test_14b() {
286     wait_mds_ost_sync
287     wait_destroy_complete
288     BEFOREUSED=`df -P $DIR | tail -1 | awk '{ print $3 }'`
289     mkdir -p $MOUNT1/$tdir
290     $SETSTRIPE -o 0 $MOUNT1/$tdir
291     replay_barrier $SINGLEMDS
292     createmany -o $MOUNT1/$tdir/$tfile- 5
293
294     $SETSTRIPE -o 0 $MOUNT2/f14b-3
295     echo "data" > $MOUNT2/f14b-3
296     createmany -o $MOUNT1/$tdir/$tfile-3- 5
297     umount $MOUNT2
298
299     fail $SINGLEMDS
300     wait_recovery_complete $SINGLEMDS || error "MDS recovery not done"
301
302     # first 25 files should have been replayed
303     unlinkmany $MOUNT1/$tdir/$tfile- 5 || return 2
304     unlinkmany $MOUNT1/$tdir/$tfile-3- 5 || return 3
305
306     zconf_mount `hostname` $MOUNT2 || error "mount $MOUNT2 fail"
307
308     wait_mds_ost_sync || return 4
309     wait_destroy_complete || return 5
310
311     AFTERUSED=`df -P $DIR | tail -1 | awk '{ print $3 }'`
312     log "before $BEFOREUSED, after $AFTERUSED"
313     [ $AFTERUSED -ne $BEFOREUSED ] && \
314         error "after $AFTERUSED > before $BEFOREUSED" && return 4
315     return 0
316 }
317 run_test 14b "delete ost orphans if gap occured in objids due to VBR"
318
319 test_15a() { # was test_15
320     replay_barrier $SINGLEMDS
321     createmany -o $MOUNT1/$tfile- 25
322     createmany -o $MOUNT2/$tfile-2- 1
323     umount $MOUNT2
324
325     fail $SINGLEMDS
326
327     unlinkmany $MOUNT1/$tfile- 25 || return 2
328     [ -e $MOUNT1/$tfile-2-0 ] && error "$tfile-2-0 exists"
329
330     zconf_mount `hostname` $MOUNT2 || error "mount $MOUNT2 fail"
331     return 0
332 }
333 run_test 15a "timeout waiting for lost client during replay, 1 client completes"
334
335 test_15c() {
336     replay_barrier $SINGLEMDS
337     for ((i = 0; i < 2000; i++)); do
338         echo "data" > "$MOUNT2/${tfile}-$i" || error "create ${tfile}-$i failed"
339     done
340     umount $MOUNT2
341
342     fail $SINGLEMDS
343
344     zconf_mount `hostname` $MOUNT2 || error "mount $MOUNT2 fail"
345     return 0
346 }
347 run_test 15c "remove multiple OST orphans"
348
349 test_16() {
350     replay_barrier $SINGLEMDS
351     createmany -o $MOUNT1/$tfile- 25
352     createmany -o $MOUNT2/$tfile-2- 1
353     umount $MOUNT2
354
355     facet_failover $SINGLEMDS
356     sleep $TIMEOUT
357     fail $SINGLEMDS
358
359     unlinkmany $MOUNT1/$tfile- 25 || return 2
360
361     zconf_mount `hostname` $MOUNT2 || error "mount $MOUNT2 fail"
362     return 0
363
364 }
365 run_test 16 "fail MDS during recovery (3571)"
366
367 test_17() {
368     remote_ost_nodsh && skip "remote OST with nodsh" && return 0
369
370     createmany -o $MOUNT1/$tfile- 25
371     createmany -o $MOUNT2/$tfile-2- 1
372
373     # Make sure the disconnect is lost
374     replay_barrier ost1
375     umount $MOUNT2
376
377     facet_failover ost1
378     sleep $TIMEOUT
379     fail ost1
380
381     unlinkmany $MOUNT1/$tfile- 25 || return 2
382
383     zconf_mount `hostname` $MOUNT2 || error "mount $MOUNT2 fail"
384     return 0
385
386 }
387 run_test 17 "fail OST during recovery (3571)"
388
389 # cleanup with blocked enqueue fails until timer elapses (MDS busy), wait for it
390 export NOW=0
391
392 test_18() { # bug 3822 - evicting client with enqueued lock
393     #set -vx
394     mkdir -p $MOUNT1/$tdir
395     touch $MOUNT1/$tdir/f0
396 #define OBD_FAIL_LDLM_ENQUEUE_BLOCKED    0x30b
397     statmany -s $MOUNT1/$tdir/f 1 500 &
398     OPENPID=$!
399     NOW=`date +%s`
400     do_facet $SINGLEMDS lctl set_param fail_loc=0x8000030b  # hold enqueue
401     sleep 1
402 #define OBD_FAIL_LDLM_BL_CALLBACK        0x305
403     do_facet client lctl set_param fail_loc=0x80000305  # drop cb, evict
404     cancel_lru_locks mdc
405     usleep 500 # wait to ensure first client is one that will be evicted
406     openfile -f O_RDONLY $MOUNT2/$tdir/f0
407     wait $OPENPID
408     dmesg | grep "entering recovery in server" && \
409         error "client not evicted" || true
410     do_facet client "lctl set_param fail_loc=0"
411     do_facet $SINGLEMDS "lctl set_param fail_loc=0"
412 }
413 run_test 18 "ldlm_handle_enqueue succeeds on evicted export (3822)"
414
415 test_19() { # Bug 10991 - resend of open request does not fail assertion.
416     replay_barrier $SINGLEMDS
417     drop_ldlm_reply "createmany -o $DIR/$tfile 1" || return 1
418     fail $SINGLEMDS
419     checkstat $DIR2/${tfile}0 || return 2
420     rm $DIR/${tfile}0 || return 3
421
422     return 0
423 }
424 run_test 19 "resend of open request"
425
426 test_20() { #16389
427     BEFORE=`date +%s`
428     replay_barrier $SINGLEMDS
429     touch $MOUNT1/a
430     touch $MOUNT2/b
431     umount $MOUNT2
432     fail $SINGLEMDS
433     rm $MOUNT1/a
434     zconf_mount `hostname` $MOUNT2 || error "mount $MOUNT2 fail"
435     TIER1=$((`date +%s` - BEFORE))
436     BEFORE=`date +%s`
437     replay_barrier $SINGLEMDS
438     touch $MOUNT1/a
439     touch $MOUNT2/b
440     umount $MOUNT2
441     fail $SINGLEMDS
442     rm $MOUNT1/a
443     zconf_mount `hostname` $MOUNT2 || error "mount $MOUNT2 fail"
444     TIER2=$((`date +%s` - BEFORE))
445     [ $TIER2 -ge $((TIER1 * 2)) ] && \
446         error "recovery time is growing $TIER2 > $TIER1"
447     return 0
448 }
449 run_test 20 "recovery time is not increasing"
450
451 # commit on sharing tests
452 test_21a() {
453     local param_file=$TMP/$tfile-params
454
455     save_lustre_params $(facet_active_host $SINGLEMDS) "mdt.*.commit_on_sharing" > $param_file
456     do_facet $SINGLEMDS lctl set_param mdt.*.commit_on_sharing=1
457     touch  $MOUNT1/$tfile-1
458     mv  $MOUNT2/$tfile-1 $MOUNT2/$tfile-2
459     mv  $MOUNT1/$tfile-2 $MOUNT1/$tfile-3
460     replay_barrier_nosync $SINGLEMDS
461     umount $MOUNT2
462
463     facet_failover $SINGLEMDS
464
465     # all renames are replayed
466     unlink  $MOUNT1/$tfile-3 || return 2
467
468     zconf_mount `hostname` $MOUNT2 || error "mount $MOUNT2 fail"
469
470     do_facet $SINGLEMDS lctl set_param mdt.*.commit_on_sharing=0
471     rm -rf $MOUNT1/$tfile-*
472     restore_lustre_params < $param_file
473     rm -f $param_file
474     return 0
475 }
476 run_test 21a "commit on sharing"
477
478 test_21b_sub () {
479     local mds=$1 
480     do_node $CLIENT1 rm -f $MOUNT1/$tfile-*
481
482     do_facet $mds sync
483     do_node $CLIENT1 touch  $MOUNT1/$tfile-1
484     do_node $CLIENT2 mv  $MOUNT1/$tfile-1 $MOUNT1/$tfile-2
485     do_node $CLIENT1 mv  $MOUNT1/$tfile-2 $MOUNT1/$tfile-3
486
487     replay_barrier_nosync $mds
488     shutdown_client $CLIENT2 $MOUNT1
489
490     facet_failover $mds
491
492     # were renames replayed?
493     local rc=0
494     echo UNLINK $MOUNT1/$tfile-3 
495     do_node $CLIENT1 unlink  $MOUNT1/$tfile-3 || \
496         { echo "unlink $tfile-3 fail!" && rc=1; }
497
498     boot_node $CLIENT2
499     zconf_mount_clients $CLIENT2 $MOUNT1 || error "mount $CLIENT2 $MOUNT1 fail" 
500
501     return $rc
502 }
503
504 test_21b() {
505     [ -z "$CLIENTS" ] && skip "Need two or more clients." && return
506     [ $CLIENTCOUNT -lt 2 ] && \
507         { skip "Need two or more clients, have $CLIENTCOUNT" && return; }
508
509     if [ "$FAILURE_MODE" = "HARD" ] &&  mixed_mdt_devs; then
510         skip "Several mdt services on one mds node are used with FAILURE_MODE=$FAILURE_MODE. "
511         return 0
512     fi
513
514
515     zconf_umount_clients $CLIENTS $MOUNT2
516     zconf_mount_clients $CLIENTS $MOUNT1
517
518     local param_file=$TMP/$tfile-params
519
520     local num=$(get_mds_dir $MOUNT1)
521
522     save_lustre_params $(facet_active_host mds$num) "mdt.*.commit_on_sharing" > $param_file
523
524     # COS enabled
525     local COS=1
526     do_facet mds$num lctl set_param mdt.*.commit_on_sharing=$COS
527
528     test_21b_sub mds$num || error "Not all renames are replayed. COS=$COS"
529
530     # COS disabled (should fail)
531     COS=0
532     do_facet mds$num lctl set_param mdt.*.commit_on_sharing=$COS
533
534     # there is still a window when transactions may be written to disk before
535     # the mds device is set R/O. To avoid such a rare test failure, the check
536     # is repeated several times.
537     local n_attempts=1
538     while true; do
539     test_21b_sub mds$num || break;
540     let n_attempts=n_attempts+1
541     [ $n_attempts -gt 3 ] &&
542         error "The test cannot check whether COS works or not: all renames are replied w/o COS"
543     done
544     restore_lustre_params < $param_file
545     rm -f $param_file
546     return 0
547 }
548 run_test 21b "commit on sharing, two clients"
549
550 # end commit on sharing tests 
551
552 equals_msg `basename $0`: test complete, cleaning up
553 SLEEP=$((`date +%s` - $NOW))
554 [ $SLEEP -lt $TIMEOUT ] && sleep $SLEEP
555 [ "$MOUNTED2" = yes ] && zconf_umount $HOSTNAME $MOUNT2 || true
556 check_and_cleanup_lustre
557 [ -f "$TESTSUITELOG" ] && cat $TESTSUITELOG && grep -q FAIL $TESTSUITELOG && exit 1 || true