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