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