Whamcloud - gitweb
adjust krb5 related scripts, add krb5 support in replay-ost-single,
[fs/lustre-release.git] / lustre / tests / recovery-small.sh
1 #!/bin/sh
2
3 set -e
4
5 # 20b: bug  2986
6 ALWAYS_EXCEPT=" 20b"
7
8
9 LUSTRE=${LUSTRE:-`dirname $0`/..}
10
11 . $LUSTRE/tests/test-framework.sh
12
13 init_test_env $@
14
15 . ${CONFIG:=$LUSTRE/tests/cfg/lmv.sh}
16
17 build_test_filter
18
19 assert_env MDSCOUNT
20
21 # Allow us to override the setup if we already have a mounted system by
22 # setting SETUP=" " and CLEANUP=" "
23 SETUP=${SETUP:-"setup"}
24 CLEANUP=${CLEANUP:-"cleanup"}
25
26 gen_config() {
27     rm -f $XMLCONFIG
28
29     if [ "$MDSCOUNT" -gt 1 ]; then
30         add_lmv lmv1_svc
31         for mds in `mds_list`; do
32             MDSDEV=$TMP/${mds}-`hostname`
33             add_mds $mds --dev $MDSDEV --size $MDSSIZE  --lmv lmv1_svc
34         done
35         add_lov_to_lmv lov1 lmv1_svc --stripe_sz $STRIPE_BYTES \
36             --stripe_cnt $STRIPES_PER_OBJ --stripe_pattern 0
37         MDS=lmv1
38     else
39         add_mds mds1 --dev $MDSDEV --size $MDSSIZE
40         add_lov lov1 mds1 --stripe_sz $STRIPE_BYTES \
41             --stripe_cnt $STRIPES_PER_OBJ --stripe_pattern 0
42         MDS=mds1_svc
43
44     fi
45
46     add_ost ost --lov lov1 --dev $OSTDEV --size $OSTSIZE
47     add_ost ost2 --lov lov1 --dev ${OSTDEV}-2 --size $OSTSIZE
48     add_client client ${MDS} --lov lov1 --path $MOUNT
49 }
50
51 setup() {
52     gen_config
53     start_krb5_kdc || exit 1
54     start_lsvcgssd || exit 2
55     start_lgssd || exit 3
56     start ost --reformat $OSTLCONFARGS 
57     start ost2 --reformat $OSTLCONFARGS 
58     [ "$DAEMONFILE" ] && $LCTL debug_daemon start $DAEMONFILE $DAEMONSIZE
59     for mds in `mds_list`; do
60         start $mds --reformat $MDSLCONFARGS
61     done
62     grep " $MOUNT " /proc/mounts || zconf_mount `hostname`  $MOUNT
63 }
64
65 cleanup() {
66     zconf_umount `hostname` $MOUNT
67     for mds in `mds_list`; do
68         stop $mds ${FORCE} $MDSLCONFARGS
69     done
70     stop ost2 ${FORCE} --dump cleanup.log
71     stop ost ${FORCE} --dump cleanup.log
72     stop_lgssd
73     stop_lsvcgssd
74 }
75
76 if [ ! -z "$EVAL" ]; then
77     eval "$EVAL"
78     exit $?
79 fi
80
81 if [ "$ONLY" == "setup" ]; then
82     setup
83     exit
84 fi
85
86 if [ "$ONLY" == "cleanup" ]; then
87     sysctl -w portals.debug=0 || true
88     cleanup
89     exit
90 fi
91
92 REFORMAT=--reformat $SETUP
93 unset REFORMAT
94
95 [ "$ONLY" == "setup" ] && exit
96
97 test_1() {
98     drop_request "mcreate $MOUNT/1"  || return 1
99     drop_reint_reply "mcreate $MOUNT/2"    || return 2
100 }
101 run_test 1 "mcreate: drop req, drop rep"
102
103 test_2() {
104     drop_request "tchmod 111 $MOUNT/2"  || return 1
105     drop_reint_reply "tchmod 666 $MOUNT/2"    || return 2
106 }
107 run_test 2 "chmod: drop req, drop rep"
108
109 test_3() {
110     drop_request "statone $MOUNT/2" || return 1
111     drop_reply "statone $MOUNT/2"   || return 2
112 }
113 run_test 3 "stat: drop req, drop rep"
114
115 test_4() {
116     do_facet client "cp /etc/resolv.conf $MOUNT/resolv.conf" || return 1
117     drop_request "cat $MOUNT/resolv.conf > /dev/null"   || return 2
118     drop_reply "cat $MOUNT/resolv.conf > /dev/null"     || return 3
119 }
120 run_test 4 "open: drop req, drop rep"
121
122 test_5() {
123     drop_request "mv $MOUNT/resolv.conf $MOUNT/renamed" || return 1
124     drop_reint_reply "mv $MOUNT/renamed $MOUNT/renamed-again" || return 2
125     do_facet client "checkstat -v $MOUNT/renamed-again"  || return 3
126 }
127 run_test 5 "rename: drop req, drop rep"
128
129 test_6() {
130     drop_request "mlink $MOUNT/renamed-again $MOUNT/link1" || return 1
131     drop_reint_reply "mlink $MOUNT/renamed-again $MOUNT/link2"   || return 2
132 }
133 run_test 6 "link: drop req, drop rep"
134
135 test_7() {
136     drop_request "munlink $MOUNT/link1"   || return 1
137     drop_reint_reply "munlink $MOUNT/link2"     || return 2
138 }
139 run_test 7 "unlink: drop req, drop rep"
140
141 #bug 1423
142 test_8() {
143     drop_reint_reply "touch $MOUNT/renamed"    || return 1
144 }
145 run_test 8 "touch: drop rep (bug 1423)"
146
147 #bug 1420
148 test_9() {
149     pause_bulk "cp /etc/profile $MOUNT"       || return 1
150     do_facet client "cp /etc/termcap $MOUNT"  || return 2
151     do_facet client "sync"
152     do_facet client "rm $MOUNT/termcap $MOUNT/profile" || return 3
153 }
154 run_test 9 "pause bulk on OST (bug 1420)"
155
156 #bug 1521
157 test_10() {
158     do_facet client mcreate $MOUNT/f10        || return 1
159     drop_bl_callback "chmod 0777 $MOUNT/f10"  || return 2
160     # wait for the mds to evict the client
161     #echo "sleep $(($TIMEOUT*2))"
162     #sleep $(($TIMEOUT*2))
163     do_facet client touch  $MOUNT/f10 || echo "touch failed, evicted"
164     do_facet client checkstat -v -p 0777 $MOUNT/f10  || return 3
165     do_facet client "munlink $MOUNT/f10"
166 }
167 run_test 10 "finish request on server after client eviction (bug 1521)"
168
169 #bug 2460
170 # wake up a thead waiting for completion after eviction
171 test_11(){
172     do_facet client multiop $MOUNT/$tfile Ow  || return 1
173     do_facet client multiop $MOUNT/$tfile or  || return 2
174
175     cancel_lru_locks OSC
176
177     do_facet client multiop $MOUNT/$tfile or  || return 3
178     drop_bl_callback multiop $MOUNT/$tfile Ow  || 
179         echo "client evicted, as expected"
180
181     do_facet client munlink $MOUNT/$tfile  || return 4
182 }
183 run_test 11 "wake up a thead waiting for completion after eviction (b=2460)"
184
185 #b=2494
186 test_12(){
187     $LCTL mark multiop $MOUNT/$tfile OS_c 
188     do_facet mds "sysctl -w lustre.fail_loc=0x115"
189     clear_failloc mds $((TIMEOUT * 2)) &
190     multiop $MOUNT/$tfile OS_c  &
191     PID=$!
192 #define OBD_FAIL_MDS_CLOSE_NET           0x115
193     sleep 2
194     kill -USR1 $PID
195     cancel_lru_locks MDC  # force the close
196     echo "waiting for multiop $PID"
197     wait $PID || return 2
198     do_facet client munlink $MOUNT/$tfile  || return 3
199 }
200 run_test 12 "recover from timed out resend in ptlrpcd (b=2494)"
201
202 # Bug 113, check that readdir lost recv timeout works.
203 test_13() {
204     mkdir /mnt/lustre/readdir || return 1
205     touch /mnt/lustre/readdir/newentry  || return 
206 # OBD_FAIL_MDS_READPAGE_NET|OBD_FAIL_ONCE
207     do_facet mds "sysctl -w lustre.fail_loc=0x80000104"
208     ls /mnt/lustre/readdir || return 3
209     do_facet mds "sysctl -w lustre.fail_loc=0"
210     rm -rf /mnt/lustre/readdir  || return 4
211 }
212 run_test 13 "mdc_readpage restart test (bug 1138)"
213
214 # Bug 113, check that readdir lost send timeout works.
215 test_14() {
216     mkdir /mnt/lustre/readdir
217     touch /mnt/lustre/readdir/newentry
218 # OBD_FAIL_MDS_SENDPAGE|OBD_FAIL_ONCE
219     do_facet mds "sysctl -w lustre.fail_loc=0x80000106"
220     ls /mnt/lustre/readdir || return 1
221     do_facet mds "sysctl -w lustre.fail_loc=0"
222 }
223 run_test 14 "mdc_readpage resend test (bug 1138)"
224
225 test_15() {
226     do_facet mds "sysctl -w lustre.fail_loc=0x80000128"
227     touch $DIR/$tfile && return 1
228     return 0
229 }
230 run_test 15 "failed open (-ENOMEM)"
231
232 stop_read_ahead() {
233    for f in /proc/fs/lustre/llite/*/read_ahead; do 
234       echo 0 > $f
235    done
236 }
237
238 start_read_ahead() {
239    for f in /proc/fs/lustre/llite/*/read_ahead; do 
240       echo 1 > $f
241    done
242 }
243
244 # recovery timeout. This actually should be taken from 
245 # obd_timeout
246 RECOV_TIMEOUT=30
247
248 test_16() {
249     do_facet client cp /etc/termcap $MOUNT
250     sync
251     stop_read_ahead
252
253 #define OBD_FAIL_PTLRPC_BULK_PUT_NET 0x504 | OBD_FAIL_ONCE
254     sysctl -w lustre.fail_loc=0x80000504
255     cancel_lru_locks OSC
256     # will get evicted here
257     do_facet client "cmp /etc/termcap $MOUNT/termcap"  && return 1
258     sysctl -w lustre.fail_loc=0
259     # give recovery a chance to finish (shouldn't take long)
260     sleep $RECOV_TIMEOUT
261     do_facet client "cmp /etc/termcap $MOUNT/termcap"  || return 2
262     start_read_ahead
263 }
264 run_test 16 "timeout bulk put, evict client (2732)"
265
266 test_17() {
267     # OBD_FAIL_PTLRPC_BULK_GET_NET 0x0503 | OBD_FAIL_ONCE
268     # client will get evicted here
269     sysctl -w lustre.fail_loc=0x80000503
270     do_facet client cp /etc/termcap $DIR/$tfile
271
272     sleep $RECOV_TIMEOUT
273     sysctl -w lustre.fail_loc=0
274     do_facet client "df $DIR"
275     # expect cmp to fail
276     do_facet client "cmp /etc/termcap $DIR/$tfile"  && return 1
277     do_facet client "rm $DIR/$tfile" || return 2
278     return 0
279 }
280 run_test 17 "timeout bulk get, evict client (2732)"
281
282 test_18a() {
283     do_facet client mkdir -p $MOUNT/$tdir
284     f=$MOUNT/$tdir/$tfile
285
286     cancel_lru_locks OSC
287     pgcache_empty || return 1
288
289     # 1 stripe on ost2
290     lfs setstripe $f $((128 * 1024)) 1 1
291
292     do_facet client cp /etc/termcap $f
293     sync
294     local osc2_dev=`$LCTL device_list | \
295         awk '(/ost2.*client_facet/){print $4}' `
296     $LCTL --device %$osc2_dev deactivate
297     # my understanding is that there should be nothing in the page
298     # cache after the client reconnects?     
299     rc=0
300     pgcache_empty || rc=2
301     $LCTL --device %$osc2_dev activate
302     rm -f $f
303     return $rc
304 }
305 run_test 18a "manual ost invalidate clears page cache immediately"
306
307 test_18b() {
308 # OBD_FAIL_PTLRPC_BULK_PUT_NET|OBD_FAIL_ONCE
309     do_facet client mkdir -p $MOUNT/$tdir
310     f=$MOUNT/$tdir/$tfile
311     f2=$MOUNT/$tdir/${tfile}-2
312
313     cancel_lru_locks OSC
314     pgcache_empty || return 1
315
316     # shouldn't have to set stripe size of count==1
317     lfs setstripe $f $((128 * 1024)) 0 1
318     lfs setstripe $f2 $((128 * 1024)) 0 1
319
320     do_facet client cp /etc/termcap $f
321     sync
322     # just use this write to trigger the client's eviction from the ost
323     sysctl -w lustre.fail_loc=0x80000503
324     do_facet client dd if=/dev/zero of=$f2 bs=4k count=1
325     sync
326     sysctl -w lustre.fail_loc=0
327     # allow recovery to complete
328     sleep $((TIMEOUT + 2))
329     # my understanding is that there should be nothing in the page
330     # cache after the client reconnects?     
331     rc=0
332     pgcache_empty || rc=2
333     rm -f $f $f2
334     return $rc
335 }
336 run_test 18b "eviction and reconnect clears page cache (2766)"
337
338 test_19a() {
339     f=$MOUNT/$tfile
340     do_facet client mcreate $f        || return 1
341     drop_ldlm_cancel "chmod 0777 $f"  || echo evicted
342
343     do_facet client checkstat -v -p 0777 $f  || echo evicted
344     # let the client reconnect
345     sleep 5
346     do_facet client "munlink $f"
347 }
348 run_test 19a "test expired_lock_main on mds (2867)"
349
350 test_19b() {
351     f=$MOUNT/$tfile
352     do_facet client multiop $f Ow  || return 1
353     do_facet client multiop $f or  || return 2
354
355     cancel_lru_locks OSC
356
357     do_facet client multiop $f or  || return 3
358     drop_ldlm_cancel multiop $f Ow  || echo "client evicted, as expected"
359
360     do_facet client munlink $f  || return 4
361 }
362 run_test 19b "test expired_lock_main on ost (2867)"
363
364 test_20a() {    # bug 2983 - ldlm_handle_enqueue cleanup
365         mkdir -p $DIR/$tdir
366         multiop $DIR/$tdir/${tfile} O_wc &
367         MULTI_PID=$!
368         sleep 1
369         cancel_lru_locks OSC
370 #define OBD_FAIL_LDLM_ENQUEUE_EXTENT_ERR 0x308
371         do_facet ost sysctl -w lustre.fail_loc=0x80000308
372         kill -USR1 $MULTI_PID
373         wait $MULTI_PID
374         rc=$?
375         [ $rc -eq 0 ] && error "multiop didn't fail enqueue: rc $rc" || true
376 }
377 run_test 20a "ldlm_handle_enqueue error (should return error)" 
378
379 test_20b() {    # bug 2986 - ldlm_handle_enqueue error during open
380         mkdir -p $DIR/$tdir
381         touch $DIR/$tdir/${tfile}
382         cancel_lru_locks OSC
383 #define OBD_FAIL_LDLM_ENQUEUE_EXTENT_ERR 0x308
384         do_facet ost sysctl -w lustre.fail_loc=0x80000308
385         dd if=/etc/hosts of=$DIR/$tdir/$tfile && \
386                 error "didn't fail open enqueue" || true
387 }
388 run_test 20b "ldlm_handle_enqueue error (should return error)"
389
390 test_21a() {
391        mkdir -p $DIR/$tdir-1
392        mkdir -p $DIR/$tdir-2
393        multiop $DIR/$tdir-1/f O_c &
394        close_pid=$!
395
396        do_facet mds "sysctl -w lustre.fail_loc=0x80000129"
397        multiop $DIR/$tdir-2/f Oc &
398        open_pid=$!
399        sleep 1
400        do_facet mds "sysctl -w lustre.fail_loc=0"
401
402        do_facet mds "sysctl -w lustre.fail_loc=0x80000115"
403        kill -USR1 $close_pid
404        cancel_lru_locks MDC  # force the close
405        wait $close_pid || return 1
406        wait $open_pid || return 2
407        do_facet mds "sysctl -w lustre.fail_loc=0"
408
409        $CHECKSTAT -t file $DIR/$tdir-1/f || return 3
410        $CHECKSTAT -t file $DIR/$tdir-2/f || return 4
411
412        rm -rf $DIR/$tdir-*
413 }
414 run_test 21a "drop close request while close and open are both in flight"
415
416 test_21b() {
417        mkdir -p $DIR/$tdir-1
418        mkdir -p $DIR/$tdir-2
419        multiop $DIR/$tdir-1/f O_c &
420        close_pid=$!
421
422        do_facet mds "sysctl -w lustre.fail_loc=0x80000107"
423        mcreate $DIR/$tdir-2/f &
424        open_pid=$!
425        sleep 1
426        do_facet mds "sysctl -w lustre.fail_loc=0"
427
428        kill -USR1 $close_pid
429        cancel_lru_locks MDC  # force the close
430        wait $close_pid || return 1
431        wait $open_pid || return 3
432
433        $CHECKSTAT -t file $DIR/$tdir-1/f || return 4
434        $CHECKSTAT -t file $DIR/$tdir-2/f || return 5
435        rm -rf $DIR/$tdir-*
436 }
437 run_test 21b "drop open request while close and open are both in flight"
438
439 test_21c() {
440        mkdir -p $DIR/$tdir-1
441        mkdir -p $DIR/$tdir-2
442        multiop $DIR/$tdir-1/f O_c &
443        close_pid=$!
444
445        do_facet mds "sysctl -w lustre.fail_loc=0x80000107"
446        mcreate $DIR/$tdir-2/f &
447        open_pid=$!
448        sleep 3
449        do_facet mds "sysctl -w lustre.fail_loc=0"
450
451        do_facet mds "sysctl -w lustre.fail_loc=0x80000115"
452        kill -USR1 $close_pid
453        cancel_lru_locks MDC  # force the close
454        wait $close_pid || return 1
455        wait $open_pid || return 2
456
457        do_facet mds "sysctl -w lustre.fail_loc=0"
458
459        $CHECKSTAT -t file $DIR/$tdir-1/f || return 2
460        $CHECKSTAT -t file $DIR/$tdir-2/f || return 3
461        rm -rf $DIR/$tdir-*
462 }
463 run_test 21c "drop both request while close and open are both in flight"
464
465 test_21d() {
466        mkdir -p $DIR/$tdir-1
467        mkdir -p $DIR/$tdir-2
468        multiop $DIR/$tdir-1/f O_c &
469        pid=$!
470
471        do_facet mds "sysctl -w lustre.fail_loc=0x80000129"
472        multiop $DIR/$tdir-2/f Oc &
473        sleep 1
474        do_facet mds "sysctl -w lustre.fail_loc=0"
475
476        do_facet mds "sysctl -w lustre.fail_loc=0x80000122"
477        kill -USR1 $pid
478        cancel_lru_locks MDC  # force the close
479        wait $pid || return 1
480        do_facet mds "sysctl -w lustre.fail_loc=0"
481
482        $CHECKSTAT -t file $DIR/$tdir-1/f || return 2
483        $CHECKSTAT -t file $DIR/$tdir-2/f || return 3
484
485        rm -rf $DIR/$tdir-*
486 }
487 run_test 21d "drop close reply while close and open are both in flight"
488
489 test_21e() {
490        mkdir -p $DIR/$tdir-1
491        mkdir -p $DIR/$tdir-2
492        multiop $DIR/$tdir-1/f O_c &
493        pid=$!
494
495        do_facet mds "sysctl -w lustre.fail_loc=0x80000119"
496        touch $DIR/$tdir-2/f &
497        sleep 1
498        do_facet mds "sysctl -w lustre.fail_loc=0"
499
500        kill -USR1 $pid
501        cancel_lru_locks MDC  # force the close
502        wait $pid || return 1
503
504        sleep $TIMEOUT
505        $CHECKSTAT -t file $DIR/$tdir-1/f || return 2
506        $CHECKSTAT -t file $DIR/$tdir-2/f || return 3
507        rm -rf $DIR/$tdir-*
508 }
509 run_test 21e "drop open reply while close and open are both in flight"
510
511 test_21f() {
512        mkdir -p $DIR/$tdir-1
513        mkdir -p $DIR/$tdir-2
514        multiop $DIR/$tdir-1/f O_c &
515        pid=$!
516
517        do_facet mds "sysctl -w lustre.fail_loc=0x80000119"
518        touch $DIR/$tdir-2/f &
519        sleep 1
520        do_facet mds "sysctl -w lustre.fail_loc=0"
521
522        do_facet mds "sysctl -w lustre.fail_loc=0x80000122"
523        kill -USR1 $pid
524        cancel_lru_locks MDC  # force the close
525        wait $pid || return 1
526        do_facet mds "sysctl -w lustre.fail_loc=0"
527
528        $CHECKSTAT -t file $DIR/$tdir-1/f || return 2
529        $CHECKSTAT -t file $DIR/$tdir-2/f || return 3
530        rm -rf $DIR/$tdir-*
531 }
532 run_test 21f "drop both reply while close and open are both in flight"
533
534 test_21g() {
535        mkdir -p $DIR/$tdir-1
536        mkdir -p $DIR/$tdir-2
537        multiop $DIR/$tdir-1/f O_c &
538        pid=$!
539
540        do_facet mds "sysctl -w lustre.fail_loc=0x80000119"
541        touch $DIR/$tdir-2/f &
542        sleep 1
543        do_facet mds "sysctl -w lustre.fail_loc=0"
544
545        do_facet mds "sysctl -w lustre.fail_loc=0x80000115"
546        kill -USR1 $pid
547        cancel_lru_locks MDC  # force the close
548        wait $pid || return 1
549        do_facet mds "sysctl -w lustre.fail_loc=0"
550
551        $CHECKSTAT -t file $DIR/$tdir-1/f || return 2
552        $CHECKSTAT -t file $DIR/$tdir-2/f || return 3
553        rm -rf $DIR/$tdir-*
554 }
555 run_test 21g "drop open reply and close request while close and open are both in flight"
556
557 test_21h() {
558        mkdir -p $DIR/$tdir-1
559        mkdir -p $DIR/$tdir-2
560        multiop $DIR/$tdir-1/f O_c &
561        pid=$!
562
563        do_facet mds "sysctl -w lustre.fail_loc=0x80000107"
564        touch $DIR/$tdir-2/f &
565        touch_pid=$!
566        sleep 1
567        do_facet mds "sysctl -w lustre.fail_loc=0"
568
569        do_facet mds "sysctl -w lustre.fail_loc=0x80000122"
570        cancel_lru_locks MDC  # force the close
571        kill -USR1 $pid
572        wait $pid || return 1
573        do_facet mds "sysctl -w lustre.fail_loc=0"
574
575        wait $touch_pid || return 2
576
577        $CHECKSTAT -t file $DIR/$tdir-1/f || return 3
578        $CHECKSTAT -t file $DIR/$tdir-2/f || return 4
579        rm -rf $DIR/$tdir-*
580 }
581 run_test 21h "drop open request and close reply while close and open are both in flight"
582
583 # bug 3462 - multiple MDC requests
584 test_22() {
585     f1=$DIR/${tfile}-1
586     f2=$DIR/${tfile}-2
587     
588     do_facet mds "sysctl -w lustre.fail_loc=0x80000115"
589     multiop $f2 Oc &
590     close_pid=$!
591
592     sleep 1
593     multiop $f1 msu || return 1
594
595      cancel_lru_locks MDC  # force the close
596     do_facet mds "sysctl -w lustre.fail_loc=0"
597
598     wait $close_pid || return 2
599     rm -rf $f2 || return 4
600 }
601 run_test 22 "drop close request and do mknod"
602
603 test_23() { #b=4561
604     multiop $DIR/$tfile O_c &
605     pid=$!
606     # give a chance for open
607     sleep 5
608
609     # try the close
610     drop_request "kill -USR1 $pid"
611
612     fail mds
613     wait $pid || return 1
614     return 0
615 }
616 #run_test 23 "client hang when close a file after mds crash"
617
618
619 $CLEANUP