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