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