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