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