Whamcloud - gitweb
LU-326 make sure df send statfs request
[fs/lustre-release.git] / lustre / tests / recovery-small.sh
1 #!/bin/bash
2
3 set -e
4
5 #         bug  5494 5493
6 ALWAYS_EXCEPT="24   52 $RECOVERY_SMALL_EXCEPT"
7
8 PTLDEBUG=${PTLDEBUG:--1}
9 LUSTRE=${LUSTRE:-`dirname $0`/..}
10 . $LUSTRE/tests/test-framework.sh
11 init_test_env $@
12 . ${CONFIG:=$LUSTRE/tests/cfg/$NAME.sh}
13 init_logging
14
15 require_dsh_mds || exit 0
16
17 # also long tests: 19, 21a, 21e, 21f, 23, 27
18 #                                   1  2.5  2.5    4    4          (min)"
19 [ "$SLOW" = "no" ] && EXCEPT_SLOW="17  26a  26b    50   51     57"
20
21 build_test_filter
22
23 # Allow us to override the setup if we already have a mounted system by
24 # setting SETUP=" " and CLEANUP=" "
25 SETUP=${SETUP:-""}
26 CLEANUP=${CLEANUP:-""}
27
28 check_and_setup_lustre
29
30 assert_DIR
31 rm -rf $DIR/[df][0-9]*
32
33 test_1() {
34     drop_request "mcreate $DIR/f1"  || return 1
35     drop_reint_reply "mcreate $DIR/f2"    || return 2
36 }
37 run_test 1 "mcreate: drop req, drop rep"
38
39 test_2() {
40     drop_request "tchmod 111 $DIR/f2"  || return 1
41     drop_reint_reply "tchmod 666 $DIR/f2"    || return 2
42 }
43 run_test 2 "chmod: drop req, drop rep"
44
45 test_3() {
46     drop_request "statone $DIR/f2" || return 1
47     drop_reply "statone $DIR/f2"   || return 2
48 }
49 run_test 3 "stat: drop req, drop rep"
50
51 SAMPLE_NAME=f0.recovery-small.junk
52 SAMPLE_FILE=$TMP/$SAMPLE_NAME
53 # make this big, else test 9 doesn't wait for bulk -- bz 5595
54 dd if=/dev/urandom of=$SAMPLE_FILE bs=1M count=4
55
56 test_4() {
57     do_facet client "cp $SAMPLE_FILE $DIR/$SAMPLE_NAME" || return 1
58     drop_request "cat $DIR/$SAMPLE_NAME > /dev/null"   || return 2
59     drop_reply "cat $DIR/$SAMPLE_NAME > /dev/null"     || return 3
60 }
61 run_test 4 "open: drop req, drop rep"
62
63 RENAMED_AGAIN=$DIR/f0.renamed-again
64
65 test_5() {
66     drop_request "mv $DIR/$SAMPLE_NAME $DIR/$tfile-renamed" || return 1
67     drop_reint_reply "mv $DIR/$tfile-renamed $RENAMED_AGAIN" || return 2
68     do_facet client "checkstat -v $RENAMED_AGAIN"  || return 3
69 }
70 run_test 5 "rename: drop req, drop rep"
71
72 [ ! -e $RENAMED_AGAIN ] && cp $SAMPLE_FILE $RENAMED_AGAIN
73 LINK1=$DIR/f0.link1
74 LINK2=$DIR/f0.link2
75
76 test_6() {
77     drop_request "mlink $RENAMED_AGAIN $LINK1" || return 1
78     drop_reint_reply "mlink $RENAMED_AGAIN $LINK2"   || return 2
79 }
80 run_test 6 "link: drop req, drop rep"
81
82 [ ! -e $LINK1 ] && mlink $RENAMED_AGAIN $LINK1
83 [ ! -e $LINK2 ] && mlink $RENAMED_AGAIN $LINK2
84 test_7() {
85     drop_request "munlink $LINK1"   || return 1
86     drop_reint_reply "munlink $LINK2"     || return 2
87 }
88 run_test 7 "unlink: drop req, drop rep"
89
90 #bug 1423
91 test_8() {
92     drop_reint_reply "touch $DIR/$tfile"    || return 1
93 }
94 run_test 8 "touch: drop rep (bug 1423)"
95
96 #bug 1420
97 test_9() {
98     remote_ost_nodsh && skip "remote OST with nodsh" && return 0
99
100     pause_bulk "cp /etc/profile $DIR/$tfile"       || return 1
101     do_facet client "cp $SAMPLE_FILE $DIR/${tfile}.2"  || return 2
102     do_facet client "sync"
103     do_facet client "rm $DIR/$tfile $DIR/${tfile}.2" || return 3
104 }
105 run_test 9 "pause bulk on OST (bug 1420)"
106
107 #bug 1521
108 test_10() {
109     do_facet client mcreate $DIR/$tfile        || return 1
110     drop_bl_callback "chmod 0777 $DIR/$tfile"  || echo "evicted as expected"
111     # wait for the mds to evict the client
112     #echo "sleep $(($TIMEOUT*2))"
113     #sleep $(($TIMEOUT*2))
114     do_facet client touch $DIR/$tfile || echo "touch failed, evicted"
115     do_facet client checkstat -v -p 0777 $DIR/$tfile  || return 3
116     do_facet client "munlink $DIR/$tfile"
117 }
118 run_test 10 "finish request on server after client eviction (bug 1521)"
119
120 #bug 2460
121 # wake up a thread waiting for completion after eviction
122 test_11(){
123     do_facet client multiop $DIR/$tfile Ow  || return 1
124     do_facet client multiop $DIR/$tfile or  || return 2
125
126     cancel_lru_locks osc
127
128     do_facet client multiop $DIR/$tfile or  || return 3
129     drop_bl_callback multiop $DIR/$tfile Ow || echo "evicted as expected"
130
131     do_facet client munlink $DIR/$tfile  || return 4
132 }
133 run_test 11 "wake up a thread waiting for completion after eviction (b=2460)"
134
135 #b=2494
136 test_12(){
137     $LCTL mark multiop $DIR/$tfile OS_c 
138     do_facet $SINGLEMDS "lctl set_param fail_loc=0x115"
139     clear_failloc $SINGLEMDS $((TIMEOUT * 2)) &
140     multiop_bg_pause $DIR/$tfile OS_c || return 1
141     PID=$!
142 #define OBD_FAIL_MDS_CLOSE_NET           0x115
143     kill -USR1 $PID
144     echo "waiting for multiop $PID"
145     wait $PID || return 2
146     do_facet client munlink $DIR/$tfile  || return 3
147 }
148 run_test 12 "recover from timed out resend in ptlrpcd (b=2494)"
149
150 # Bug 113, check that readdir lost recv timeout works.
151 test_13() {
152     mkdir -p $DIR/$tdir || return 1
153     touch $DIR/$tdir/newentry || return
154 # OBD_FAIL_MDS_READPAGE_NET|OBD_FAIL_ONCE
155     do_facet $SINGLEMDS "lctl set_param fail_loc=0x80000104"
156     ls $DIR/$tdir || return 3
157     do_facet $SINGLEMDS "lctl set_param fail_loc=0"
158     rm -rf $DIR/$tdir || return 4
159 }
160 run_test 13 "mdc_readpage restart test (bug 1138)"
161
162 # Bug 113, check that readdir lost send timeout works.
163 test_14() {
164     mkdir -p $DIR/$tdir
165     touch $DIR/$tdir/newentry
166 # OBD_FAIL_MDS_SENDPAGE|OBD_FAIL_ONCE
167     do_facet $SINGLEMDS "lctl set_param fail_loc=0x80000106"
168     ls $DIR/$tdir || return 1
169     do_facet $SINGLEMDS "lctl set_param fail_loc=0"
170 }
171 run_test 14 "mdc_readpage resend test (bug 1138)"
172
173 test_15() {
174     do_facet $SINGLEMDS "lctl set_param fail_loc=0x80000128"
175     touch $DIR/$tfile && return 1
176     return 0
177 }
178 run_test 15 "failed open (-ENOMEM)"
179
180 READ_AHEAD=`lctl get_param -n llite.*.max_read_ahead_mb | head -n 1`
181 stop_read_ahead() {
182    lctl set_param -n llite.*.max_read_ahead_mb 0
183 }
184
185 start_read_ahead() {
186    lctl set_param -n llite.*.max_read_ahead_mb $READ_AHEAD
187 }
188
189 test_16() {
190     remote_ost_nodsh && skip "remote OST with nodsh" && return 0
191
192     do_facet client cp $SAMPLE_FILE $DIR
193     sync
194     stop_read_ahead
195
196 #define OBD_FAIL_PTLRPC_BULK_PUT_NET 0x504 | OBD_FAIL_ONCE
197     do_facet ost1 "lctl set_param fail_loc=0x80000504"
198     cancel_lru_locks osc
199     # OST bulk will time out here, client resends
200     do_facet client "cmp $SAMPLE_FILE $DIR/${SAMPLE_FILE##*/}" || return 1
201     do_facet ost1 lctl set_param fail_loc=0
202     # give recovery a chance to finish (shouldn't take long)
203     sleep $TIMEOUT
204     do_facet client "cmp $SAMPLE_FILE $DIR/${SAMPLE_FILE##*/}" || return 2
205     start_read_ahead
206 }
207 run_test 16 "timeout bulk put, don't evict client (2732)"
208
209 test_17() {
210     local at_max_saved=0
211
212     remote_ost_nodsh && skip "remote OST with nodsh" && return 0
213
214     # With adaptive timeouts, bulk_get won't expire until adaptive_timeout_max
215     if at_is_enabled; then
216         at_max_saved=$(at_max_get ost1)
217         at_max_set $TIMEOUT ost1
218     fi
219
220     # OBD_FAIL_PTLRPC_BULK_GET_NET 0x0503 | OBD_FAIL_ONCE
221     # OST bulk will time out here, client retries
222     do_facet ost1 lctl set_param fail_loc=0x80000503
223     # need to ensure we send an RPC
224     do_facet client cp $SAMPLE_FILE $DIR/$tfile
225     sync
226
227     # with AT, client will wait adaptive_max*factor+net_latency before
228     # expiring the req, hopefully timeout*2 is enough
229     sleep $(($TIMEOUT*2))
230
231     do_facet ost1 lctl set_param fail_loc=0
232     do_facet client "df $DIR"
233     # expect cmp to succeed, client resent bulk
234     do_facet client "cmp $SAMPLE_FILE $DIR/$tfile" || return 3
235     do_facet client "rm $DIR/$tfile" || return 4
236     [ $at_max_saved -ne 0 ] && at_max_set $at_max_saved ost1
237     return 0
238 }
239 run_test 17 "timeout bulk get, don't evict client (2732)"
240
241 test_18a() {
242     [ -z ${ost2_svc} ] && skip_env "needs 2 osts" && return 0
243
244     do_facet client mkdir -p $DIR/$tdir
245     f=$DIR/$tdir/$tfile
246
247     cancel_lru_locks osc
248     pgcache_empty || return 1
249
250     # 1 stripe on ost2
251     lfs setstripe $f -s $((128 * 1024)) -i 1 -c 1
252     get_stripe_info client $f
253     if [ $stripe_index -ne 1 ]; then
254         lfs getstripe $f
255         error "$f: different stripe offset ($stripe_index)" && return
256     fi
257
258     do_facet client cp $SAMPLE_FILE $f
259     sync
260     local osc2dev=`lctl get_param -n devices | grep ${ost2_svc}-osc- | egrep -v 'MDT' | awk '{print $1}'`
261     $LCTL --device $osc2dev deactivate || return 3
262     # my understanding is that there should be nothing in the page
263     # cache after the client reconnects?     
264     rc=0
265     pgcache_empty || rc=2
266     $LCTL --device $osc2dev activate
267     rm -f $f
268     return $rc
269 }
270 run_test 18a "manual ost invalidate clears page cache immediately"
271
272 test_18b() {
273     remote_ost_nodsh && skip "remote OST with nodsh" && return 0
274
275     do_facet client mkdir -p $DIR/$tdir
276     f=$DIR/$tdir/$tfile
277
278     cancel_lru_locks osc
279     pgcache_empty || return 1
280
281     # shouldn't have to set stripe size of count==1
282     lfs setstripe $f -s $((128 * 1024)) -i 0 -c 1
283     get_stripe_info client $f
284     if [ $stripe_index -ne 0 ]; then
285         lfs getstripe $f
286         error "$f: different stripe offset ($stripe_index)" && return
287     fi
288
289     do_facet client cp $SAMPLE_FILE $f
290     sync
291     ost_evict_client
292     # allow recovery to complete
293     sleep $((TIMEOUT + 2))
294     # my understanding is that there should be nothing in the page
295     # cache after the client reconnects?     
296     rc=0
297     pgcache_empty || rc=2
298     rm -f $f
299     return $rc
300 }
301 run_test 18b "eviction and reconnect clears page cache (2766)"
302
303 test_18c() {
304     remote_ost_nodsh && skip "remote OST with nodsh" && return 0
305
306     do_facet client mkdir -p $DIR/$tdir
307     f=$DIR/$tdir/$tfile
308
309     cancel_lru_locks osc
310     pgcache_empty || return 1
311
312     # shouldn't have to set stripe size of count==1
313     lfs setstripe $f -s $((128 * 1024)) -i 0 -c 1
314     get_stripe_info client $f
315     if [ $stripe_index -ne 0 ]; then
316         lfs getstripe $f
317         error "$f: different stripe offset ($stripe_index)" && return
318     fi
319
320     do_facet client cp $SAMPLE_FILE $f
321     sync
322     ost_evict_client
323
324     # OBD_FAIL_OST_CONNECT_NET2
325     # lost reply to connect request
326     do_facet ost1 lctl set_param fail_loc=0x80000225
327     # force reconnect
328     sleep 1
329     df $MOUNT > /dev/null 2>&1
330     sleep 2
331     # my understanding is that there should be nothing in the page
332     # cache after the client reconnects?     
333     rc=0
334     pgcache_empty || rc=2
335     rm -f $f
336     return $rc
337 }
338 run_test 18c "Dropped connect reply after eviction handing (14755)"
339
340 test_19a() {
341     f=$DIR/$tfile
342     do_facet client mcreate $f        || return 1
343     drop_ldlm_cancel "chmod 0777 $f"  || echo "evicted as expected"
344
345     do_facet client checkstat -v -p 0777 $f  || echo evicted
346     # let the client reconnect
347     sleep 5
348     do_facet client "munlink $f"
349 }
350 run_test 19a "test expired_lock_main on mds (2867)"
351
352 test_19b() {
353     f=$DIR/$tfile
354     do_facet client multiop $f Ow  || return 1
355     do_facet client multiop $f or  || return 2
356
357     cancel_lru_locks osc
358
359     do_facet client multiop $f or  || return 3
360     drop_ldlm_cancel multiop $f Ow  || echo "client evicted, as expected"
361
362     do_facet client munlink $f  || return 4
363 }
364 run_test 19b "test expired_lock_main on ost (2867)"
365
366 test_20a() {    # bug 2983 - ldlm_handle_enqueue cleanup
367         remote_ost_nodsh && skip "remote OST with nodsh" && return 0
368
369         mkdir -p $DIR/$tdir
370         lfs setstripe $DIR/$tdir/${tfile} -i 0 -c 1
371         multiop_bg_pause $DIR/$tdir/${tfile} O_wc || return 1
372         MULTI_PID=$!
373         cancel_lru_locks osc
374 #define OBD_FAIL_LDLM_ENQUEUE_EXTENT_ERR 0x308
375         do_facet ost1 lctl set_param fail_loc=0x80000308
376         kill -USR1 $MULTI_PID
377         wait $MULTI_PID
378         rc=$?
379         [ $rc -eq 0 ] && error "multiop didn't fail enqueue: rc $rc" || true
380 }
381 run_test 20a "ldlm_handle_enqueue error (should return error)" 
382
383 test_20b() {    # bug 2986 - ldlm_handle_enqueue error during open
384         remote_ost_nodsh && skip "remote OST with nodsh" && return 0
385
386         mkdir -p $DIR/$tdir
387         lfs setstripe $DIR/$tdir/${tfile} -i 0 -c 1
388         cancel_lru_locks osc
389 #define OBD_FAIL_LDLM_ENQUEUE_EXTENT_ERR 0x308
390         do_facet ost1 lctl set_param fail_loc=0x80000308
391         dd if=/etc/hosts of=$DIR/$tdir/$tfile && \
392                 error "didn't fail open enqueue" || true
393 }
394 run_test 20b "ldlm_handle_enqueue error (should return error)"
395
396 test_21a() {
397        mkdir -p $DIR/$tdir-1
398        mkdir -p $DIR/$tdir-2
399        multiop_bg_pause $DIR/$tdir-1/f O_c || return 1
400        close_pid=$!
401
402        do_facet $SINGLEMDS "lctl set_param fail_loc=0x80000129"
403        multiop $DIR/$tdir-2/f Oc &
404        open_pid=$!
405        sleep 1
406        do_facet $SINGLEMDS "lctl set_param fail_loc=0"
407
408        do_facet $SINGLEMDS "lctl set_param fail_loc=0x80000115"
409        kill -USR1 $close_pid
410        cancel_lru_locks mdc
411        wait $close_pid || return 1
412        wait $open_pid || return 2
413        do_facet $SINGLEMDS "lctl set_param fail_loc=0"
414
415        $CHECKSTAT -t file $DIR/$tdir-1/f || return 3
416        $CHECKSTAT -t file $DIR/$tdir-2/f || return 4
417
418        rm -rf $DIR/$tdir-*
419 }
420 run_test 21a "drop close request while close and open are both in flight"
421
422 test_21b() {
423        mkdir -p $DIR/$tdir-1
424        mkdir -p $DIR/$tdir-2
425        multiop_bg_pause $DIR/$tdir-1/f O_c || return 1
426        close_pid=$!
427
428        do_facet $SINGLEMDS "lctl set_param fail_loc=0x80000107"
429        mcreate $DIR/$tdir-2/f &
430        open_pid=$!
431        sleep 1
432        do_facet $SINGLEMDS "lctl set_param fail_loc=0"
433
434        kill -USR1 $close_pid
435        cancel_lru_locks mdc
436        wait $close_pid || return 1
437        wait $open_pid || return 3
438
439        $CHECKSTAT -t file $DIR/$tdir-1/f || return 4
440        $CHECKSTAT -t file $DIR/$tdir-2/f || return 5
441        rm -rf $DIR/$tdir-*
442 }
443 run_test 21b "drop open request while close and open are both in flight"
444
445 test_21c() {
446        mkdir -p $DIR/$tdir-1
447        mkdir -p $DIR/$tdir-2
448        multiop_bg_pause $DIR/$tdir-1/f O_c || return 1
449        close_pid=$!
450
451        do_facet $SINGLEMDS "lctl set_param fail_loc=0x80000107"
452        mcreate $DIR/$tdir-2/f &
453        open_pid=$!
454        sleep 3
455        do_facet $SINGLEMDS "lctl set_param fail_loc=0"
456
457        do_facet $SINGLEMDS "lctl set_param fail_loc=0x80000115"
458        kill -USR1 $close_pid
459        cancel_lru_locks mdc
460        wait $close_pid || return 1
461        wait $open_pid || return 2
462
463        do_facet $SINGLEMDS "lctl set_param fail_loc=0"
464
465        $CHECKSTAT -t file $DIR/$tdir-1/f || return 2
466        $CHECKSTAT -t file $DIR/$tdir-2/f || return 3
467        rm -rf $DIR/$tdir-*
468 }
469 run_test 21c "drop both request while close and open are both in flight"
470
471 test_21d() {
472        mkdir -p $DIR/$tdir-1
473        mkdir -p $DIR/$tdir-2
474        multiop_bg_pause $DIR/$tdir-1/f O_c || return 1
475        pid=$!
476
477        do_facet $SINGLEMDS "lctl set_param fail_loc=0x80000129"
478        multiop $DIR/$tdir-2/f Oc &
479        sleep 1
480        do_facet $SINGLEMDS "lctl set_param fail_loc=0"
481
482        do_facet $SINGLEMDS "lctl set_param fail_loc=0x80000122"
483        kill -USR1 $pid
484        cancel_lru_locks mdc
485        wait $pid || return 1
486        do_facet $SINGLEMDS "lctl set_param fail_loc=0"
487
488        $CHECKSTAT -t file $DIR/$tdir-1/f || return 2
489        $CHECKSTAT -t file $DIR/$tdir-2/f || return 3
490
491        rm -rf $DIR/$tdir-*
492 }
493 run_test 21d "drop close reply while close and open are both in flight"
494
495 test_21e() {
496        mkdir -p $DIR/$tdir-1
497        mkdir -p $DIR/$tdir-2
498        multiop_bg_pause $DIR/$tdir-1/f O_c || return 1
499        pid=$!
500
501        do_facet $SINGLEMDS "lctl set_param fail_loc=0x80000119"
502        touch $DIR/$tdir-2/f &
503        sleep 1
504        do_facet $SINGLEMDS "lctl set_param fail_loc=0"
505
506        kill -USR1 $pid
507        cancel_lru_locks mdc
508        wait $pid || return 1
509
510        sleep $TIMEOUT
511        $CHECKSTAT -t file $DIR/$tdir-1/f || return 2
512        $CHECKSTAT -t file $DIR/$tdir-2/f || return 3
513        rm -rf $DIR/$tdir-*
514 }
515 run_test 21e "drop open reply while close and open are both in flight"
516
517 test_21f() {
518        mkdir -p $DIR/$tdir-1
519        mkdir -p $DIR/$tdir-2
520        multiop_bg_pause $DIR/$tdir-1/f O_c || return 1
521        pid=$!
522
523        do_facet $SINGLEMDS "lctl set_param fail_loc=0x80000119"
524        touch $DIR/$tdir-2/f &
525        sleep 1
526        do_facet $SINGLEMDS "lctl set_param fail_loc=0"
527
528        do_facet $SINGLEMDS "lctl set_param fail_loc=0x80000122"
529        kill -USR1 $pid
530        cancel_lru_locks mdc
531        wait $pid || return 1
532        do_facet $SINGLEMDS "lctl set_param fail_loc=0"
533
534        $CHECKSTAT -t file $DIR/$tdir-1/f || return 2
535        $CHECKSTAT -t file $DIR/$tdir-2/f || return 3
536        rm -rf $DIR/$tdir-*
537 }
538 run_test 21f "drop both reply while close and open are both in flight"
539
540 test_21g() {
541        mkdir -p $DIR/$tdir-1
542        mkdir -p $DIR/$tdir-2
543        multiop_bg_pause $DIR/$tdir-1/f O_c || return 1
544        pid=$!
545
546        do_facet $SINGLEMDS "lctl set_param fail_loc=0x80000119"
547        touch $DIR/$tdir-2/f &
548        sleep 1
549        do_facet $SINGLEMDS "lctl set_param fail_loc=0"
550
551        do_facet $SINGLEMDS "lctl set_param fail_loc=0x80000115"
552        kill -USR1 $pid
553        cancel_lru_locks mdc
554        wait $pid || return 1
555        do_facet $SINGLEMDS "lctl set_param fail_loc=0"
556
557        $CHECKSTAT -t file $DIR/$tdir-1/f || return 2
558        $CHECKSTAT -t file $DIR/$tdir-2/f || return 3
559        rm -rf $DIR/$tdir-*
560 }
561 run_test 21g "drop open reply and close request while close and open are both in flight"
562
563 test_21h() {
564        mkdir -p $DIR/$tdir-1
565        mkdir -p $DIR/$tdir-2
566        multiop_bg_pause $DIR/$tdir-1/f O_c || return 1
567        pid=$!
568
569        do_facet $SINGLEMDS "lctl set_param fail_loc=0x80000107"
570        touch $DIR/$tdir-2/f &
571        touch_pid=$!
572        sleep 1
573        do_facet $SINGLEMDS "lctl set_param fail_loc=0"
574
575        do_facet $SINGLEMDS "lctl set_param fail_loc=0x80000122"
576        cancel_lru_locks mdc
577        kill -USR1 $pid
578        wait $pid || return 1
579        do_facet $SINGLEMDS "lctl set_param fail_loc=0"
580
581        wait $touch_pid || return 2
582
583        $CHECKSTAT -t file $DIR/$tdir-1/f || return 3
584        $CHECKSTAT -t file $DIR/$tdir-2/f || return 4
585        rm -rf $DIR/$tdir-*
586 }
587 run_test 21h "drop open request and close reply while close and open are both in flight"
588
589 # bug 3462 - multiple MDC requests
590 test_22() {
591     f1=$DIR/${tfile}-1
592     f2=$DIR/${tfile}-2
593     
594     do_facet $SINGLEMDS "lctl set_param fail_loc=0x80000115"
595     multiop $f2 Oc &
596     close_pid=$!
597
598     sleep 1
599     multiop $f1 msu || return 1
600
601     cancel_lru_locks mdc
602     do_facet $SINGLEMDS "lctl set_param fail_loc=0"
603
604     wait $close_pid || return 2
605     rm -rf $f2 || return 4
606 }
607 run_test 22 "drop close request and do mknod"
608
609 test_23() { #b=4561
610     multiop_bg_pause $DIR/$tfile O_c || return 1
611     pid=$!
612     # give a chance for open
613     sleep 5
614
615     # try the close
616     drop_request "kill -USR1 $pid"
617
618     fail $SINGLEMDS
619     wait $pid || return 1
620     return 0
621 }
622 run_test 23 "client hang when close a file after mds crash"
623
624 test_24() { # bug 11710 details correct fsync() behavior
625         remote_ost_nodsh && skip "remote OST with nodsh" && return 0
626
627         mkdir -p $DIR/$tdir
628         lfs setstripe $DIR/$tdir -s 0 -i 0 -c 1
629         cancel_lru_locks osc
630         multiop_bg_pause $DIR/$tdir/$tfile Owy_wyc || return 1
631         MULTI_PID=$!
632         ost_evict_client
633         kill -USR1 $MULTI_PID
634         wait $MULTI_PID
635         rc=$?
636         lctl set_param fail_loc=0x0
637         client_reconnect
638         [ $rc -eq 0 ] && error_ignore 5494 "multiop didn't fail fsync: rc $rc" || true
639 }
640 run_test 24 "fsync error (should return error)"
641
642 wait_client_evicted () {
643         local facet=$1
644         local exports=$2
645         local varsvc=${facet}_svc
646
647         wait_update $(facet_host $facet) "lctl get_param -n *.${!varsvc}.num_exports | cut -d' ' -f2" $((exports - 1)) $3
648 }
649
650 test_26a() {      # was test_26 bug 5921 - evict dead exports by pinger
651 # this test can only run from a client on a separate node.
652         remote_ost || { skip "local OST" && return 0; }
653         remote_ost_nodsh && skip "remote OST with nodsh" && return 0
654         remote_mds || { skip "local MDS" && return 0; }
655
656         if [ $(facet_host mgs) = $(facet_host ost1) ]; then
657                 skip "msg and ost1 are at the same node"
658                 return 0
659         fi
660
661         check_timeout || return 1
662
663         local OST_NEXP=$(do_facet ost1 lctl get_param -n obdfilter.${ost1_svc}.num_exports | cut -d' ' -f2)
664
665         echo starting with $OST_NEXP OST exports
666 # OBD_FAIL_PTLRPC_DROP_RPC 0x505
667         do_facet client lctl set_param fail_loc=0x505
668         # evictor takes PING_EVICT_TIMEOUT + 3 * PING_INTERVAL to evict.
669         # But if there's a race to start the evictor from various obds,
670         # the loser might have to wait for the next ping.
671
672         local rc=0
673         wait_client_evicted ost1 $OST_NEXP $((TIMEOUT * 2 + TIMEOUT * 3 / 4))
674         rc=$?
675         do_facet client lctl set_param fail_loc=0x0
676         [ $rc -eq 0 ] || error "client not evicted from OST"
677 }
678 run_test 26a "evict dead exports"
679
680 test_26b() {      # bug 10140 - evict dead exports by pinger
681         remote_ost_nodsh && skip "remote OST with nodsh" && return 0
682
683         if [ $(facet_host mgs) = $(facet_host ost1) ]; then
684                 skip "msg and ost1 are at the same node"
685                 return 0
686         fi
687
688         check_timeout || return 1
689         clients_up
690         zconf_mount `hostname` $MOUNT2 ||
691                 { error "Failed to mount $MOUNT2"; return 2; }
692         sleep 1 # wait connections being established
693
694         local MDS_NEXP=$(do_facet $SINGLEMDS lctl get_param -n mdt.${mds1_svc}.num_exports | cut -d' ' -f2)
695         local OST_NEXP=$(do_facet ost1 lctl get_param -n obdfilter.${ost1_svc}.num_exports | cut -d' ' -f2)
696
697         echo starting with $OST_NEXP OST and $MDS_NEXP MDS exports
698
699         zconf_umount `hostname` $MOUNT2 -f
700
701         # PING_INTERVAL max(obd_timeout / 4, 1U)
702         # PING_EVICT_TIMEOUT (PING_INTERVAL * 6)
703
704         # evictor takes PING_EVICT_TIMEOUT + 3 * PING_INTERVAL to evict.  
705         # But if there's a race to start the evictor from various obds, 
706         # the loser might have to wait for the next ping.
707         # = 9 * PING_INTERVAL + PING_INTERVAL
708         # = 10 PING_INTERVAL = 10 obd_timeout / 4 = 2.5 obd_timeout
709         # let's wait $((TIMEOUT * 3)) # bug 19887
710         local rc=0
711         wait_client_evicted ost1 $OST_NEXP $((TIMEOUT * 3)) || \
712                 error "Client was not evicted by ost" rc=1
713         wait_client_evicted $SINGLEMDS $MDS_NEXP $((TIMEOUT * 3)) || \
714                 error "Client was not evicted by mds"
715 }
716 run_test 26b "evict dead exports"
717
718 test_27() {
719         mkdir -p $DIR/$tdir
720         writemany -q -a $DIR/$tdir/$tfile 0 5 &
721         CLIENT_PID=$!
722         sleep 1
723         local save_FAILURE_MODE=$FAILURE_MODE
724         FAILURE_MODE="SOFT"
725         facet_failover $SINGLEMDS
726 #define OBD_FAIL_OSC_SHUTDOWN            0x407
727         do_facet $SINGLEMDS lctl set_param fail_loc=0x80000407
728         # need to wait for reconnect
729         echo waiting for fail_loc
730         wait_update_facet $SINGLEMDS "lctl get_param -n fail_loc" "-2147482617"
731         facet_failover $SINGLEMDS
732         #no crashes allowed!
733         kill -USR1 $CLIENT_PID
734         wait $CLIENT_PID 
735         true
736         FAILURE_MODE=$save_FAILURE_MODE
737 }
738 run_test 27 "fail LOV while using OSC's"
739
740 test_28() {      # bug 6086 - error adding new clients
741         do_facet client mcreate $DIR/$tfile       || return 1
742         drop_bl_callback "chmod 0777 $DIR/$tfile" ||echo "evicted as expected"
743         #define OBD_FAIL_MDS_CLIENT_ADD 0x12f
744         do_facet $SINGLEMDS "lctl set_param fail_loc=0x8000012f"
745         # fail once (evicted), reconnect fail (fail_loc), ok
746         client_up || (sleep 10; client_up) || (sleep 10; client_up) || error "reconnect failed"
747         rm -f $DIR/$tfile
748         fail $SINGLEMDS         # verify MDS last_rcvd can be loaded
749 }
750 run_test 28 "handle error adding new clients (bug 6086)"
751
752 test_29a() { # bug 22273 - error adding new clients
753         #define OBD_FAIL_TGT_CLIENT_ADD 0x711
754         do_facet $SINGLEMDS "lctl set_param fail_loc=0x80000711"
755         # fail abort so client will be new again
756         fail_abort $SINGLEMDS
757         client_up || error "reconnect failed"
758         return 0
759 }
760 run_test 29a "error adding new clients doesn't cause LBUG (bug 22273)"
761
762 test_29b() { # bug 22273 - error adding new clients
763         #define OBD_FAIL_TGT_CLIENT_ADD 0x711
764         do_facet ost1 "lctl set_param fail_loc=0x80000711"
765         # fail abort so client will be new again
766         fail_abort ost1
767         client_up || error "reconnect failed"
768         return 0
769 }
770 run_test 29b "error adding new clients doesn't cause LBUG (bug 22273)"
771
772 test_50() {
773         mkdir -p $DIR/$tdir
774         # put a load of file creates/writes/deletes
775         writemany -q $DIR/$tdir/$tfile 0 5 &
776         CLIENT_PID=$!
777         echo writemany pid $CLIENT_PID
778         sleep 10
779         FAILURE_MODE="SOFT"
780         fail $SINGLEMDS
781         # wait for client to reconnect to MDS
782         sleep 60
783         fail $SINGLEMDS
784         sleep 60
785         fail $SINGLEMDS
786         # client process should see no problems even though MDS went down
787         sleep $TIMEOUT
788         kill -USR1 $CLIENT_PID
789         wait $CLIENT_PID 
790         rc=$?
791         echo writemany returned $rc
792         #these may fail because of eviction due to slow AST response.
793         [ $rc -eq 0 ] || error_ignore 13652 "writemany returned rc $rc" || true
794 }
795 run_test 50 "failover MDS under load"
796
797 test_51() {
798         #define OBD_FAIL_MDS_SYNC_CAPA_SL                    0x1310
799         do_facet ost1 lctl set_param fail_loc=0x00001310
800
801         mkdir -p $DIR/$tdir
802         # put a load of file creates/writes/deletes
803         writemany -q $DIR/$tdir/$tfile 0 5 &
804         CLIENT_PID=$!
805         sleep 1
806         FAILURE_MODE="SOFT"
807         facet_failover $SINGLEMDS
808         # failover at various points during recovery
809         SEQ="1 5 10 $(seq $TIMEOUT 5 $(($TIMEOUT+10)))"
810         echo will failover at $SEQ
811         for i in $SEQ
812           do
813           echo failover in $i sec
814           sleep $i
815           facet_failover $SINGLEMDS
816         done
817         # client process should see no problems even though MDS went down
818         # and recovery was interrupted
819         sleep $TIMEOUT
820         kill -USR1 $CLIENT_PID
821         wait $CLIENT_PID 
822         rc=$?
823         echo writemany returned $rc
824         [ $rc -eq 0 ] || error_ignore 13652 "writemany returned rc $rc" || true
825 }
826 run_test 51 "failover MDS during recovery"
827
828 test_52_guts() {
829         do_facet client "mkdir -p $DIR/$tdir"
830         do_facet client "writemany -q -a $DIR/$tdir/$tfile 300 5" &
831         CLIENT_PID=$!
832         echo writemany pid $CLIENT_PID
833         sleep 10
834         FAILURE_MODE="SOFT"
835         fail ost1
836         rc=0
837         wait $CLIENT_PID || rc=$?
838         # active client process should see an EIO for down OST
839         [ $rc -eq 5 ] && { echo "writemany correctly failed $rc" && return 0; }
840         # but timing or failover setup may allow success
841         [ $rc -eq 0 ] && { echo "writemany succeeded" && return 0; }
842         echo "writemany returned $rc"
843         return $rc
844 }
845
846 test_52() {
847         remote_ost_nodsh && skip "remote OST with nodsh" && return 0
848
849         mkdir -p $DIR/$tdir
850         test_52_guts
851         rc=$?
852         [ $rc -ne 0 ] && { return $rc; }
853         # wait for client to reconnect to OST
854         sleep 30
855         test_52_guts
856         rc=$?
857         [ $rc -ne 0 ] && { return $rc; }
858         sleep 30
859         test_52_guts
860         rc=$?
861         client_reconnect
862         #return $rc
863 }
864 run_test 52 "failover OST under load"
865
866 # test of open reconstruct
867 test_53() {
868         touch $DIR/$tfile
869         drop_ldlm_reply "openfile -f O_RDWR:O_CREAT -m 0755 $DIR/$tfile" ||\
870                 return 2
871 }
872 run_test 53 "touch: drop rep"
873
874 test_54() {
875         zconf_mount `hostname` $MOUNT2
876         touch $DIR/$tfile
877         touch $DIR2/$tfile.1
878         sleep 10
879         cat $DIR2/$tfile.missing # save transno = 0, rc != 0 into last_rcvd
880         fail $SINGLEMDS
881         umount $MOUNT2
882         ERROR=`dmesg | egrep "(test 54|went back in time)" | tail -n1 | grep "went back in time"`
883         [ x"$ERROR" == x ] || error "back in time occured"
884 }
885 run_test 54 "back in time"
886
887 # bug 11330 - liblustre application death during I/O locks up OST
888 test_55() {
889         remote_ost_nodsh && skip "remote OST with nodsh" && return 0
890
891         mkdir -p $DIR/$tdir
892
893         # first dd should be finished quickly
894         lfs setstripe $DIR/$tdir/$tfile-1 -c 1 -i 0
895         dd if=/dev/zero of=$DIR/$tdir/$tfile-1 bs=32M count=4  &
896         DDPID=$!
897         count=0
898         echo  "step1: testing ......"
899         while [ true ]; do
900             if [ -z `ps x | awk '$1 == '$DDPID' { print $5 }'` ]; then break; fi
901             count=$[count+1]
902             if [ $count -gt 64 ]; then
903                 error "dd should be finished!"
904             fi
905             sleep 1
906         done    
907         echo "(dd_pid=$DDPID, time=$count)successful"
908
909         lfs setstripe $DIR/$tdir/$tfile-2 -c 1 -i 0
910         #define OBD_FAIL_OST_DROP_REQ            0x21d
911         do_facet ost1 lctl set_param fail_loc=0x0000021d
912         # second dd will be never finished
913         dd if=/dev/zero of=$DIR/$tdir/$tfile-2 bs=32M count=4  &        
914         DDPID=$!
915         count=0
916         echo  "step2: testing ......"
917         while [ $count -le 64 ]; do
918             dd_name="`ps x | awk '$1 == '$DDPID' { print $5 }'`"            
919             if [ -z  $dd_name ]; then 
920                 ls -l $DIR/$tdir
921                 echo  "debug: (dd_name=$dd_name, dd_pid=$DDPID, time=$count)"
922                 error "dd shouldn't be finished!"
923             fi
924             count=$[count+1]
925             sleep 1
926         done    
927         echo "(dd_pid=$DDPID, time=$count)successful"
928
929         #Recover fail_loc and dd will finish soon
930         do_facet ost1 lctl set_param fail_loc=0
931         count=0
932         echo  "step3: testing ......"
933         while [ true ]; do
934             if [ -z `ps x | awk '$1 == '$DDPID' { print $5 }'` ]; then break; fi
935             count=$[count+1]
936             if [ $count -gt 500 ]; then
937                 error "dd should be finished!"
938             fi
939             sleep 1
940         done    
941         echo "(dd_pid=$DDPID, time=$count)successful"
942
943         rm -rf $DIR/$tdir
944 }
945 run_test 55 "ost_brw_read/write drops timed-out read/write request"
946
947 test_56() { # b=11277
948 #define OBD_FAIL_MDS_RESEND      0x136
949         touch $DIR/$tfile
950         do_facet $SINGLEMDS "lctl set_param fail_loc=0x80000136"
951         stat $DIR/$tfile
952         do_facet $SINGLEMDS "lctl set_param fail_loc=0"
953         rm -f $DIR/$tfile
954 }
955 run_test 56 "do not allow reconnect to busy exports"
956
957 test_57_helper() {
958         # no oscs means no client or mdt 
959         while lctl get_param osc.*.* > /dev/null 2>&1; do
960                 : # loop until proc file is removed
961         done
962 }
963
964 test_57() { # bug 10866
965         test_57_helper &
966         pid=$!
967         sleep 1
968 #define OBD_FAIL_LPROC_REMOVE            0xB00
969         lctl set_param fail_loc=0x80000B00
970         zconf_umount `hostname` $DIR
971         lctl set_param fail_loc=0x80000B00
972         fail_abort $SINGLEMDS
973         kill -9 $pid
974         lctl set_param fail_loc=0
975         mount_client $DIR
976         do_facet client "df $DIR"
977 }
978 run_test 57 "read procfs entries causes kernel crash"
979
980 test_58() { # bug 11546
981 #define OBD_FAIL_MDC_ENQUEUE_PAUSE        0x801
982         touch $DIR/$tfile
983         ls -la $DIR/$tfile
984         lctl set_param fail_loc=0x80000801
985         cp $DIR/$tfile /dev/null &
986         pid=$!
987         sleep 1
988         lctl set_param fail_loc=0
989         drop_bl_callback rm -f $DIR/$tfile
990         wait $pid
991         do_facet client "df $DIR"
992 }
993 run_test 58 "Eviction in the middle of open RPC reply processing"
994
995 test_59() { # bug 10589
996         zconf_mount `hostname` $MOUNT2 || error "Failed to mount $MOUNT2"
997         echo $DIR2 | grep -q $MOUNT2 || error "DIR2 is not set properly: $DIR2"
998 #define OBD_FAIL_LDLM_CANCEL_EVICT_RACE  0x311
999         lctl set_param fail_loc=0x311
1000         writes=$(LANG=C dd if=/dev/zero of=$DIR2/$tfile count=1 2>&1)
1001         [ $? = 0 ] || error "dd write failed"
1002         writes=$(echo $writes | awk  -F '+' '/out/ {print $1}')
1003         lctl set_param fail_loc=0
1004         sync
1005         zconf_umount `hostname` $MOUNT2 -f
1006         reads=$(LANG=C dd if=$DIR/$tfile of=/dev/null 2>&1)
1007         [ $? = 0 ] || error "dd read failed"
1008         reads=$(echo $reads | awk -F '+' '/in/ {print $1}')
1009         [ "$reads" -eq "$writes" ] || error "read" $reads "blocks, must be" $writes
1010 }
1011 run_test 59 "Read cancel race on client eviction"
1012
1013 err17935 () {
1014     # we assume that all md changes are in the MDT0 changelog
1015     if [ $MDSCOUNT -gt 1 ]; then
1016         error_ignore 17935 $*
1017     else
1018         error $*
1019     fi
1020 }
1021
1022 test_60() {
1023         MDT0=$($LCTL get_param -n mdc.*.mds_server_uuid | \
1024             awk '{gsub(/_UUID/,""); print $1}' | head -1)
1025
1026         NUM_FILES=15000
1027         mkdir -p $DIR/$tdir
1028
1029         # Register (and start) changelog
1030         USER=$(do_facet $SINGLEMDS lctl --device $MDT0 changelog_register -n)
1031         echo "Registered as $MDT0 changelog user $USER"
1032
1033         # Generate a large number of changelog entries
1034         createmany -o $DIR/$tdir/$tfile $NUM_FILES
1035         sync
1036         sleep 5
1037
1038         # Unlink files in the background
1039         unlinkmany $DIR/$tdir/$tfile $NUM_FILES &
1040         CLIENT_PID=$!
1041         sleep 1
1042
1043         # Failover the MDS while unlinks are happening
1044         facet_failover $SINGLEMDS
1045
1046         # Wait for unlinkmany to finish
1047         wait $CLIENT_PID
1048
1049         # Check if all the create/unlink events were recorded
1050         # in the changelog
1051         $LFS changelog $MDT0 >> $DIR/$tdir/changelog
1052         local cl_count=$(grep UNLNK $DIR/$tdir/changelog | wc -l)
1053         echo "$cl_count unlinks in $MDT0 changelog"
1054
1055         do_facet $SINGLEMDS lctl --device $MDT0 changelog_deregister $USER
1056         USERS=$(( $(do_facet $SINGLEMDS lctl get_param -n \
1057             mdd.$MDT0.changelog_users | wc -l) - 2 ))
1058         if [ $USERS -eq 0 ]; then
1059             [ $cl_count -eq $NUM_FILES ] || \
1060                 err17935 "Recorded ${cl_count} unlinks out of $NUM_FILES"
1061             # Also make sure we can clear large changelogs
1062             cl_count=$($LFS changelog $FSNAME | wc -l)
1063             [ $cl_count -le 2 ] || \
1064                 error "Changelog not empty: $cl_count entries"
1065         else
1066             # If there are other users, there may be other unlinks in the log
1067             [ $cl_count -ge $NUM_FILES ] || \
1068                 err17935 "Recorded ${cl_count} unlinks out of $NUM_FILES"
1069             echo "$USERS other changelog users; can't verify clear"
1070         fi
1071 }
1072 run_test 60 "Add Changelog entries during MDS failover"
1073
1074 test_61()
1075 {
1076         local mdtosc=$(get_mdtosc_proc_path $SINGLEMDS $FSNAME-OST0000)
1077         mdtosc=${mdtosc/-MDT*/-MDT\*}
1078         local cflags="osc.$mdtosc.connect_flags"
1079         do_facet $SINGLEMDS "lctl get_param -n $cflags" |grep -q skip_orphan
1080         [ $? -ne 0 ] && skip "don't have skip orphan feature" && return
1081
1082         mkdir -p $DIR/$tdir || error "mkdir dir $DIR/$tdir failed"
1083         # Set the default stripe of $DIR/$tdir to put the files to ost1
1084         $LFS setstripe -c 1 --index 0 $DIR/$tdir
1085
1086         replay_barrier $SINGLEMDS
1087         createmany -o $DIR/$tdir/$tfile-%d 10 
1088         local oid=`do_facet ost1 "lctl get_param -n obdfilter.${ost1_svc}.last_id"`
1089
1090         fail_abort $SINGLEMDS
1091         
1092         touch $DIR/$tdir/$tfile
1093         local id=`$LFS getstripe $DIR/$tdir/$tfile |awk '($1 ~ 0 && $2 ~ /^[1-9]+/) {print $2}'`
1094         [ $id -le $oid ] && error "the orphan objid was reused, failed"
1095
1096         # Cleanup
1097         rm -rf $DIR/$tdir
1098 }
1099 run_test 61 "Verify to not reuse orphan objects - bug 17025"
1100
1101 complete $(basename $0) $SECONDS
1102 check_and_cleanup_lustre
1103 exit_status