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