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