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