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