Whamcloud - gitweb
b=13553
[fs/lustre-release.git] / lustre / tests / replay-dual.sh
1 #!/bin/bash
2
3 set -e
4
5 # bug number:  6088 10124 10800
6 ALWAYS_EXCEPT="8    15c   17    $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 $SINGLEMDS
30     touch $MOUNT2/b
31
32     fail $SINGLEMDS
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 $SINGLEMDS
46     mkdir $MOUNT1/adir
47
48     fail $SINGLEMDS
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 $SINGLEMDS
58     mkdir $MOUNT1/adir
59     mkdir $MOUNT2/adir/bdir
60
61     fail $SINGLEMDS
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 $SINGLEMDS
74     mkdir $MOUNT1/adir  && return 1
75     mkdir $MOUNT2/adir/bdir
76
77     fail $SINGLEMDS
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 $SINGLEMDS
98     kill -USR1 $pid
99     wait $pid || return 1
100
101     fail $SINGLEMDS
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 $SINGLEMDS
118     kill -USR1 $pid1
119     wait $pid1 || return 1
120
121     fail $SINGLEMDS
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 $SINGLEMDS] close2"
128
129 test_8() {
130     replay_barrier $SINGLEMDS
131     drop_reint_reply "mcreate $MOUNT1/$tfile"    || return 1
132     fail $SINGLEMDS
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 $SINGLEMDS
142     mcreate $MOUNT1/$tfile-1
143     mcreate $MOUNT2/$tfile-2
144     # drop first reint reply
145     do_facet $SINGLEMDS sysctl -w lustre.fail_loc=0x80000119
146     fail $SINGLEMDS
147     do_facet $SINGLEMDS 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 $SINGLEMDS
158     munlink $MOUNT1/$tfile-1
159     mcreate $MOUNT2/$tfile-2
160     # drop first reint reply
161     do_facet $SINGLEMDS sysctl -w lustre.fail_loc=0x80000119
162     fail $SINGLEMDS
163     do_facet $SINGLEMDS 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 $SINGLEMDS
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 $SINGLEMDS sysctl -w lustre.fail_loc=0x0119
182     # note that with this fail_loc set, facet_failover df will fail
183     facet_failover $SINGLEMDS
184     #sleep for while, let both clients reconnect and timeout
185     sleep $((TIMEOUT * 2))
186     do_facet $SINGLEMDS sysctl -w lustre.fail_loc=0
187
188     rm $MOUNT1/$tfile-[1-5] || return 1
189
190     return 0
191 }
192 run_test 11 "both clients timeout during replay"
193
194 test_12() {
195     replay_barrier $SINGLEMDS
196
197     multiop $DIR/$tfile mo_c &
198     MULTIPID=$!
199     sleep 5
200
201 #define OBD_FAIL_LDLM_ENQUEUE            0x302
202     do_facet $SINGLEMDS sysctl -w lustre.fail_loc=0x80000302
203     facet_failover $SINGLEMDS
204     do_facet $SINGLEMDS sysctl -w lustre.fail_loc=0
205     df $MOUNT || return 1
206
207     ls $DIR/$tfile
208     kill -USR1 $MULTIPID || return 3
209     wait $MULTIPID || return 4
210     $CHECKSTAT -t file $DIR/$tfile || return 2
211     rm $DIR/$tfile
212
213     return 0
214 }
215 run_test 12 "open resend timeout"
216
217 test_13() {
218     multiop $DIR/$tfile mo_c &
219     MULTIPID=$!
220     sleep 5
221
222     replay_barrier $SINGLEMDS
223
224     kill -USR1 $MULTIPID || return 3
225     wait $MULTIPID || return 4
226
227     # drop close 
228     do_facet $SINGLEMDS sysctl -w lustre.fail_loc=0x80000115
229     facet_failover $SINGLEMDS
230     do_facet $SINGLEMDS sysctl -w lustre.fail_loc=0
231     df $MOUNT || return 1
232
233     ls $DIR/$tfile
234     $CHECKSTAT -t file $DIR/$tfile || return 2
235     rm $DIR/$tfile
236
237     return 0
238 }
239 run_test 13 "close resend timeout"
240
241 test_14() {
242     replay_barrier $SINGLEMDS
243     createmany -o $MOUNT1/$tfile- 25
244     createmany -o $MOUNT2/$tfile-2- 1
245     createmany -o $MOUNT1/$tfile-3- 25
246     umount $MOUNT2
247
248     facet_failover $SINGLEMDS
249     # expect failover to fail due to missing client 2
250     df $MOUNT && return 1
251     sleep 1
252
253     # first 25 files should have been replayed 
254     unlinkmany $MOUNT1/$tfile- 25 || return 2
255
256     zconf_mount `hostname` $MOUNT2 || error "mount $MOUNT2 fail" 
257     return 0
258 }
259 run_test 14 "timeouts waiting for lost client during replay"
260
261 test_15() {
262     replay_barrier $SINGLEMDS
263     createmany -o $MOUNT1/$tfile- 25
264     createmany -o $MOUNT2/$tfile-2- 1
265     umount $MOUNT2
266
267     facet_failover $SINGLEMDS
268     df $MOUNT || return 1
269
270     unlinkmany $MOUNT1/$tfile- 25 || return 2
271     [ -e $MOUNT1/$tfile-2-0 ] && error "$tfile-2-0 exists"
272
273     zconf_mount `hostname` $MOUNT2 || error "mount $MOUNT2 fail"
274     return 0
275 }
276 run_test 15 "timeout waiting for lost client during replay, 1 client completes"
277
278 test_15a() {
279     local ost_last_id=""
280     local osc_last_id=""
281     
282     replay_barrier $SINGLEMDS
283     echo "data" > "$MOUNT2/${tfile}-m2"
284
285     umount $MOUNT2
286     facet_failover $SINGLEMDS
287     df $MOUNT || return 1
288     
289     ost_last_id=`cat /proc/fs/lustre/obdfilter/*/last_id`
290     mds_last_id=`cat /proc/fs/lustre/osc/*mds*/last_id`
291     
292     echo "Ids after MDS<->OST synchonizing"
293     echo "--------------------------------"
294     echo "MDS last_id:"
295     echo $mds_last_id
296     echo "OST last_id:"
297     echo $ost_last_id
298
299     local i=0
300     echo $ost_last_id | while read id; do
301         ost_ids[$i]=$id
302         ((i++))
303     done
304     
305     i=0
306     echo $mds_last_id | while read id; do
307         mds_ids[$i]=$id
308         ((i++))
309     done
310     
311     local arr_len=${#mds_ids[*]}
312     for ((i=0;i<$arr_len;i++)); do
313             mds_id=${mds_ids[i]}
314             ost_id=${ost_ids[i]}
315             
316             test $mds_id -ge $ost_id || {
317                 echo "MDS last id ($mds_id) is smaller than OST one ($ost_id)"
318                 return 2
319             }
320     done
321
322     zconf_mount `hostname` $MOUNT2 || error "mount $MOUNT2 fail"
323     return 0
324 }
325 #CROW run_test 15a "OST clear orphans - synchronize ids on MDS and OST"
326
327 test_15b() {
328     replay_barrier $SINGLEMDS
329     echo "data" > "$MOUNT2/${tfile}-m2"
330     umount $MOUNT2
331
332     do_facet ost1 "sysctl -w lustre.fail_loc=0x80000802"
333     facet_failover $SINGLEMDS
334
335     df $MOUNT || return 1
336     do_facet ost1 "sysctl -w lustre.fail_loc=0"
337     
338     zconf_mount `hostname` $MOUNT2 || error "mount $MOUNT2 fail"
339     return 0
340 }
341 #CROW run_test 15b "multiple delayed OST clear orphans"
342
343 test_15c() {
344     replay_barrier $SINGLEMDS
345     for ((i = 0; i < 2000; i++)); do
346         echo "data" > "$MOUNT2/${tfile}-$i" || error "create ${tfile}-$i failed"
347     done
348     
349     umount $MOUNT2
350     facet_failover $SINGLEMDS
351
352     df $MOUNT || return 1
353     
354     zconf_mount `hostname` $MOUNT2 || error "mount $MOUNT2 fail"
355     return 0
356 }
357 run_test 15c "remove multiple OST orphans"
358
359 test_16() {
360     replay_barrier $SINGLEMDS
361     createmany -o $MOUNT1/$tfile- 25
362     createmany -o $MOUNT2/$tfile-2- 1
363     umount $MOUNT2
364
365     facet_failover $SINGLEMDS
366     sleep $TIMEOUT
367     facet_failover $SINGLEMDS
368     df $MOUNT || return 1
369
370     unlinkmany $MOUNT1/$tfile- 25 || return 2
371
372     zconf_mount `hostname` $MOUNT2 || error "mount $MOUNT2 fail"
373     return 0
374
375 }
376 run_test 16 "fail MDS during recovery (3571)"
377
378 test_17() {
379     createmany -o $MOUNT1/$tfile- 25
380     createmany -o $MOUNT2/$tfile-2- 1
381
382     # Make sure the disconnect is lost
383     replay_barrier ost1
384     umount $MOUNT2
385
386     facet_failover ost1
387     sleep $TIMEOUT
388     facet_failover ost1
389     df $MOUNT || return 1
390
391     unlinkmany $MOUNT1/$tfile- 25 || return 2
392
393     zconf_mount `hostname` $MOUNT2 || error "mount $MOUNT2 fail"
394     return 0
395
396 }
397 run_test 17 "fail OST during recovery (3571)"
398
399 # cleanup with blocked enqueue fails until timer elapses (MDS busy), wait for it
400 export NOW=0
401
402 test_18() { # bug 3822 - evicting client with enqueued lock
403     #set -vx
404     mkdir -p $MOUNT1/$tdir
405     touch $MOUNT1/$tdir/f0
406 #define OBD_FAIL_LDLM_ENQUEUE_BLOCKED    0x30b
407     statmany -s $MOUNT1/$tdir/f 1 500 &
408     OPENPID=$!
409     NOW=`date +%s`
410     do_facet $SINGLEMDS sysctl -w lustre.fail_loc=0x8000030b  # hold enqueue
411     sleep 1
412 #define OBD_FAIL_LDLM_BL_CALLBACK        0x305
413     do_facet client sysctl -w lustre.fail_loc=0x80000305  # drop cb, evict
414     cancel_lru_locks mdc
415     usleep 500 # wait to ensure first client is one that will be evicted
416     openfile -f O_RDONLY $MOUNT2/$tdir/f0
417     wait $OPENPID
418     dmesg | grep "entering recovery in server" && \
419         error "client not evicted" || true
420 }
421 run_test 18 "ldlm_handle_enqueue succeeds on evicted export (3822)"
422
423 test_19() { # Bug 10991 - resend of open request does not fail assertion.
424     replay_barrier $SINGLEMDS
425     drop_ldlm_reply "createmany -o $DIR/$tfile 1" || return 1
426     fail $SINGLEMDS
427     checkstat $DIR2/${tfile}0 || return 2
428     rm $DIR/${tfile}0 || return 3
429
430     return 0
431 }
432 run_test 19 "resend of open request"
433
434 equals_msg `basename $0`: test complete, cleaning up
435 SLEEP=$((`date +%s` - $NOW))
436 [ $SLEEP -lt $TIMEOUT ] && sleep $SLEEP
437 check_and_cleanup_lustre
438 [ -f "$TESTSUITELOG" ] && cat $TESTSUITELOG || true
439