Whamcloud - gitweb
- landing of b_hd_cleanup_merge to HEAD.
[fs/lustre-release.git] / lustre / tests / replay-dual.sh
1 #!/bin/sh
2
3 set -e
4
5 LUSTRE=${LUSTRE:-`dirname $0`/..}
6 . $LUSTRE/tests/test-framework.sh
7
8 init_test_env $@
9
10 . ${CONFIG:=$LUSTRE/tests/cfg/lmv.sh}
11
12 SETUP=${SETUP:-"setup"}
13 CLEANUP=${CLEANUP:-"cleanup"}
14
15 gen_config() {
16     rm -f $XMLCONFIG
17     if [ "$MDSCOUNT" -gt 1 ]; then
18         add_lmv lmv1_svc
19         for mds in `mds_list`; do
20             MDSDEV=$TMP/${mds}-`hostname`
21             add_mds $mds --dev $MDSDEV --size $MDSSIZE  --lmv lmv1_svc
22         done
23         add_lov_to_lmv lov1 lmv1_svc --stripe_sz $STRIPE_BYTES \
24             --stripe_cnt $STRIPES_PER_OBJ --stripe_pattern 0
25         MDS=lmv1
26     else
27         add_mds mds1 --dev $MDSDEV --size $MDSSIZE
28         add_lov lov1 mds1 --stripe_sz $STRIPE_BYTES \
29             --stripe_cnt $STRIPES_PER_OBJ --stripe_pattern 0
30         MDS=mds1_svc
31
32     fi
33
34     add_ost ost --lov lov1 --dev $OSTDEV --size $OSTSIZE --failover
35     add_ost ost2 --lov lov1 --dev ${OSTDEV}-2 --size $OSTSIZE  --failover
36     add_client client  ${MDS} --lov lov1 --path $MOUNT
37 }
38
39
40
41 build_test_filter
42
43 SETUP=${SETUP:-"setup"}
44 CLEANUP=${CLEANUP:-"cleanup"}
45
46 cleanup() {
47     # make sure we are using the primary MDS, so the config log will
48     # be able to clean up properly.
49     activemds=`facet_active mds1`
50     if [ $activemds != "mds1" ]; then
51         fail mds1
52     fi
53
54     umount $MOUNT2 || true
55     umount $MOUNT || true
56     rmmod llite
57     for mds in `mds_list`; do
58         stop $mds ${FORCE} $MDSLCONFARGS
59     done
60     stop ost2 ${FORCE}
61     stop ost ${FORCE}  --dump cleanup-dual.log
62 }
63
64 if [ "$ONLY" == "cleanup" ]; then
65     sysctl -w portals.debug=0
66     cleanup
67     exit
68 fi
69
70 setup() {
71     gen_config
72     start ost --reformat $OSTLCONFARGS 
73     PINGER=`cat /proc/fs/lustre/pinger`
74
75     if [ "$PINGER" != "on" ]; then
76         echo "ERROR: Lustre must be built with --enable-pinger for replay-dual"
77         stop ost
78         exit 1
79     fi
80
81     start ost2 --reformat $OSTLCONFARGS 
82     [ "$DAEMONFILE" ] && $LCTL debug_daemon start $DAEMONFILE $DAEMONSIZE
83     for mds in `mds_list`; do
84         start $mds --reformat $MDSLCONFARGS
85     done
86     grep " $MOUNT " /proc/mounts || zconf_mount `hostname` $MOUNT
87     grep " $MOUNT2 " /proc/mounts || zconf_mount `hostname` $MOUNT2
88
89     echo $TIMEOUT > /proc/sys/lustre/timeout
90     echo $UPCALL > /proc/sys/lustre/upcall
91 }
92
93 $SETUP
94 [ "$DAEMONFILE" ] && $LCTL debug_daemon start $DAEMONFILE $DAEMONSIZE
95
96
97 test_1() {
98     touch $MOUNT1/a
99     replay_barrier mds1
100     touch $MOUNT2/b
101
102     fail mds1
103     checkstat $MOUNT2/a || return 1
104     checkstat $MOUNT1/b || return 2
105     rm $MOUNT2/a $MOUNT1/b
106     checkstat $MOUNT1/a && return 3
107     checkstat $MOUNT2/b && return 4
108     return 0
109 }
110
111 run_test 1 "|X| simple create"
112
113
114 test_2() {
115     replay_barrier mds1
116     mkdir $MOUNT1/adir
117
118     fail mds1
119     checkstat $MOUNT2/adir || return 1
120     rmdir $MOUNT2/adir
121     checkstat $MOUNT2/adir && return 2
122     return 0
123 }
124
125 run_test 2 "|X| mkdir adir"
126
127 test_3() {
128     replay_barrier mds1
129     mkdir $MOUNT1/adir
130     mkdir $MOUNT2/adir/bdir
131
132     fail mds1
133     checkstat $MOUNT2/adir      || return 1
134     checkstat $MOUNT1/adir/bdir || return 2
135     rmdir $MOUNT2/adir/bdir $MOUNT1/adir
136     checkstat $MOUNT1/adir      && return 3
137     checkstat $MOUNT2/adir/bdir && return 4
138     return 0
139 }
140
141 run_test 3 "|X| mkdir adir, mkdir adir/bdir "
142
143 test_4() {
144     mkdir $MOUNT1/adir
145     replay_barrier mds1
146     mkdir $MOUNT1/adir  && return 1
147     mkdir $MOUNT2/adir/bdir
148
149     fail mds1
150     checkstat $MOUNT2/adir      || return 2
151     checkstat $MOUNT1/adir/bdir || return 3
152
153     rmdir $MOUNT2/adir/bdir $MOUNT1/adir
154     checkstat $MOUNT1/adir      && return 4
155     checkstat $MOUNT2/adir/bdir && return 5
156     return 0
157 }
158
159 run_test 4 "|X| mkdir adir (-EEXIST), mkdir adir/bdir "
160
161
162 test_5() {
163     # multiclient version of replay_single.sh/test_8
164     mcreate $MOUNT1/a
165     multiop $MOUNT2/a o_tSc &
166     pid=$!
167     # give multiop a chance to open
168     sleep 1 
169     rm -f $MOUNT1/a
170     replay_barrier mds1
171     kill -USR1 $pid
172     wait $pid || return 1
173
174     fail mds1
175     [ -e $MOUNT2/a ] && return 2
176     return 0
177 }
178 run_test 5 "open, unlink |X| close"
179
180
181 test_6() {
182     mcreate $MOUNT1/a
183     multiop $MOUNT2/a o_c &
184     pid1=$!
185     multiop $MOUNT1/a o_c &
186     pid2=$!
187     # give multiop a chance to open
188     sleep 1 
189     rm -f $MOUNT1/a
190     replay_barrier mds1
191     kill -USR1 $pid1
192     wait $pid1 || return 1
193
194     fail mds1
195     kill -USR1 $pid2
196     wait $pid2 || return 1
197     [ -e $MOUNT2/a ] && return 2
198     return 0
199 }
200 run_test 6 "open1, open2, unlink |X| close1 [fail mds] close2"
201
202 test_6b() {
203     mcreate $MOUNT1/a
204     multiop $MOUNT2/a o_c &
205     pid1=$!
206     multiop $MOUNT1/a o_c &
207     pid2=$!
208     # give multiop a chance to open
209     sleep 1
210     rm -f $MOUNT1/a
211     replay_barrier mds1
212     kill -USR1 $pid2
213     wait $pid2 || return 1
214
215     fail mds1
216     kill -USR1 $pid1
217     wait $pid1 || return 1
218     [ -e $MOUNT2/a ] && return 2
219     return 0
220 }
221 run_test 6b "open1, open2, unlink |X| close2 [fail mds] close1"
222
223 test_8() {
224     replay_barrier mds1
225     drop_reint_reply "mcreate $MOUNT1/$tfile"    || return 1
226     fail mds1
227     checkstat $MOUNT2/$tfile || return 2
228     rm $MOUNT1/$tfile || return 3
229
230     return 0
231 }
232 run_test 8 "replay of resent request"
233
234 test_9() {
235     replay_barrier mds1
236     mcreate $MOUNT1/$tfile-1
237     mcreate $MOUNT2/$tfile-2
238     # drop first reint reply
239     sysctl -w lustre.fail_loc=0x80000119
240     fail mds1
241     sysctl -w lustre.fail_loc=0
242
243     rm $MOUNT1/$tfile-[1,2] || return 1
244
245     return 0
246 }
247 run_test 9 "resending a replayed create"
248
249 test_10() {
250     mcreate $MOUNT1/$tfile-1
251     replay_barrier mds1
252     munlink $MOUNT1/$tfile-1
253     mcreate $MOUNT2/$tfile-2
254     # drop first reint reply
255     sysctl -w lustre.fail_loc=0x80000119
256     fail mds1
257     sysctl -w lustre.fail_loc=0
258
259     checkstat $MOUNT1/$tfile-1 && return 1
260     checkstat $MOUNT1/$tfile-2 || return 2
261     rm $MOUNT1/$tfile-2
262
263     return 0
264 }
265 run_test 10 "resending a replayed unlink"
266
267 test_11() {
268     replay_barrier mds1
269     mcreate $MOUNT1/$tfile-1
270     mcreate $MOUNT2/$tfile-2
271     mcreate $MOUNT1/$tfile-3
272     mcreate $MOUNT2/$tfile-4
273     mcreate $MOUNT1/$tfile-5
274     # drop all reint replies for a while
275     sysctl -w lustre.fail_loc=0x0119
276     facet_failover mds1
277     #sleep for while, let both clients reconnect and timeout
278     sleep $((TIMEOUT * 2))
279     sysctl -w lustre.fail_loc=0
280
281     rm $MOUNT1/$tfile-[1-5] || return 1
282
283     return 0
284 }
285 run_test 11 "both clients timeout during replay"
286
287 test_12() {
288     replay_barrier mds1
289
290     multiop $DIR/$tfile mo_c &
291     MULTIPID=$!
292     sleep 5
293
294     # drop first enqueue
295     sysctl -w lustre.fail_loc=0x80000302
296     facet_failover mds1
297     df $MOUNT || return 1
298     sysctl -w lustre.fail_loc=0
299
300     ls $DIR/$tfile
301     $CHECKSTAT -t file $DIR/$tfile || return 2
302     kill -USR1 $MULTIPID || return 3
303     wait $MULTIPID || return 4
304     rm $DIR/$tfile
305
306     return 0
307 }
308 run_test 12 "open resend timeout"
309
310 test_13() {
311     multiop $DIR/$tfile mo_c &
312     MULTIPID=$!
313     sleep 5
314
315     replay_barrier mds1
316
317     kill -USR1 $MULTIPID || return 3
318     wait $MULTIPID || return 4
319
320     # drop close 
321     sysctl -w lustre.fail_loc=0x80000115
322     facet_failover mds1
323     df $MOUNT || return 1
324     sysctl -w lustre.fail_loc=0
325
326     ls $DIR/$tfile
327     $CHECKSTAT -t file $DIR/$tfile || return 2
328     rm $DIR/$tfile
329
330     return 0
331 }
332 run_test 13 "close resend timeout"
333
334
335 test_14() {
336     replay_barrier mds1
337     createmany -o $MOUNT1/$tfile- 25
338     createmany -o $MOUNT2/$tfile-2- 1
339     createmany -o $MOUNT1/$tfile-3- 25
340     umount $MOUNT2
341
342     facet_failover mds1
343     # expect failover to fail
344     df $MOUNT && return 1
345
346     # first 25 files shouuld have been
347     # replayed
348     sleep 2 
349     unlinkmany $MOUNT1/$tfile- 25 || return 2
350
351     zconf_mount `hostname` $MOUNT2
352     return 0
353 }
354 run_test 14 "timeouts waiting for lost client during replay"
355
356 test_15() {
357     replay_barrier mds1
358     createmany -o $MOUNT1/$tfile- 25
359     createmany -o $MOUNT2/$tfile-2- 1
360     umount $MOUNT2
361
362     facet_failover mds1
363     df $MOUNT || return 1
364
365     unlinkmany $MOUNT1/$tfile- 25 || return 2
366
367     zconf_mount `hostname` $MOUNT2
368     return 0
369 }
370 run_test 15 "timeout waiting for lost client during replay, 1 client completes"
371 test_16() {
372     replay_barrier mds1
373     createmany -o $MOUNT1/$tfile- 25
374     createmany -o $MOUNT2/$tfile-2- 1
375     umount $MOUNT2
376
377     facet_failover mds1
378     sleep $TIMEOUT
379     facet_failover mds1
380     df $MOUNT || return 1
381
382     unlinkmany $MOUNT1/$tfile- 25 || return 2
383
384     zconf_mount `hostname` $MOUNT2
385     return 0
386
387 }
388 #run_test 16 "fail MDS during recovery (3571)"
389
390 test_17() {
391     createmany -o $MOUNT1/$tfile- 25
392     createmany -o $MOUNT2/$tfile-2- 1
393
394     # Make sure the disconnect is lost
395     replay_barrier ost
396     umount $MOUNT2
397
398     echo -1 > /proc/sys/portals/debug
399     facet_failover ost
400     sleep $TIMEOUT
401     facet_failover ost
402     df $MOUNT || return 1
403
404     unlinkmany $MOUNT1/$tfile- 25 || return 2
405
406     zconf_mount `hostname` $MOUNT2
407     return 0
408
409 }
410 #Still not support ost fail over
411 #run_test 17 "fail OST during recovery (3571)"
412
413 test_18 () {
414     replay_barrier mds1
415     multiop $MOUNT2/$tfile O_c &
416     pid2=$!
417     multiop $MOUNT1/$tfile O_c &
418     pid1=$!
419     # give multiop a chance to open
420     sleep 1 
421     kill -USR1 $pid2
422     kill -USR1 $pid1
423     sleep 1
424     umount $MOUNT2
425     facet_failover mds1
426     df || df ||  return 1
427     zconf_mount `hostname` $MOUNT2
428 }
429 run_test 18 "replay open, Abort recovery, don't assert (3892)"
430
431
432 # cleanup with blocked enqueue fails until timer elapses (MDS busy), wait for
433 # itexport NOW=0
434
435 test_20() {     # bug 3822 - evicting client with enqueued lock
436        mkdir -p $MOUNT1/$tdir
437        touch $MOUNT1/$tdir/f0
438 #define OBD_FAIL_LDLM_ENQUEUE_BLOCKED    0x30b
439        statmany -s $MOUNT1/$tdir/f 500 &
440        OPENPID=$!
441        NOW=`date +%s`
442        do_facet mds1 sysctl -w lustre.fail_loc=0x8000030b  # hold enqueue
443        sleep 1
444 #define OBD_FAIL_LDLM_BL_CALLBACK        0x305
445        do_facet client sysctl -w lustre.fail_loc=0x80000305  # drop cb, evict
446        cancel_lru_locks MDC
447        usleep 500 # wait to ensure first client is one that will be evicted
448        openfile -f O_RDONLY $MOUNT2/$tdir/f0
449        wait $OPENPID
450        dmesg | grep "entering recovery in server" && \
451                error "client not evicted" || true
452 }
453 run_test 20 "ldlm_handle_enqueue succeeds on evicted export (3822)"
454
455 if [ "$ONLY" != "setup" ]; then
456         equals_msg test complete, cleaning up
457         if [ $NOW ]; then
458             SLEEP=$((`date +%s` - $NOW))
459             [ $SLEEP -lt $TIMEOUT ] && sleep $SLEEP
460         fi
461         $CLEANUP
462 fi