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