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