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