Whamcloud - gitweb
Land b_smallfix onto HEAD (20040512_1806)
[fs/lustre-release.git] / lustre / tests / replay-single.sh
1 #!/bin/sh
2
3 set -e
4
5 #
6 # This test needs to be run on the client
7 #
8
9 LUSTRE=${LUSTRE:-`dirname $0`/..}
10 . $LUSTRE/tests/test-framework.sh
11
12 init_test_env $@
13
14 . ${CONFIG:=$LUSTRE/tests/cfg/local.sh}
15
16 # Skip these tests
17 ALWAYS_EXCEPT=""
18
19
20 gen_config() {
21     rm -f $XMLCONFIG
22     add_mds mds --dev $MDSDEV --size $MDSSIZE
23     if [ ! -z "$mdsfailover_HOST" ]; then
24          add_mdsfailover mds --dev $MDSDEV --size $MDSSIZE
25     fi
26     
27     add_lov lov1 mds --stripe_sz $STRIPE_BYTES \
28         --stripe_cnt $STRIPES_PER_OBJ --stripe_pattern 0
29     add_ost ost --lov lov1 --dev $OSTDEV --size $OSTSIZE
30     add_ost ost2 --lov lov1 --dev ${OSTDEV}-2 --size $OSTSIZE
31     add_client client mds --lov lov1 --path $MOUNT
32 }
33
34 build_test_filter
35
36 cleanup() {
37     # make sure we are using the primary MDS, so the config log will
38     # be able to clean up properly.
39     activemds=`facet_active mds`
40     if [ $activemds != "mds" ]; then
41         fail mds
42     fi
43     zconf_umount `hostname` $MOUNT
44     stop mds ${FORCE} $MDSLCONFARGS
45     stop ost2 ${FORCE} --dump cleanup.log
46     stop ost ${FORCE} --dump cleanup.log
47 }
48
49 if [ "$ONLY" == "cleanup" ]; then
50     sysctl -w portals.debug=0 || true
51     cleanup
52     exit
53 fi
54
55 SETUP=${SETUP:-"setup"}
56 CLEANUP=${CLEANUP:-"cleanup"}
57
58 setup() {
59     gen_config
60
61     start ost --reformat $OSTLCONFARGS 
62     start ost2 --reformat $OSTLCONFARGS 
63     [ "$DAEMONFILE" ] && $LCTL debug_daemon start $DAEMONFILE $DAEMONSIZE
64     start mds $MDSLCONFARGS --reformat
65     grep " $MOUNT " /proc/mounts || zconf_mount `hostname` $MOUNT
66 }
67
68 $SETUP
69
70 if [ "$ONLY" == "setup" ]; then
71     exit 0
72 fi
73
74 mkdir -p $DIR
75
76 test_0() {
77     replay_barrier mds
78     fail mds
79 }
80 run_test 0 "empty replay"
81
82 test_0b() {
83     # this test attempts to trigger a race in the precreation code, 
84     # and must run before any other objects are created on the filesystem
85     fail ost
86     createmany -o $DIR/$tfile 20 || return 1
87     unlinkmany $DIR/$tfile 20 || return 2
88 }
89 run_test 0b "ensure object created after recover exists. (3284)"
90
91 test_1() {
92     replay_barrier mds
93     mcreate $DIR/$tfile
94     fail mds
95     $CHECKSTAT -t file $DIR/$tfile || return 1
96     rm $DIR/$tfile
97 }
98 run_test 1 "simple create"
99
100 test_2a() {
101     replay_barrier mds
102     touch $DIR/$tfile
103     fail mds
104     $CHECKSTAT -t file $DIR/$tfile || return 1
105     rm $DIR/$tfile
106 }
107 run_test 2a "touch"
108
109 test_2b() {
110     ./mcreate $DIR/$tfile
111     replay_barrier mds
112     touch $DIR/$tfile
113     fail mds
114     $CHECKSTAT -t file $DIR/$tfile || return 1
115     rm $DIR/$tfile
116 }
117 run_test 2b "touch"
118
119 test_3a() {
120     replay_barrier mds
121     mcreate $DIR/$tfile
122     o_directory $DIR/$tfile
123     fail mds
124     $CHECKSTAT -t file $DIR/$tfile || return 2
125     rm $DIR/$tfile
126 }
127 run_test 3a "replay failed open(O_DIRECTORY)"
128
129 test_3b() {
130     replay_barrier mds
131 #define OBD_FAIL_MDS_OPEN_PACK | OBD_FAIL_ONCE
132     do_facet mds "sysctl -w lustre.fail_loc=0x80000114"
133     touch $DIR/$tfile
134     do_facet mds "sysctl -w lustre.fail_loc=0"
135     fail mds
136     $CHECKSTAT -t file $DIR/$tfile && return 2
137     return 0
138 }
139 run_test 3b "replay failed open -ENOMEM"
140
141 test_3c() {
142     replay_barrier mds
143 #define OBD_FAIL_MDS_ALLOC_OBDO | OBD_FAIL_ONCE
144     do_facet mds "sysctl -w lustre.fail_loc=0x80000128"
145     touch $DIR/$tfile
146     do_facet mds "sysctl -w lustre.fail_loc=0"
147     fail mds
148
149     $CHECKSTAT -t file $DIR/$tfile && return 2
150     return 0
151 }
152 run_test 3c "replay failed open -ENOMEM"
153
154 test_4() {
155     replay_barrier mds
156     for i in `seq 10`; do
157         echo "tag-$i" > $DIR/$tfile-$i
158     done 
159     fail mds
160     for i in `seq 10`; do
161       grep -q "tag-$i" $DIR/$tfile-$i || error "$tfile-$i"
162     done 
163 }
164 run_test 4 "|x| 10 open(O_CREAT)s"
165
166 test_4b() {
167     replay_barrier mds
168     rm -rf $DIR/$tfile-*
169     fail mds
170     $CHECKSTAT -t file $DIR/$tfile-* && return 1 || true
171 }
172 run_test 4b "|x| rm 10 files"
173
174 # The idea is to get past the first block of precreated files on both 
175 # osts, and then replay.
176 test_5() {
177     replay_barrier mds
178     for i in `seq 220`; do
179         echo "tag-$i" > $DIR/$tfile-$i
180     done 
181     fail mds
182     for i in `seq 220`; do
183       grep -q "tag-$i" $DIR/$tfile-$i || error "f1c-$i"
184     done 
185     rm -rf $DIR/$tfile-*
186     sleep 3
187     # waiting for commitment of removal
188 }
189 run_test 5 "|x| 220 open(O_CREAT)"
190
191
192 test_6() {
193     replay_barrier mds
194     mkdir $DIR/$tdir
195     mcreate $DIR/$tdir/$tfile
196     fail mds
197     $CHECKSTAT -t dir $DIR/$tdir || return 1
198     $CHECKSTAT -t file $DIR/$tdir/$tfile || return 2
199     sleep 2
200     # waiting for log process thread
201 }
202 run_test 6 "mkdir + contained create"
203
204 test_6b() {
205     replay_barrier mds
206     rm -rf $DIR/$tdir
207     fail mds
208     $CHECKSTAT -t dir $DIR/$tdir && return 1 || true 
209 }
210 run_test 6b "|X| rmdir"
211
212 test_7() {
213     mkdir $DIR/$tdir
214     replay_barrier mds
215     mcreate $DIR/$tdir/$tfile
216     fail mds
217     $CHECKSTAT -t dir $DIR/$tdir || return 1
218     $CHECKSTAT -t file $DIR/$tdir/$tfile || return 2
219     rm -fr $DIR/$tdir
220 }
221 run_test 7 "mkdir |X| contained create"
222
223 test_8() {
224     replay_barrier mds
225     multiop $DIR/$tfile mo_c &
226     MULTIPID=$!
227     sleep 1
228     fail mds
229     ls $DIR/$tfile
230     $CHECKSTAT -t file $DIR/$tfile || return 1
231     kill -USR1 $MULTIPID || return 2
232     wait $MULTIPID || return 3
233     rm $DIR/$tfile
234 }
235 run_test 8 "creat open |X| close"
236
237 test_9() {
238     replay_barrier mds
239     mcreate $DIR/$tfile
240     local old_inum=`ls -i $DIR/$tfile | awk '{print $1}'`
241     fail mds
242     local new_inum=`ls -i $DIR/$tfile | awk '{print $1}'`
243
244     echo " old_inum == $old_inum, new_inum == $new_inum"
245     if [ $old_inum -eq $new_inum  ] ;
246     then
247         echo " old_inum and new_inum match"
248     else
249         echo "!!!! old_inum and new_inum NOT match"
250         return 1
251     fi
252     rm $DIR/$tfile
253 }
254 run_test 9  "|X| create (same inum/gen)"
255
256 test_10() {
257     mcreate $DIR/$tfile
258     replay_barrier mds
259     mv $DIR/$tfile $DIR/$tfile-2
260     rm -f $DIR/$tfile
261     fail mds
262     $CHECKSTAT $DIR/$tfile && return 1
263     $CHECKSTAT $DIR/$tfile-2 ||return 2
264     rm $DIR/$tfile-2
265     return 0
266 }
267 run_test 10 "create |X| rename unlink"
268
269 test_11() {
270     mcreate $DIR/$tfile
271     echo "old" > $DIR/$tfile
272     mv $DIR/$tfile $DIR/$tfile-2
273     replay_barrier mds
274     echo "new" > $DIR/$tfile
275     grep new $DIR/$tfile 
276     grep old $DIR/$tfile-2
277     fail mds
278     grep new $DIR/$tfile || return 1
279     grep old $DIR/$tfile-2 || return 2
280 }
281 run_test 11 "create open write rename |X| create-old-name read"
282
283 test_12() {
284     mcreate $DIR/$tfile 
285     multiop $DIR/$tfile o_tSc &
286     pid=$!
287     # give multiop a chance to open
288     sleep 1
289     rm -f $DIR/$tfile
290     replay_barrier mds
291     kill -USR1 $pid
292     wait $pid || return 1
293
294     fail mds
295     [ -e $DIR/$tfile ] && return 2
296     return 0
297 }
298 run_test 12 "open, unlink |X| close"
299
300
301 # 1777 - replay open after committed chmod that would make
302 #        a regular open a failure    
303 test_13() {
304     mcreate $DIR/$tfile 
305     multiop $DIR/$tfile O_wc &
306     pid=$!
307     # give multiop a chance to open
308     sleep 1 
309     chmod 0 $DIR/$tfile
310     $CHECKSTAT -p 0 $DIR/$tfile
311     replay_barrier mds
312     fail mds
313     kill -USR1 $pid
314     wait $pid || return 1
315
316     $CHECKSTAT -s 1 -p 0 $DIR/$tfile || return 2
317     return 0
318 }
319 run_test 13 "open chmod 0 |x| write close"
320
321 test_14() {
322     multiop $DIR/$tfile O_tSc &
323     pid=$!
324     # give multiop a chance to open
325     sleep 1 
326     rm -f $DIR/$tfile
327     replay_barrier mds
328     kill -USR1 $pid || return 1
329     wait $pid || return 2
330
331     fail mds
332     [ -e $DIR/$tfile ] && return 3
333     return 0
334 }
335 run_test 14 "open(O_CREAT), unlink |X| close"
336
337 test_15() {
338     multiop $DIR/$tfile O_tSc &
339     pid=$!
340     # give multiop a chance to open
341     sleep 1 
342     rm -f $DIR/$tfile
343     replay_barrier mds
344     touch $DIR/g11 || return 1
345     kill -USR1 $pid
346     wait $pid || return 2
347
348     fail mds
349     [ -e $DIR/$tfile ] && return 3
350     touch $DIR/h11 || return 4
351     return 0
352 }
353 run_test 15 "open(O_CREAT), unlink |X|  touch new, close"
354
355
356 test_16() {
357     replay_barrier mds
358     mcreate $DIR/$tfile
359     munlink $DIR/$tfile
360     mcreate $DIR/$tfile-2
361     fail mds
362     [ -e $DIR/$tfile ] && return 1
363     [ -e $DIR/$tfile-2 ] || return 2
364     munlink $DIR/$tfile-2 || return 3
365 }
366 run_test 16 "|X| open(O_CREAT), unlink, touch new,  unlink new"
367
368 test_17() {
369     replay_barrier mds
370     multiop $DIR/$tfile O_c &
371     pid=$!
372     # give multiop a chance to open
373     sleep 1 
374     fail mds
375     kill -USR1 $pid || return 1
376     wait $pid || return 2
377     $CHECKSTAT -t file $DIR/$tfile || return 3
378     rm $DIR/$tfile
379 }
380 run_test 17 "|X| open(O_CREAT), |replay| close"
381
382 test_18() {
383     replay_barrier mds
384     multiop $DIR/$tfile O_tSc &
385     pid=$!
386     # give multiop a chance to open
387     sleep 1 
388     rm -f $DIR/$tfile
389     touch $DIR/$tfile-2 || return 1
390     echo "pid: $pid will close"
391     kill -USR1 $pid
392     wait $pid || return 2
393
394     fail mds
395     [ -e $DIR/$tfile ] && return 3
396     [ -e $DIR/$tfile-2 ] || return 4
397     # this touch frequently fails
398     touch $DIR/$tfile-3 || return 5
399     munlink $DIR/$tfile-2 || return 6
400     munlink $DIR/$tfile-3 || return 7
401     return 0
402 }
403 run_test 18 "|X| open(O_CREAT), unlink, touch new, close, touch, unlink"
404
405 # bug 1855 (a simpler form of test_11 above)
406 test_19() {
407     replay_barrier mds
408     mcreate $DIR/$tfile
409     echo "old" > $DIR/$tfile
410     mv $DIR/$tfile $DIR/$tfile-2
411     grep old $DIR/$tfile-2
412     fail mds
413     grep old $DIR/$tfile-2 || return 2
414 }
415 run_test 19 "|X| mcreate, open, write, rename "
416
417 test_20() {
418     replay_barrier mds
419     multiop $DIR/$tfile O_tSc &
420     pid=$!
421     # give multiop a chance to open
422     sleep 1 
423     rm -f $DIR/$tfile
424
425     fail mds
426     kill -USR1 $pid
427     wait $pid || return 1
428     [ -e $DIR/$tfile ] && return 2
429     return 0
430 }
431 run_test 20 "|X| open(O_CREAT), unlink, replay, close (test mds_cleanup_orphans)"
432
433 test_21() {
434     replay_barrier mds
435     multiop $DIR/$tfile O_tSc &
436     pid=$!
437     # give multiop a chance to open
438     sleep 1 
439     rm -f $DIR/$tfile
440     touch $DIR/g11 || return 1
441
442     fail mds
443     kill -USR1 $pid
444     wait $pid || return 2
445     [ -e $DIR/$tfile ] && return 3
446     touch $DIR/h11 || return 4
447     return 0
448 }
449 run_test 21 "|X| open(O_CREAT), unlink touch new, replay, close (test mds_cleanup_orphans)"
450
451 test_22() {
452     multiop $DIR/$tfile O_tSc &
453     pid=$!
454     # give multiop a chance to open
455     sleep 1 
456
457     replay_barrier mds
458     rm -f $DIR/$tfile
459
460     fail mds
461     kill -USR1 $pid
462     wait $pid || return 1
463     [ -e $DIR/$tfile ] && return 2
464     return 0
465 }
466 run_test 22 "open(O_CREAT), |X| unlink, replay, close (test mds_cleanup_orphans)"
467
468 test_23() {
469     multiop $DIR/$tfile O_tSc &
470     pid=$!
471     # give multiop a chance to open
472     sleep 1 
473
474     replay_barrier mds
475     rm -f $DIR/$tfile
476     touch $DIR/g11 || return 1
477
478     fail mds
479     kill -USR1 $pid
480     wait $pid || return 2
481     [ -e $DIR/$tfile ] && return 3
482     touch $DIR/h11 || return 4
483     return 0
484 }
485 run_test 23 "open(O_CREAT), |X| unlink touch new, replay, close (test mds_cleanup_orphans)"
486
487 test_24() {
488     multiop $DIR/$tfile O_tSc &
489     pid=$!
490     # give multiop a chance to open
491     sleep 1 
492
493     replay_barrier mds
494     fail mds
495     rm -f $DIR/$tfile
496     kill -USR1 $pid
497     wait $pid || return 1
498     [ -e $DIR/$tfile ] && return 2
499     return 0
500 }
501 run_test 24 "open(O_CREAT), replay, unlink, close (test mds_cleanup_orphans)"
502
503 test_25() {
504     multiop $DIR/$tfile O_tSc &
505     pid=$!
506     # give multiop a chance to open
507     sleep 1 
508     rm -f $DIR/$tfile
509
510     replay_barrier mds
511     fail mds
512     kill -USR1 $pid
513     wait $pid || return 1
514     [ -e $DIR/$tfile ] && return 2
515     return 0
516 }
517 run_test 25 "open(O_CREAT), unlink, replay, close (test mds_cleanup_orphans)"
518
519 test_26() {
520     replay_barrier mds
521     multiop $DIR/$tfile-1 O_tSc &
522     pid1=$!
523     multiop $DIR/$tfile-2 O_tSc &
524     pid2=$!
525     # give multiop a chance to open
526     sleep 1 
527     rm -f $DIR/$tfile-1
528     rm -f $DIR/$tfile-2
529     kill -USR1 $pid2
530     wait $pid2 || return 1
531
532     fail mds
533     kill -USR1 $pid1
534     wait $pid1 || return 2
535     [ -e $DIR/$tfile-1 ] && return 3
536     [ -e $DIR/$tfile-2 ] && return 4
537     return 0
538 }
539 run_test 26 "|X| open(O_CREAT), unlink two, close one, replay, close one (test mds_cleanup_orphans)"
540
541 test_27() {
542     replay_barrier mds
543     multiop $DIR/$tfile-1 O_tSc &
544     pid1=$!
545     multiop $DIR/$tfile-2 O_tSc &
546     pid2=$!
547     # give multiop a chance to open
548     sleep 1 
549     rm -f $DIR/$tfile-1
550     rm -f $DIR/$tfile-2
551
552     fail mds
553     kill -USR1 $pid1
554     wait $pid1 || return 1
555     kill -USR1 $pid2
556     wait $pid2 || return 2
557     [ -e $DIR/$tfile-1 ] && return 3
558     [ -e $DIR/$tfile-2 ] && return 4
559     return 0
560 }
561 run_test 27 "|X| open(O_CREAT), unlink two, replay, close two (test mds_cleanup_orphans)"
562
563 test_28() {
564     multiop $DIR/$tfile-1 O_tSc &
565     pid1=$!
566     multiop $DIR/$tfile-2 O_tSc &
567     pid2=$!
568     # give multiop a chance to open
569     sleep 1 
570     replay_barrier mds
571     rm -f $DIR/$tfile-1
572     rm -f $DIR/$tfile-2
573     kill -USR1 $pid2
574     wait $pid2 || return 1
575
576     fail mds
577     kill -USR1 $pid1
578     wait $pid1 || return 2
579     [ -e $DIR/$tfile-1 ] && return 3
580     [ -e $DIR/$tfile-2 ] && return 4
581     return 0
582 }
583 run_test 28 "open(O_CREAT), |X| unlink two, close one, replay, close one (test mds_cleanup_orphans)"
584
585 test_29() {
586     multiop $DIR/$tfile-1 O_tSc &
587     pid1=$!
588     multiop $DIR/$tfile-2 O_tSc &
589     pid2=$!
590     # give multiop a chance to open
591     sleep 1 
592     replay_barrier mds
593     rm -f $DIR/$tfile-1
594     rm -f $DIR/$tfile-2
595
596     fail mds
597     kill -USR1 $pid1
598     wait $pid1 || return 1
599     kill -USR1 $pid2
600     wait $pid2 || return 2
601     [ -e $DIR/$tfile-1 ] && return 3
602     [ -e $DIR/$tfile-2 ] && return 4
603     return 0
604 }
605 run_test 29 "open(O_CREAT), |X| unlink two, replay, close two (test mds_cleanup_orphans)"
606
607 test_30() {
608     multiop $DIR/$tfile-1 O_tSc &
609     pid1=$!
610     multiop $DIR/$tfile-2 O_tSc &
611     pid2=$!
612     # give multiop a chance to open
613     sleep 1 
614     rm -f $DIR/$tfile-1
615     rm -f $DIR/$tfile-2
616
617     replay_barrier mds
618     fail mds
619     kill -USR1 $pid1
620     wait $pid1 || return 1
621     kill -USR1 $pid2
622     wait $pid2 || return 2
623     [ -e $DIR/$tfile-1 ] && return 3
624     [ -e $DIR/$tfile-2 ] && return 4
625     return 0
626 }
627 run_test 30 "open(O_CREAT) two, unlink two, replay, close two (test mds_cleanup_orphans)"
628
629 test_31() {
630     multiop $DIR/$tfile-1 O_tSc &
631     pid1=$!
632     multiop $DIR/$tfile-2 O_tSc &
633     pid2=$!
634     # give multiop a chance to open
635     sleep 1 
636     rm -f $DIR/$tfile-1
637
638     replay_barrier mds
639     rm -f $DIR/$tfile-2
640     fail mds
641     kill -USR1 $pid1
642     wait $pid1 || return 1
643     kill -USR1 $pid2
644     wait $pid2 || return 2
645     [ -e $DIR/$tfile-1 ] && return 3
646     [ -e $DIR/$tfile-2 ] && return 4
647     return 0
648 }
649 run_test 31 "open(O_CREAT) two, unlink one, |X| unlink one, close two (test mds_cleanup_orphans)"
650
651 # tests for bug 2104; completion without crashing is success.  The close is
652 # stale, but we always return 0 for close, so the app never sees it.
653 test_32() {
654     multiop $DIR/$tfile O_c &
655     pid1=$!
656     multiop $DIR/$tfile O_c &
657     pid2=$!
658     # give multiop a chance to open
659     sleep 1
660     mds_evict_client
661     df $MOUNT || df $MOUNT || return 1
662     kill -USR1 $pid1
663     kill -USR1 $pid2
664     sleep 1
665     return 0
666 }
667 run_test 32 "close() notices client eviction; close() after client eviction"
668
669 # Abort recovery before client complete
670 test_33() {
671     replay_barrier mds
672     touch $DIR/$tfile
673     fail_abort mds
674     # this file should be gone, because the replay was aborted
675     $CHECKSTAT -t file $DIR/$tfile && return 1
676     return 0
677 }
678 run_test 33 "abort recovery before client does replay"
679
680 test_34() {
681     multiop $DIR/$tfile O_c &
682     pid=$!
683     # give multiop a chance to open
684     sleep 1 
685     rm -f $DIR/$tfile
686
687     replay_barrier mds
688     fail_abort mds
689     kill -USR1 $pid
690     [ -e $DIR/$tfile ] && return 1
691     sync
692     return 0
693 }
694 run_test 34 "abort recovery before client does replay (test mds_cleanup_orphans)"
695
696 # bug 2278 - generate one orphan on OST, then destroy it during recovery from llog 
697 test_35() {
698     touch $DIR/$tfile
699
700 #define OBD_FAIL_MDS_REINT_NET_REP       0x119
701     do_facet mds "sysctl -w lustre.fail_loc=0x80000119"
702     rm -f $DIR/$tfile &
703     sleep 1
704     sync
705     sleep 1
706     # give a chance to remove from MDS
707     fail_abort mds
708     $CHECKSTAT -t file $DIR/$tfile && return 1 || true
709 }
710 run_test 35 "test recovery from llog for unlink op"
711
712 # b=2432 resent cancel after replay uses wrong cookie,
713 # so don't resend cancels
714 test_36() {
715     replay_barrier mds
716     touch $DIR/$tfile
717     checkstat $DIR/$tfile
718     facet_failover mds
719     cancel_lru_locks MDC
720     if dmesg | grep "unknown lock cookie"; then 
721         echo "cancel after replay failed"
722         return 1
723     fi
724 }
725 run_test 36 "don't resend cancel"
726
727 # b=2368
728 # directory orphans can't be unlinked from PENDING directory
729 test_37() {
730     rmdir $DIR/$tfile 2>/dev/null
731     multiop $DIR/$tfile dD_c &
732     pid=$!
733     # give multiop a chance to open
734     sleep 1 
735     rmdir $DIR/$tfile
736
737     replay_barrier mds
738     # clear the dmesg buffer so we only see errors from this recovery
739     dmesg -c >/dev/null
740     fail_abort mds
741     kill -USR1 $pid
742     dmesg | grep  "mds_unlink_orphan.*error .* unlinking orphan" && return 1
743     sync
744     return 0
745 }
746 run_test 37 "abort recovery before client does replay (test mds_cleanup_orphans for directories)"
747
748 test_38() {
749     createmany -o $DIR/$tfile-%d 800
750     unlinkmany $DIR/$tfile-%d 0 400
751     replay_barrier mds
752     fail mds
753     unlinkmany $DIR/$tfile-%d 400 400
754     sleep 2
755     $CHECKSTAT -t file $DIR/$tfile-* && return 1 || true
756 }
757 run_test 38 "test recovery from unlink llog (test llog_gen_rec) "
758
759 test_39() {
760     createmany -o $DIR/$tfile-%d 800
761     replay_barrier mds
762     unlinkmany $DIR/$tfile-%d 0 400
763     fail mds
764     unlinkmany $DIR/$tfile-%d 400 400
765     sleep 2
766     $CHECKSTAT -t file $DIR/$tfile-* && return 1 || true
767 }
768 run_test 39 "test recovery from unlink llog (test llog_gen_rec) "
769
770 count_ost_writes() {
771         cat /proc/fs/lustre/osc/*/stats |
772             awk -vwrites=0 '/ost_write/ { writes += $2 } END { print writes; }'
773 }
774
775 #b=2477,2532
776 test_40(){
777     $LCTL mark multiop $MOUNT/$tfile OS_c 
778     multiop $MOUNT/$tfile OS_c  &
779     PID=$!
780     writeme -s $MOUNT/${tfile}-2 &
781     WRITE_PID=$!
782     sleep 1
783     facet_failover mds
784 #define OBD_FAIL_MDS_CONNECT_NET         0x117
785     do_facet mds "sysctl -w lustre.fail_loc=0x80000117"
786     kill -USR1 $PID
787     stat1=`count_ost_writes`
788     sleep $TIMEOUT
789     stat2=`count_ost_writes`
790     echo "$stat1, $stat2"
791     if [ $stat1 -lt $stat2 ]; then 
792        echo "writes continuing during recovery"
793        RC=0
794     else
795        echo "writes not continuing during recovery, bug 2477"
796        RC=4
797     fi
798     echo "waiting for writeme $WRITE_PID"
799     kill $WRITE_PID
800     wait $WRITE_PID 
801
802     echo "waiting for multiop $PID"
803     wait $PID || return 2
804     do_facet client munlink $MOUNT/$tfile  || return 3
805     do_facet client munlink $MOUNT/${tfile}-2  || return 3
806     return $RC
807 }
808 run_test 40 "cause recovery in ptlrpc, ensure IO continues"
809
810
811 #b=2814
812 # make sure that a read to one osc doesn't try to double-unlock its page just
813 # because another osc is invalid.  trigger_group_io used to mistakenly return
814 # an error if any oscs were invalid even after having successfully put rpcs
815 # on valid oscs.  This was fatal if the caller was ll_readpage who unlocked
816 # the page, guarnateeing that the unlock from the RPC completion would
817 # assert on trying to unlock the unlocked page.
818 test_41() {
819     local f=$MOUNT/$tfile
820     # make sure the start of the file is ost1
821     lfs setstripe $f $((128 * 1024)) 0 0 
822     do_facet client dd if=/dev/zero of=$f bs=4k count=1 || return 3
823     cancel_lru_locks OSC
824     # fail ost2 and read from ost1
825     local osc2_dev=`$LCTL device_list | \
826                 awk '(/ost2.*client_facet/){print $4}' `
827     $LCTL --device %$osc2_dev deactivate
828     do_facet client dd if=$f of=/dev/null bs=4k count=1 || return 3
829     $LCTL --device %$osc2_dev activate
830     return 0
831 }
832 run_test 41 "read from a valid osc while other oscs are invalid"
833
834 # test MDS recovery after ost failure
835 test_42() {
836     blocks=`df $MOUNT | tail -n 1 | awk '{ print $1 }'`
837     createmany -o $DIR/$tfile-%d 800
838     replay_barrier ost
839     unlinkmany $DIR/$tfile-%d 0 400
840     facet_failover ost
841     
842     # osc is evicted, fs is smaller
843     blocks_after=`df $MOUNT | tail -n 1 | awk '{ print $1 }'`
844     [ $blocks_after -lt $blocks ] || return 1
845     echo wait for MDS to timeout and recover
846     sleep $((TIMEOUT * 2))
847     unlinkmany $DIR/$tfile-%d 400 400
848     $CHECKSTAT -t file $DIR/$tfile-* && return 2 || true
849 }
850 run_test 42 "recovery after ost failure"
851
852 # b=2530
853 # directory orphans can't be unlinked from PENDING directory
854 test_43() {
855     replay_barrier mds
856
857     # OBD_FAIL_OST_CREATE_NET 0x204
858     do_facet ost "sysctl -w lustre.fail_loc=0x80000204"
859     facet_failover mds
860     df $MOUNT || return 1
861     sleep 10
862     do_facet ost "sysctl -w lustre.fail_loc=0"
863
864     return 0
865 }
866 run_test 43 "mds osc import failure during recovery; don't LBUG"
867
868 test_44() {
869     mdcdev=`awk '/mds_svc_MNT/ {print $1}' < /proc/fs/lustre/devices`
870     do_facet mds "sysctl -w lustre.fail_loc=0x80000701"
871     $LCTL --device $mdcdev recover
872     df $MOUNT
873     do_facet mds "sysctl -w lustre.fail_loc=0"
874     return 0
875 }
876 run_test 44 "race in target handle connect"
877
878 # Handle failed close
879 test_45() {
880     mdcdev=`awk '/mds_svc_MNT/ {print $1}' < /proc/fs/lustre/devices`
881     $LCTL --device $mdcdev recover
882
883     multiop $DIR/$tfile O_c &
884     pid=$!
885     sleep 1
886
887     # This will cause the CLOSE to fail before even 
888     # allocating a reply buffer
889     $LCTL --device $mdcdev deactivate
890
891     # try the close
892     kill -USR1 $pid
893     wait $pid || return 1
894
895     $LCTL --device $mdcdev activate
896
897     $CHECKSTAT -t file $DIR/$tfile || return 2
898     return 0
899 }
900 run_test 45 "Handle failed close"
901
902 test_46() {
903     dmesg -c >/dev/null
904     drop_reply "touch $DIR/$tfile"
905     fail mds
906     # ironically, the previous test, 45, will cause a real forced close,
907     # so just look for one for this test
908     dmesg | grep -i "force closing client file handle for $tfile" && return 1
909     return 0
910 }
911 run_test 46 "Don't leak file handle after open resend (3325)"
912
913 equals_msg test complete, cleaning up
914 $CLEANUP
915