Whamcloud - gitweb
land b1_5 onto 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
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
204     rm $MOUNT1/$tfile-[1-5] || return 1
205
206     return 0
207 }
208 run_test 11 "both clients timeout during replay"
209
210 test_12() {
211     replay_barrier mds
212
213     multiop $DIR/$tfile mo_c &
214     MULTIPID=$!
215     sleep 5
216
217 #define OBD_FAIL_LDLM_ENQUEUE            0x302
218     sysctl -w lustre.fail_loc=0x80000302
219     facet_failover mds
220     df $MOUNT || return 1
221     sysctl -w lustre.fail_loc=0
222
223     ls $DIR/$tfile
224     kill -USR1 $MULTIPID || return 3
225     wait $MULTIPID || return 4
226     $CHECKSTAT -t file $DIR/$tfile || return 2
227     rm $DIR/$tfile
228
229     return 0
230 }
231 run_test 12 "open resend timeout"
232
233 test_13() {
234     multiop $DIR/$tfile mo_c &
235     MULTIPID=$!
236     sleep 5
237
238     replay_barrier mds
239
240     kill -USR1 $MULTIPID || return 3
241     wait $MULTIPID || return 4
242
243     # drop close 
244     sysctl -w lustre.fail_loc=0x80000115
245     facet_failover mds
246     df $MOUNT || return 1
247     sysctl -w lustre.fail_loc=0
248
249     ls $DIR/$tfile
250     $CHECKSTAT -t file $DIR/$tfile || return 2
251     rm $DIR/$tfile
252
253     return 0
254 }
255 run_test 13 "close resend timeout"
256
257 test_14() {
258     replay_barrier mds
259     createmany -o $MOUNT1/$tfile- 25
260     createmany -o $MOUNT2/$tfile-2- 1
261     createmany -o $MOUNT1/$tfile-3- 25
262     umount $MOUNT2
263
264     facet_failover mds
265     # expect failover to fail
266     df $MOUNT && return 1
267     sleep 1
268
269     # first 25 files should have been replayed 
270     unlinkmany $MOUNT1/$tfile- 25 || return 2
271
272     zconf_mount `hostname` $MOUNT2
273     return 0
274 }
275 run_test 14 "timeouts waiting for lost client during replay"
276
277 test_15() {
278     replay_barrier mds
279     createmany -o $MOUNT1/$tfile- 25
280     createmany -o $MOUNT2/$tfile-2- 1
281     umount $MOUNT2
282
283     facet_failover mds
284     df $MOUNT || return 1
285
286     unlinkmany $MOUNT1/$tfile- 25 || return 2
287     [ -e $MOUNT1/$tfile-2-0 ] && error "$tfile-2-0 exists"
288
289     zconf_mount `hostname` $MOUNT2
290     return 0
291 }
292 run_test 15 "timeout waiting for lost client during replay, 1 client completes"
293
294 test_15a() {
295     local ost_last_id=""
296     local osc_last_id=""
297     
298     replay_barrier mds
299     echo "data" > "$MOUNT2/${tfile}-m2"
300
301     umount $MOUNT2
302     facet_failover mds
303     df $MOUNT || return 1
304     
305     ost_last_id=`cat /proc/fs/lustre/obdfilter/*/last_id`
306     mds_last_id=`cat /proc/fs/lustre/osc/*mds*/last_id`
307     
308     echo "Ids after MDS<->OST synchonizing"
309     echo "--------------------------------"
310     echo "MDS last_id:"
311     echo $mds_last_id
312     echo "OST last_id:"
313     echo $ost_last_id
314
315     local i=0
316     echo $ost_last_id | while read id; do
317         ost_ids[$i]=$id
318         ((i++))
319     done
320     
321     i=0
322     echo $mds_last_id | while read id; do
323         mds_ids[$i]=$id
324         ((i++))
325     done
326     
327     local arr_len=${#mds_ids[*]}
328     for ((i=0;i<$arr_len;i++)); do
329             mds_id=${mds_ids[i]}
330             ost_id=${ost_ids[i]}
331             
332             test $mds_id -ge $ost_id || {
333                 echo "MDS last id ($mds_id) is smaller than OST one ($ost_id)"
334                 return 2
335             }
336     done
337
338     zconf_mount `hostname` $MOUNT2
339     return 0
340 }
341 #CROW run_test 15a "OST clear orphans - synchronize ids on MDS and OST"
342
343 test_15b() {
344     replay_barrier mds
345     echo "data" > "$MOUNT2/${tfile}-m2"
346     umount $MOUNT2
347
348     do_facet ost1 "sysctl -w lustre.fail_loc=0x80000802"
349     facet_failover mds
350
351     df $MOUNT || return 1
352     do_facet ost1 "sysctl -w lustre.fail_loc=0"
353     
354     zconf_mount `hostname` $MOUNT2
355     return 0
356 }
357 #CROW run_test 15b "multiple delayed OST clear orphans"
358
359 test_15c() {
360     replay_barrier mds
361     for ((i = 0; i < 2000; i++)); do
362         echo "data" > "$MOUNT2/${tfile}-$i" || error "create ${tfile}-$i failed"
363     done
364     
365     umount $MOUNT2
366     facet_failover mds
367
368     df $MOUNT || return 1
369     
370     zconf_mount `hostname` $MOUNT2
371     return 0
372 }
373 run_test 15c "remove multiple OST orphans"
374
375 test_16() {
376     replay_barrier mds
377     createmany -o $MOUNT1/$tfile- 25
378     createmany -o $MOUNT2/$tfile-2- 1
379     umount $MOUNT2
380
381     facet_failover mds
382     sleep $TIMEOUT
383     facet_failover mds
384     df $MOUNT || return 1
385
386     unlinkmany $MOUNT1/$tfile- 25 || return 2
387
388     zconf_mount `hostname` $MOUNT2
389     return 0
390
391 }
392 run_test 16 "fail MDS during recovery (3571)"
393
394 test_17() {
395     createmany -o $MOUNT1/$tfile- 25
396     createmany -o $MOUNT2/$tfile-2- 1
397
398     # Make sure the disconnect is lost
399     replay_barrier ost1
400     umount $MOUNT2
401
402     facet_failover ost1
403     sleep $TIMEOUT
404     facet_failover ost1
405     df $MOUNT || return 1
406
407     unlinkmany $MOUNT1/$tfile- 25 || return 2
408
409     zconf_mount `hostname` $MOUNT2
410     return 0
411
412 }
413 run_test 17 "fail OST during recovery (3571)"
414
415 # cleanup with blocked enqueue fails until timer elapses (MDS busy), wait for it
416 export NOW=0
417
418 test_18() { # bug 3822 - evicting client with enqueued lock
419     #set -vx
420     mkdir -p $MOUNT1/$tdir
421     touch $MOUNT1/$tdir/f0
422 #define OBD_FAIL_LDLM_ENQUEUE_BLOCKED    0x30b
423     statmany -s $MOUNT1/$tdir/f 1 500 &
424     OPENPID=$!
425     NOW=`date +%s`
426     do_facet mds sysctl -w lustre.fail_loc=0x8000030b  # hold enqueue
427     sleep 1
428 #define OBD_FAIL_LDLM_BL_CALLBACK        0x305
429     do_facet client sysctl -w lustre.fail_loc=0x80000305  # drop cb, evict
430     cancel_lru_locks mdc
431     usleep 500 # wait to ensure first client is one that will be evicted
432     openfile -f O_RDONLY $MOUNT2/$tdir/f0
433     wait $OPENPID
434     dmesg | grep "entering recovery in server" && \
435         error "client not evicted" || true
436 }
437 run_test 18 "ldlm_handle_enqueue succeeds on evicted export (3822)"
438
439 test_19() { # Bug 10991 - resend of open request does not fail assertion.
440     replay_barrier mds
441     drop_ldlm_reply "createmany -o $DIR/$tfile 1" || return 1
442     fail mds
443     checkstat $DIR2/${tfile}0 || return 2
444     rm $DIR/${tfile}0 || return 3
445
446     return 0
447 }
448 run_test 19 "resend of open request"
449
450 if [ "$ONLY" != "setup" ]; then
451    equals_msg test complete, cleaning up
452    SLEEP=$((`date +%s` - $NOW))
453    [ $SLEEP -lt $TIMEOUT ] && sleep $SLEEP
454    $CLEANUP
455 fi
456 echo "$0: completed"