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