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