Whamcloud - gitweb
b=21379 Fix orphans proceeding in osc_create
[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() {
257     replay_barrier $SINGLEMDS
258     createmany -o $MOUNT1/$tfile- 25
259     createmany -o $MOUNT2/$tfile-2- 1
260     createmany -o $MOUNT1/$tfile-3- 25
261     umount $MOUNT2
262
263     facet_failover $SINGLEMDS
264     # expect failover to fail due to missing client 2
265     client_evicted || return 1
266     sleep 1
267
268     # first 25 files should have been replayed 
269     unlinkmany $MOUNT1/$tfile- 25 || return 2
270
271     zconf_mount `hostname` $MOUNT2 || error "mount $MOUNT2 fail" 
272     return 0
273 }
274 run_test 14a "timeouts waiting for lost client during replay"
275
276 test_14b() {
277     wait_mds_ost_sync
278     wait_destroy_complete
279     BEFOREUSED=`df -P $DIR | tail -1 | awk '{ print $3 }'`
280     mkdir -p $MOUNT1/$tdir
281     $SETSTRIPE -o 0 $MOUNT1/$tdir
282     replay_barrier $SINGLEMDS
283     createmany -o $MOUNT1/$tdir/$tfile- 5
284
285     $SETSTRIPE -o 0 $MOUNT2/f14b-3
286     echo "data" > $MOUNT2/f14b-3
287     createmany -o $MOUNT1/$tdir/$tfile-3- 5
288     umount $MOUNT2
289
290     fail $SINGLEMDS
291     wait_recovery_complete $SINGLEMDS || error "MDS recovery not done"
292
293     # first 25 files should have been replayed
294     unlinkmany $MOUNT1/$tdir/$tfile- 5 || return 2
295     unlinkmany $MOUNT1/$tdir/$tfile-3- 5 || return 3
296
297     zconf_mount `hostname` $MOUNT2 || error "mount $MOUNT2 fail"
298
299     wait_mds_ost_sync || return 4
300     wait_destroy_complete || return 5
301
302     AFTERUSED=`df -P $DIR | tail -1 | awk '{ print $3 }'`
303     log "before $BEFOREUSED, after $AFTERUSED"
304     [ $AFTERUSED -ne $BEFOREUSED ] && \
305         error "after $AFTERUSED > before $BEFOREUSED" && return 4
306     return 0
307 }
308 run_test 14b "delete ost orphans if gap occured in objids due to VBR"
309
310 test_15a() { # was test_15
311     replay_barrier $SINGLEMDS
312     createmany -o $MOUNT1/$tfile- 25
313     createmany -o $MOUNT2/$tfile-2- 1
314     umount $MOUNT2
315
316     fail $SINGLEMDS
317
318     unlinkmany $MOUNT1/$tfile- 25 || return 2
319     [ -e $MOUNT1/$tfile-2-0 ] && error "$tfile-2-0 exists"
320
321     zconf_mount `hostname` $MOUNT2 || error "mount $MOUNT2 fail"
322     return 0
323 }
324 run_test 15a "timeout waiting for lost client during replay, 1 client completes"
325
326 test_15c() {
327     replay_barrier $SINGLEMDS
328     for ((i = 0; i < 2000; i++)); do
329         echo "data" > "$MOUNT2/${tfile}-$i" || error "create ${tfile}-$i failed"
330     done
331     umount $MOUNT2
332
333     fail $SINGLEMDS
334
335     zconf_mount `hostname` $MOUNT2 || error "mount $MOUNT2 fail"
336     return 0
337 }
338 run_test 15c "remove multiple OST orphans"
339
340 test_16() {
341     replay_barrier $SINGLEMDS
342     createmany -o $MOUNT1/$tfile- 25
343     createmany -o $MOUNT2/$tfile-2- 1
344     umount $MOUNT2
345
346     facet_failover $SINGLEMDS
347     sleep $TIMEOUT
348     fail $SINGLEMDS
349
350     unlinkmany $MOUNT1/$tfile- 25 || return 2
351
352     zconf_mount `hostname` $MOUNT2 || error "mount $MOUNT2 fail"
353     return 0
354
355 }
356 run_test 16 "fail MDS during recovery (3571)"
357
358 test_17() {
359     remote_ost_nodsh && skip "remote OST with nodsh" && return 0
360
361     createmany -o $MOUNT1/$tfile- 25
362     createmany -o $MOUNT2/$tfile-2- 1
363
364     # Make sure the disconnect is lost
365     replay_barrier ost1
366     umount $MOUNT2
367
368     facet_failover ost1
369     sleep $TIMEOUT
370     fail ost1
371
372     unlinkmany $MOUNT1/$tfile- 25 || return 2
373
374     zconf_mount `hostname` $MOUNT2 || error "mount $MOUNT2 fail"
375     return 0
376
377 }
378 run_test 17 "fail OST during recovery (3571)"
379
380 # cleanup with blocked enqueue fails until timer elapses (MDS busy), wait for it
381 export NOW=0
382
383 test_18() { # bug 3822 - evicting client with enqueued lock
384     #set -vx
385     mkdir -p $MOUNT1/$tdir
386     touch $MOUNT1/$tdir/f0
387 #define OBD_FAIL_LDLM_ENQUEUE_BLOCKED    0x30b
388     statmany -s $MOUNT1/$tdir/f 1 500 &
389     OPENPID=$!
390     NOW=`date +%s`
391     do_facet $SINGLEMDS lctl set_param fail_loc=0x8000030b  # hold enqueue
392     sleep 1
393 #define OBD_FAIL_LDLM_BL_CALLBACK        0x305
394     do_facet client lctl set_param fail_loc=0x80000305  # drop cb, evict
395     cancel_lru_locks mdc
396     usleep 500 # wait to ensure first client is one that will be evicted
397     openfile -f O_RDONLY $MOUNT2/$tdir/f0
398     wait $OPENPID
399     dmesg | grep "entering recovery in server" && \
400         error "client not evicted" || true
401     do_facet client "lctl set_param fail_loc=0"
402     do_facet $SINGLEMDS "lctl set_param fail_loc=0"
403 }
404 run_test 18 "ldlm_handle_enqueue succeeds on evicted export (3822)"
405
406 test_19() { # Bug 10991 - resend of open request does not fail assertion.
407     replay_barrier $SINGLEMDS
408     drop_ldlm_reply "createmany -o $DIR/$tfile 1" || return 1
409     fail $SINGLEMDS
410     checkstat $DIR2/${tfile}0 || return 2
411     rm $DIR/${tfile}0 || return 3
412
413     return 0
414 }
415 run_test 19 "resend of open request"
416
417 test_20() { #16389
418     BEFORE=`date +%s`
419     replay_barrier $SINGLEMDS
420     touch $MOUNT1/a
421     touch $MOUNT2/b
422     umount $MOUNT2
423     fail $SINGLEMDS
424     rm $MOUNT1/a
425     zconf_mount `hostname` $MOUNT2 || error "mount $MOUNT2 fail"
426     TIER1=$((`date +%s` - BEFORE))
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     TIER2=$((`date +%s` - BEFORE))
436     [ $TIER2 -ge $((TIER1 * 2)) ] && \
437         error "recovery time is growing $TIER2 > $TIER1"
438     return 0
439 }
440 run_test 20 "recovery time is not increasing"
441
442 # commit on sharing tests
443 test_21a() {
444     local param_file=$TMP/$tfile-params
445
446     save_lustre_params $(facet_active_host $SINGLEMDS) "mdt.*.commit_on_sharing" > $param_file
447     do_facet $SINGLEMDS lctl set_param mdt.*.commit_on_sharing=1
448     touch  $MOUNT1/$tfile-1
449     mv  $MOUNT2/$tfile-1 $MOUNT2/$tfile-2
450     mv  $MOUNT1/$tfile-2 $MOUNT1/$tfile-3
451     replay_barrier_nosync $SINGLEMDS
452     umount $MOUNT2
453
454     facet_failover $SINGLEMDS
455
456     # all renames are replayed
457     unlink  $MOUNT1/$tfile-3 || return 2
458
459     zconf_mount `hostname` $MOUNT2 || error "mount $MOUNT2 fail"
460
461     do_facet $SINGLEMDS lctl set_param mdt.*.commit_on_sharing=0
462     rm -rf $MOUNT1/$tfile-*
463     restore_lustre_params < $param_file
464     rm -f $param_file
465     return 0
466 }
467 run_test 21a "commit on sharing"
468
469 test_21b_sub () {
470     local mds=$1 
471     do_node $CLIENT1 rm -f $MOUNT1/$tfile-*
472
473     do_facet $mds sync
474     do_node $CLIENT1 touch  $MOUNT1/$tfile-1
475     do_node $CLIENT2 mv  $MOUNT1/$tfile-1 $MOUNT1/$tfile-2
476     do_node $CLIENT1 mv  $MOUNT1/$tfile-2 $MOUNT1/$tfile-3
477
478     replay_barrier_nosync $mds
479     shutdown_client $CLIENT2 $MOUNT1
480
481     facet_failover $mds
482
483     # were renames replayed?
484     local rc=0
485     echo UNLINK $MOUNT1/$tfile-3 
486     do_node $CLIENT1 unlink  $MOUNT1/$tfile-3 || \
487         { echo "unlink $tfile-3 fail!" && rc=1; }
488
489     boot_node $CLIENT2
490     zconf_mount_clients $CLIENT2 $MOUNT1 || error "mount $CLIENT2 $MOUNT1 fail" 
491
492     return $rc
493 }
494
495 test_21b() {
496     [ -z "$CLIENTS" ] && skip "Need two or more clients." && return
497     [ $CLIENTCOUNT -lt 2 ] && \
498         { skip "Need two or more clients, have $CLIENTCOUNT" && return; }
499
500     if [ "$FAILURE_MODE" = "HARD" ] &&  mixed_mdt_devs; then
501         skip "Several mdt services on one mds node are used with FAILURE_MODE=$FAILURE_MODE. "
502         return 0
503     fi
504
505
506     zconf_umount_clients $CLIENTS $MOUNT2
507     zconf_mount_clients $CLIENTS $MOUNT1
508
509     local param_file=$TMP/$tfile-params
510
511     local num=$(get_mds_dir $MOUNT1)
512
513     save_lustre_params $(facet_active_host mds$num) "mdt.*.commit_on_sharing" > $param_file
514
515     # COS enabled
516     local COS=1
517     do_facet mds$num lctl set_param mdt.*.commit_on_sharing=$COS
518
519     test_21b_sub mds$num || error "Not all renames are replayed. COS=$COS"
520
521     # COS disabled (should fail)
522     COS=0
523     do_facet mds$num lctl set_param mdt.*.commit_on_sharing=$COS
524
525     # there is still a window when transactions may be written to disk before
526     # the mds device is set R/O. To avoid such a rare test failure, the check
527     # is repeated several times.
528     local n_attempts=1
529     while true; do
530     test_21b_sub mds$num || break;
531     let n_attempts=n_attempts+1
532     [ $n_attemtps -gt 3] &&
533         error "The test cannot check whether COS works or not: all renames are replied w/o COS"
534     done
535     restore_lustre_params < $param_file
536     rm -f $param_file
537     return 0
538 }
539 run_test 21b "commit on sharing, two clients"
540
541 # end commit on sharing tests 
542
543 equals_msg `basename $0`: test complete, cleaning up
544 SLEEP=$((`date +%s` - $NOW))
545 [ $SLEEP -lt $TIMEOUT ] && sleep $SLEEP
546 [ "$MOUNTED2" = yes ] && zconf_umount $HOSTNAME $MOUNT2 || true
547 check_and_cleanup_lustre
548 [ -f "$TESTSUITELOG" ] && cat $TESTSUITELOG && grep -q FAIL $TESTSUITELOG && exit 1 || true