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