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