Whamcloud - gitweb
b=18801
[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 SAVE_PWD=$PWD
9 PTLDEBUG=${PTLDEBUG:--1}
10 LUSTRE=${LUSTRE:-$(cd $(dirname $0)/..; echo $PWD)}
11 SETUP=${SETUP:-""}
12 CLEANUP=${CLEANUP:-""}
13 MOUNT_2=${MOUNT_2:-"yes"}
14 . $LUSTRE/tests/test-framework.sh
15
16 if [ "$FAILURE_MODE" = "HARD" ] && mixed_ost_devs; then
17     CONFIG_EXCEPTIONS="17"
18     echo -n "Several ost services on one ost node are used with FAILURE_MODE=$FAILURE_MODE. "
19     echo "Except the tests: $CONFIG_EXCEPTIONS"
20     ALWAYS_EXCEPT="$ALWAYS_EXCEPT $CONFIG_EXCEPTIONS"
21 fi
22
23 init_test_env $@
24
25 . ${CONFIG:=$LUSTRE/tests/cfg/$NAME.sh}
26
27 remote_mds_nodsh && skip "remote MDS with nodsh" && exit 0
28
29 [ "$SLOW" = "no" ] && EXCEPT_SLOW="1 2 3 4 5 14"
30
31 build_test_filter
32
33 check_and_setup_lustre
34 MOUNTED=$(mounted_lustre_filesystems)
35 if ! $(echo $MOUNTED | grep -w -q $MOUNT2); then
36     zconf_mount $HOSTNAME $MOUNT2
37     MOUNTED2=yes
38 fi
39
40 assert_DIR
41 rm -rf $DIR/[df][0-9]*
42
43 [ "$DAEMONFILE" ] && $LCTL debug_daemon start $DAEMONFILE $DAEMONSIZE
44
45 test_1() {
46     touch $MOUNT1/a
47     replay_barrier mds
48     touch $MOUNT2/b
49
50     fail mds
51     checkstat $MOUNT2/a || return 1
52     checkstat $MOUNT1/b || return 2
53     rm $MOUNT2/a $MOUNT1/b
54     checkstat $MOUNT1/a && return 3
55     checkstat $MOUNT2/b && return 4
56     return 0
57 }
58
59 run_test 1 "|X| simple create"
60
61
62 test_2() {
63     replay_barrier mds
64     mkdir $MOUNT1/adir
65
66     fail mds
67     checkstat $MOUNT2/adir || return 1
68     rmdir $MOUNT2/adir
69     checkstat $MOUNT2/adir && return 2
70     return 0
71 }
72 run_test 2 "|X| mkdir adir"
73
74 test_3() {
75     replay_barrier mds
76     mkdir $MOUNT1/adir
77     mkdir $MOUNT2/adir/bdir
78
79     fail mds
80     checkstat $MOUNT2/adir      || return 1
81     checkstat $MOUNT1/adir/bdir || return 2
82     rmdir $MOUNT2/adir/bdir $MOUNT1/adir
83     checkstat $MOUNT1/adir      && return 3
84     checkstat $MOUNT2/adir/bdir && return 4
85     return 0
86 }
87 run_test 3 "|X| mkdir adir, mkdir adir/bdir "
88
89 test_4() {
90     mkdir $MOUNT1/adir
91     replay_barrier mds
92     mkdir $MOUNT1/adir  && return 1
93     mkdir $MOUNT2/adir/bdir
94
95     fail mds
96     checkstat $MOUNT2/adir      || return 2
97     checkstat $MOUNT1/adir/bdir || return 3
98
99     rmdir $MOUNT2/adir/bdir $MOUNT1/adir
100     checkstat $MOUNT1/adir      && return 4
101     checkstat $MOUNT2/adir/bdir && return 5
102     return 0
103 }
104 run_test 4 "|X| mkdir adir (-EEXIST), mkdir adir/bdir "
105
106
107 test_5() {
108     # multiclient version of replay_single.sh/test_8
109     mcreate $MOUNT1/a
110     multiop_bg_pause $MOUNT2/a o_tSc || return  1
111     pid=$!
112     rm -f $MOUNT1/a
113     replay_barrier mds
114     kill -USR1 $pid
115     wait $pid || return 1
116
117     fail mds
118     [ -e $MOUNT2/a ] && return 2
119     return 0
120 }
121 run_test 5 "open, unlink |X| close"
122
123
124 test_6() {
125     mcreate $MOUNT1/a
126     multiop_bg_pause $MOUNT2/a o_c || return 1
127     pid1=$!
128     multiop_bg_pause $MOUNT1/a o_c || return 1
129     pid2=$!
130     rm -f $MOUNT1/a
131     replay_barrier mds
132     kill -USR1 $pid1
133     wait $pid1 || return 1
134
135     fail mds
136     kill -USR1 $pid2
137     wait $pid2 || return 1
138     [ -e $MOUNT2/a ] && return 2
139     return 0
140 }
141 run_test 6 "open1, open2, unlink |X| close1 [fail mds] close2"
142
143 test_8() {
144     replay_barrier mds
145     drop_reint_reply "mcreate $MOUNT1/$tfile"    || return 1
146     fail mds
147     checkstat $MOUNT2/$tfile || return 2
148     rm $MOUNT1/$tfile || return 3
149
150     return 0
151 }
152 run_test 8 "replay of resent request"
153
154 test_9() {
155     replay_barrier mds
156     mcreate $MOUNT1/$tfile-1
157     mcreate $MOUNT2/$tfile-2
158     # drop first reint reply
159     do_facet mds lctl set_param fail_loc=0x80000119
160     fail mds
161     do_facet mds lctl set_param fail_loc=0
162
163     rm $MOUNT1/$tfile-[1,2] || return 1
164
165     return 0
166 }
167 run_test 9 "resending a replayed create"
168
169 test_10() {
170     mcreate $MOUNT1/$tfile-1
171     replay_barrier mds
172     munlink $MOUNT1/$tfile-1
173     mcreate $MOUNT2/$tfile-2
174     # drop first reint reply
175     do_facet mds lctl set_param fail_loc=0x80000119
176     fail mds
177     do_facet mds lctl set_param fail_loc=0
178
179     checkstat $MOUNT1/$tfile-1 && return 1
180     checkstat $MOUNT1/$tfile-2 || return 2
181     rm $MOUNT1/$tfile-2
182
183     return 0
184 }
185 run_test 10 "resending a replayed unlink"
186
187 test_11() {
188     replay_barrier mds
189     mcreate $MOUNT1/$tfile-1
190     mcreate $MOUNT2/$tfile-2
191     mcreate $MOUNT1/$tfile-3
192     mcreate $MOUNT2/$tfile-4
193     mcreate $MOUNT1/$tfile-5
194     # drop all reint replies for a while
195     do_facet mds lctl set_param fail_loc=0x0119
196     # note that with this fail_loc set, facet_failover df will fail
197     facet_failover mds
198     #sleep for while, let both clients reconnect and timeout
199     sleep $((TIMEOUT * 2))
200     do_facet mds lctl set_param fail_loc=0
201     client_df
202     while [ -z "$(ls $MOUNT1/$tfile-[1-5] 2>/dev/null)" ]; do
203         sleep 5
204         echo -n "."
205     done
206     ls $MOUNT1/$tfile-[1-5]
207     rm $MOUNT1/$tfile-[1-5] || return 1
208
209     return 0
210 }
211 run_test 11 "both clients timeout during replay"
212
213 test_12() {
214     replay_barrier mds
215
216     multiop_bg_pause $DIR/$tfile mo_c || return 1
217     MULTIPID=$!
218
219 #define OBD_FAIL_LDLM_ENQUEUE            0x302
220     do_facet mds lctl set_param fail_loc=0x80000302
221     facet_failover mds
222     do_facet mds lctl set_param fail_loc=0
223     df $MOUNT || { kill -USR1 $MULTIPID  && return 1; }
224
225     ls $DIR/$tfile
226     kill -USR1 $MULTIPID || return 3
227     wait $MULTIPID || return 4
228     $CHECKSTAT -t file $DIR/$tfile || return 2
229     rm $DIR/$tfile
230
231     return 0
232 }
233 run_test 12 "open resend timeout"
234
235 test_13() {
236     multiop_bg_pause $DIR/$tfile mo_c || return 1
237     MULTIPID=$!
238
239     replay_barrier mds
240
241     kill -USR1 $MULTIPID || return 3
242     wait $MULTIPID || return 4
243
244     # drop close 
245     do_facet mds lctl set_param fail_loc=0x80000115
246     facet_failover mds
247     do_facet mds lctl set_param fail_loc=0
248     df $MOUNT || return 1
249
250     ls $DIR/$tfile
251     $CHECKSTAT -t file $DIR/$tfile || return 2
252     rm $DIR/$tfile
253
254     return 0
255 }
256 run_test 13 "close resend timeout"
257
258 test_14a() {
259     replay_barrier mds
260     createmany -o $MOUNT1/$tfile- 25
261     createmany -o $MOUNT2/$tfile-2- 1
262     createmany -o $MOUNT1/$tfile-3- 25
263     umount $MOUNT2
264
265     facet_failover mds
266     # expect recovery to fail due to missing client 2
267     df $MOUNT1 && return 1
268     sleep 1
269
270     # first 25 files should have been replayed
271     unlinkmany $MOUNT1/$tfile- 25 || return 2
272
273     zconf_mount `hostname` $MOUNT2 || error "mount $MOUNT2 fail"
274     return 0
275 }
276 run_test 14a "timeouts waiting for lost client during replay"
277
278 test_14b() {
279     BEFOREUSED=`df -P $DIR | tail -1 | awk '{ print $3 }'`
280     #lfs setstripe --index=0 --count=1 $MOUNT1
281     mkdir -p $MOUNT1/$tdir
282     #lfs setstripe --index=0 --count=1 $MOUNT1/$tdir
283     replay_barrier mds
284     createmany -o $MOUNT1/$tfile- 5
285     echo "data" > $MOUNT2/$tdir/$tfile-2
286     createmany -o $MOUNT1/$tfile-3- 5
287     umount $MOUNT2
288
289     facet_failover mds
290     # expect recovery don't fail due to VBR
291     df $MOUNT1 || return 1
292
293     # first 25 files should have been replayed
294     unlinkmany $MOUNT1/$tfile- 5 || return 2
295     unlinkmany $MOUNT1/$tfile-3- 5 || return 3
296
297     zconf_mount `hostname` $MOUNT2 || error "mount $MOUNT2 fail"
298     # give ost time to process llogs
299     sleep 3
300     AFTERUSED=`df -P $DIR | tail -1 | awk '{ print $3 }'`
301     log "before $BEFOREUSED, after $AFTERUSED"
302     [ $AFTERUSED -ne $BEFOREUSED ] && \
303         error "after $AFTERUSED > before $BEFOREUSED" && return 4
304     return 0
305 }
306 run_test 14b "delete ost orphans if gap occured in objids due to VBR"
307
308 test_15a() {    # was test_15
309     replay_barrier mds
310     createmany -o $MOUNT1/$tfile- 25
311     createmany -o $MOUNT2/$tfile-2- 1
312     umount $MOUNT2
313
314     facet_failover mds
315     df $MOUNT || return 1
316
317     unlinkmany $MOUNT1/$tfile- 25 || return 2
318     [ -e $MOUNT1/$tfile-2-0 ] && error "$tfile-2-0 exists"
319
320     zconf_mount `hostname` $MOUNT2 || error "mount $MOUNT2 fail"
321     return 0
322 }
323 run_test 15a "timeout waiting for lost client during replay, 1 client completes"
324
325 test_15c() {
326     replay_barrier mds
327     for ((i = 0; i < 2000; i++)); do
328         echo "data" > "$MOUNT2/${tfile}-$i" || error "create ${tfile}-$i failed"
329     done
330
331     umount $MOUNT2
332     facet_failover mds
333
334     df $MOUNT || return 1
335
336     zconf_mount `hostname` $MOUNT2 || error "mount $MOUNT2 fail"
337     return 0
338 }
339 run_test 15c "remove multiple OST orphans"
340
341 test_16() {
342     replay_barrier mds
343     createmany -o $MOUNT1/$tfile- 25
344     createmany -o $MOUNT2/$tfile-2- 1
345     umount $MOUNT2
346
347     facet_failover mds
348     sleep $TIMEOUT
349     facet_failover mds
350     df $MOUNT || return 1
351
352     unlinkmany $MOUNT1/$tfile- 25 || return 2
353
354     zconf_mount `hostname` $MOUNT2 || error "mount $MOUNT2 fail"
355     return 0
356
357 }
358 run_test 16 "fail MDS during recovery (3571)"
359
360 test_17() {
361     remote_ost_nodsh && skip "remote OST with nodsh" && return 0
362
363     createmany -o $MOUNT1/$tfile- 25
364     createmany -o $MOUNT2/$tfile-2- 1
365
366     # Make sure the disconnect is lost
367     replay_barrier ost1
368     umount $MOUNT2
369
370     facet_failover ost1
371     sleep $TIMEOUT
372     facet_failover ost1
373     df $MOUNT || return 1
374
375     unlinkmany $MOUNT1/$tfile- 25 || return 2
376
377     zconf_mount `hostname` $MOUNT2 || error "mount $MOUNT2 fail"
378     return 0
379
380 }
381 run_test 17 "fail OST during recovery (3571)"
382
383 # cleanup with blocked enqueue fails until timer elapses (MDS busy), wait for it
384 export NOW=0
385
386 test_18() { # bug 3822 - evicting client with enqueued lock
387     #set -vx
388     mkdir -p $MOUNT1/$tdir
389     touch $MOUNT1/$tdir/f0
390 #define OBD_FAIL_LDLM_ENQUEUE_BLOCKED    0x30b
391     statmany -s $MOUNT1/$tdir/f 1 500 &
392     OPENPID=$!
393     NOW=`date +%s`
394     do_facet mds lctl set_param fail_loc=0x8000030b  # hold enqueue
395     sleep 1
396 #define OBD_FAIL_LDLM_BL_CALLBACK        0x305
397     do_facet client lctl set_param fail_loc=0x80000305  # drop cb, evict
398     cancel_lru_locks mdc
399     sleep 0.500s # wait to ensure first client is one that will be evicted
400     openfile -f O_RDONLY $MOUNT2/$tdir/f0
401     wait $OPENPID
402     dmesg | grep "entering recovery in server" && \
403         error "client not evicted" || true
404 }
405 run_test 18 "ldlm_handle_enqueue succeeds on evicted export (3822)"
406
407 test_19() { # Bug 10991 - resend of open request does not fail assertion.
408     replay_barrier mds
409     drop_ldlm_reply "createmany -o $DIR/$tfile 1" || return 1
410     fail mds
411     checkstat $DIR2/${tfile}0 || return 2
412     rm $DIR/${tfile}0 || return 3
413
414     return 0
415 }
416 run_test 19 "resend of open request"
417
418 test_20() { #16389
419     BEFORE=`date +%s`
420     replay_barrier mds
421     touch $MOUNT1/a
422     touch $MOUNT2/b
423     umount $MOUNT2
424     facet_failover mds
425     df $MOUNT1 || return 1
426     rm $MOUNT1/a
427     zconf_mount `hostname` $MOUNT2 || error "mount $MOUNT2 fail"
428     TIER1=$((`date +%s` - BEFORE))
429     BEFORE=`date +%s`
430     replay_barrier mds
431     touch $MOUNT1/a
432     touch $MOUNT2/b
433     umount $MOUNT2
434     facet_failover mds
435     df $MOUNT1 || return 1
436     rm $MOUNT1/a
437     zconf_mount `hostname` $MOUNT2 || error "mount $MOUNT2 fail"
438     TIER2=$((`date +%s` - BEFORE))
439     [ $TIER2 -ge $((TIER1 * 2)) ] && \
440         error "recovery time is growing $TIER2 > $TIER1"
441     return 0
442 }
443 run_test 20 "recovery time is not increasing"
444
445 test_22() { #bug 18927
446     multiop_bg_pause $MOUNT1/$tfile O_c || return 1
447     pid1=$!
448     multiop_bg_pause $MOUNT2/$tfile O_c || return 2
449     pid2=$!
450     rm -f $MOUNT1/$tfile
451     replay_barrier mds
452     fail mds
453     kill -USR1 $pid1
454     wait $pid1 || return 3
455     kill -USR1 $pid2
456     wait $pid2 || return 4
457     [ -e $MOUNT1/$tfile ] && return 5
458     return 0
459 }
460 run_test 22 "double open|creat in replay with open orphan from two mntp"
461
462 equals_msg `basename $0`: test complete, cleaning up
463 SLEEP=$((`date +%s` - $NOW))
464 [ $SLEEP -lt $TIMEOUT ] && sleep $SLEEP
465 [ "$MOUNTED2" = yes ] && zconf_umount $HOSTNAME $MOUNT2 || true
466 check_and_cleanup_lustre
467 [ -f "$TESTSUITELOG" ] && cat $TESTSUITELOG && grep -q FAIL $TESTSUITELOG && exit 1 || true