Whamcloud - gitweb
b=17477
[fs/lustre-release.git] / lustre / tests / replay-dual.sh
1 #!/bin/bash
2
3 set -e
4
5 # bug number:  13129 13129 10124 
6 ALWAYS_EXCEPT="2     3     15c   $REPLAY_DUAL_EXCEPT"
7
8 SAVE_PWD=$PWD
9 PTLDEBUG=${PTLDEBUG:--1}
10 LUSTRE=${LUSTRE:-$(cd $(dirname $0)/..; echo $PWD)}
11 SETUP=${SETUP:-""}
12 CLEANUP=${CLEANUP:-""}
13 MOUNT_2=${MOUNT_2:-"yes"}
14 . $LUSTRE/tests/test-framework.sh
15
16 if [ "$FAILURE_MODE" = "HARD" ] && mixed_ost_devs; then
17     CONFIG_EXCEPTIONS="17"
18     echo -n "Several ost services on one ost node are used with FAILURE_MODE=$FAILURE_MODE. "
19     echo "Except the tests: $CONFIG_EXCEPTIONS"
20     ALWAYS_EXCEPT="$ALWAYS_EXCEPT $CONFIG_EXCEPTIONS"
21 fi
22
23 init_test_env $@
24
25 . ${CONFIG:=$LUSTRE/tests/cfg/$NAME.sh}
26
27 remote_mds_nodsh && skip "remote MDS with nodsh" && exit 0
28
29 [ "$SLOW" = "no" ] && EXCEPT_SLOW="1 2 3 4 5 14"
30
31 build_test_filter
32
33 check_and_setup_lustre
34 MOUNTED=$(mounted_lustre_filesystems)
35 if ! $(echo $MOUNTED | grep -w -q $MOUNT2); then
36     zconf_mount $HOSTNAME $MOUNT2
37     MOUNTED2=yes
38 fi
39
40 assert_DIR
41 rm -rf $DIR/[df][0-9]*
42
43 [ "$DAEMONFILE" ] && $LCTL debug_daemon start $DAEMONFILE $DAEMONSIZE
44
45 test_1() {
46     touch $MOUNT1/a
47     replay_barrier $SINGLEMDS
48     touch $MOUNT2/b
49
50     fail $SINGLEMDS
51     checkstat $MOUNT2/a || return 1
52     checkstat $MOUNT1/b || return 2
53     rm $MOUNT2/a $MOUNT1/b
54     checkstat $MOUNT1/a && return 3
55     checkstat $MOUNT2/b && return 4
56     return 0
57 }
58
59 run_test 1 "|X| simple create"
60
61
62 test_2() {
63     replay_barrier $SINGLEMDS
64     mkdir $MOUNT1/adir
65
66     fail $SINGLEMDS
67     checkstat $MOUNT2/adir || return 1
68     rmdir $MOUNT2/adir
69     checkstat $MOUNT2/adir && return 2
70     return 0
71 }
72 run_test 2 "|X| mkdir adir"
73
74 test_3() {
75     replay_barrier $SINGLEMDS
76     mkdir $MOUNT1/adir
77     mkdir $MOUNT2/adir/bdir
78
79     fail $SINGLEMDS
80     checkstat $MOUNT2/adir      || return 1
81     checkstat $MOUNT1/adir/bdir || return 2
82     rmdir $MOUNT2/adir/bdir $MOUNT1/adir
83     checkstat $MOUNT1/adir      && return 3
84     checkstat $MOUNT2/adir/bdir && return 4
85     return 0
86 }
87 run_test 3 "|X| mkdir adir, mkdir adir/bdir "
88
89 test_4() {
90     mkdir $MOUNT1/adir
91     replay_barrier $SINGLEMDS
92     mkdir $MOUNT1/adir  && return 1
93     mkdir $MOUNT2/adir/bdir
94
95     fail $SINGLEMDS
96     checkstat $MOUNT2/adir      || return 2
97     checkstat $MOUNT1/adir/bdir || return 3
98
99     rmdir $MOUNT2/adir/bdir $MOUNT1/adir
100     checkstat $MOUNT1/adir      && return 4
101     checkstat $MOUNT2/adir/bdir && return 5
102     return 0
103 }
104 run_test 4 "|X| mkdir adir (-EEXIST), mkdir adir/bdir "
105
106
107 test_5() {
108     # multiclient version of replay_single.sh/test_8
109     mcreate $MOUNT1/a
110     multiop_bg_pause $MOUNT2/a o_tSc || return  1
111     pid=$!
112     rm -f $MOUNT1/a
113     replay_barrier $SINGLEMDS
114     kill -USR1 $pid
115     wait $pid || return 1
116
117     fail $SINGLEMDS
118     [ -e $MOUNT2/a ] && return 2
119     return 0
120 }
121 run_test 5 "open, unlink |X| close"
122
123
124 test_6() {
125     mcreate $MOUNT1/a
126     multiop_bg_pause $MOUNT2/a o_c || return 1
127     pid1=$!
128     multiop_bg_pause $MOUNT1/a o_c || return 1
129     pid2=$!
130     rm -f $MOUNT1/a
131     replay_barrier $SINGLEMDS
132     kill -USR1 $pid1
133     wait $pid1 || return 1
134
135     fail $SINGLEMDS
136     kill -USR1 $pid2
137     wait $pid2 || return 1
138     [ -e $MOUNT2/a ] && return 2
139     return 0
140 }
141 run_test 6 "open1, open2, unlink |X| close1 [fail $SINGLEMDS] close2"
142
143 test_8() {
144     replay_barrier $SINGLEMDS
145     drop_reint_reply "mcreate $MOUNT1/$tfile"    || return 1
146     fail $SINGLEMDS
147     checkstat $MOUNT2/$tfile || return 2
148     rm $MOUNT1/$tfile || return 3
149
150     return 0
151 }
152 run_test 8 "replay of resent request"
153
154 test_9() {
155     replay_barrier $SINGLEMDS
156     mcreate $MOUNT1/$tfile-1
157     mcreate $MOUNT2/$tfile-2
158     # drop first reint reply
159     do_facet $SINGLEMDS lctl set_param fail_loc=0x80000119
160     fail $SINGLEMDS
161     do_facet $SINGLEMDS lctl set_param fail_loc=0
162
163     rm $MOUNT1/$tfile-[1,2] || return 1
164
165     return 0
166 }
167 run_test 9 "resending a replayed create"
168
169 test_10() {
170     mcreate $MOUNT1/$tfile-1
171     replay_barrier $SINGLEMDS
172     munlink $MOUNT1/$tfile-1
173     mcreate $MOUNT2/$tfile-2
174     # drop first reint reply
175     do_facet $SINGLEMDS lctl set_param fail_loc=0x80000119
176     fail $SINGLEMDS
177     do_facet $SINGLEMDS lctl set_param fail_loc=0
178
179     checkstat $MOUNT1/$tfile-1 && return 1
180     checkstat $MOUNT1/$tfile-2 || return 2
181     rm $MOUNT1/$tfile-2
182
183     return 0
184 }
185 run_test 10 "resending a replayed unlink"
186
187 test_11() {
188     replay_barrier $SINGLEMDS
189     mcreate $MOUNT1/$tfile-1
190     mcreate $MOUNT2/$tfile-2
191     mcreate $MOUNT1/$tfile-3
192     mcreate $MOUNT2/$tfile-4
193     mcreate $MOUNT1/$tfile-5
194     # drop all reint replies for a while
195     do_facet $SINGLEMDS lctl set_param fail_loc=0x0119
196     # note that with this fail_loc set, facet_failover df will fail
197     facet_failover $SINGLEMDS
198     #sleep for while, let both clients reconnect and timeout
199     sleep $((TIMEOUT * 2))
200     do_facet $SINGLEMDS lctl set_param fail_loc=0
201
202     rm $MOUNT1/$tfile-[1-5] || return 1
203
204     return 0
205 }
206 run_test 11 "both clients timeout during replay"
207
208 test_12() {
209     replay_barrier $SINGLEMDS
210
211     multiop_bg_pause $DIR/$tfile mo_c || return 1
212     MULTIPID=$!
213
214 #define OBD_FAIL_LDLM_ENQUEUE            0x302
215     do_facet $SINGLEMDS lctl set_param fail_loc=0x80000302
216     facet_failover $SINGLEMDS
217     do_facet $SINGLEMDS lctl set_param fail_loc=0
218     df $MOUNT || return 1
219
220     ls $DIR/$tfile
221     kill -USR1 $MULTIPID || return 3
222     wait $MULTIPID || return 4
223     $CHECKSTAT -t file $DIR/$tfile || return 2
224     rm $DIR/$tfile
225
226     return 0
227 }
228 run_test 12 "open resend timeout"
229
230 test_13() {
231     multiop_bg_pause $DIR/$tfile mo_c || return 1
232     MULTIPID=$!
233
234     replay_barrier $SINGLEMDS
235
236     kill -USR1 $MULTIPID || return 3
237     wait $MULTIPID || return 4
238
239     # drop close 
240     do_facet $SINGLEMDS lctl set_param fail_loc=0x80000115
241     facet_failover $SINGLEMDS
242     do_facet $SINGLEMDS lctl set_param fail_loc=0
243     df $MOUNT || return 1
244
245     ls $DIR/$tfile
246     $CHECKSTAT -t file $DIR/$tfile || return 2
247     rm $DIR/$tfile
248
249     return 0
250 }
251 run_test 13 "close resend timeout"
252
253 test_14() {
254     replay_barrier $SINGLEMDS
255     createmany -o $MOUNT1/$tfile- 25
256     createmany -o $MOUNT2/$tfile-2- 1
257     createmany -o $MOUNT1/$tfile-3- 25
258     umount $MOUNT2
259
260     facet_failover $SINGLEMDS
261     # expect failover to fail due to missing client 2
262     df $MOUNT && return 1
263     sleep 1
264
265     # first 25 files should have been replayed 
266     unlinkmany $MOUNT1/$tfile- 25 || return 2
267
268     zconf_mount `hostname` $MOUNT2 || error "mount $MOUNT2 fail" 
269     return 0
270 }
271 run_test 14 "timeouts waiting for lost client during replay"
272
273 test_15a() {    # was test_15
274     replay_barrier $SINGLEMDS
275     createmany -o $MOUNT1/$tfile- 25
276     createmany -o $MOUNT2/$tfile-2- 1
277     umount $MOUNT2
278
279     facet_failover $SINGLEMDS
280     df $MOUNT || return 1
281
282     unlinkmany $MOUNT1/$tfile- 25 || return 2
283     [ -e $MOUNT1/$tfile-2-0 ] && error "$tfile-2-0 exists"
284
285     zconf_mount `hostname` $MOUNT2 || error "mount $MOUNT2 fail"
286     return 0
287 }
288 run_test 15a "timeout waiting for lost client during replay, 1 client completes"
289
290 test_15c() {
291     replay_barrier $SINGLEMDS
292     for ((i = 0; i < 2000; i++)); do
293         echo "data" > "$MOUNT2/${tfile}-$i" || error "create ${tfile}-$i failed"
294     done
295     
296     umount $MOUNT2
297     facet_failover $SINGLEMDS
298
299     df $MOUNT || return 1
300     
301     zconf_mount `hostname` $MOUNT2 || error "mount $MOUNT2 fail"
302     return 0
303 }
304 run_test 15c "remove multiple OST orphans"
305
306 test_16() {
307     replay_barrier $SINGLEMDS
308     createmany -o $MOUNT1/$tfile- 25
309     createmany -o $MOUNT2/$tfile-2- 1
310     umount $MOUNT2
311
312     facet_failover $SINGLEMDS
313     sleep $TIMEOUT
314     facet_failover $SINGLEMDS
315     df $MOUNT || return 1
316
317     unlinkmany $MOUNT1/$tfile- 25 || return 2
318
319     zconf_mount `hostname` $MOUNT2 || error "mount $MOUNT2 fail"
320     return 0
321
322 }
323 run_test 16 "fail MDS during recovery (3571)"
324
325 test_17() {
326     remote_ost_nodsh && skip "remote OST with nodsh" && return 0
327
328     createmany -o $MOUNT1/$tfile- 25
329     createmany -o $MOUNT2/$tfile-2- 1
330
331     # Make sure the disconnect is lost
332     replay_barrier ost1
333     umount $MOUNT2
334
335     facet_failover ost1
336     sleep $TIMEOUT
337     facet_failover ost1
338     df $MOUNT || return 1
339
340     unlinkmany $MOUNT1/$tfile- 25 || return 2
341
342     zconf_mount `hostname` $MOUNT2 || error "mount $MOUNT2 fail"
343     return 0
344
345 }
346 run_test 17 "fail OST during recovery (3571)"
347
348 # cleanup with blocked enqueue fails until timer elapses (MDS busy), wait for it
349 export NOW=0
350
351 test_18() { # bug 3822 - evicting client with enqueued lock
352     #set -vx
353     mkdir -p $MOUNT1/$tdir
354     touch $MOUNT1/$tdir/f0
355 #define OBD_FAIL_LDLM_ENQUEUE_BLOCKED    0x30b
356     statmany -s $MOUNT1/$tdir/f 1 500 &
357     OPENPID=$!
358     NOW=`date +%s`
359     do_facet $SINGLEMDS lctl set_param fail_loc=0x8000030b  # hold enqueue
360     sleep 1
361 #define OBD_FAIL_LDLM_BL_CALLBACK        0x305
362     do_facet client lctl set_param fail_loc=0x80000305  # drop cb, evict
363     cancel_lru_locks mdc
364     usleep 500 # wait to ensure first client is one that will be evicted
365     openfile -f O_RDONLY $MOUNT2/$tdir/f0
366     wait $OPENPID
367     dmesg | grep "entering recovery in server" && \
368         error "client not evicted" || true
369     do_facet client "lctl set_param fail_loc=0"
370     do_facet $SINGLEMDS "lctl set_param fail_loc=0"
371 }
372 run_test 18 "ldlm_handle_enqueue succeeds on evicted export (3822)"
373
374 test_19() { # Bug 10991 - resend of open request does not fail assertion.
375     replay_barrier $SINGLEMDS
376     drop_ldlm_reply "createmany -o $DIR/$tfile 1" || return 1
377     fail $SINGLEMDS
378     checkstat $DIR2/${tfile}0 || return 2
379     rm $DIR/${tfile}0 || return 3
380
381     return 0
382 }
383 run_test 19 "resend of open request"
384
385 test_20() { #16389
386     BEFORE=`date +%s`
387     replay_barrier $SINGLEMDS
388     touch $MOUNT1/a
389     touch $MOUNT2/b
390     umount $MOUNT2
391     facet_failover $SINGLEMDS
392     df $MOUNT1 || return 1
393     rm $MOUNT1/a
394     zconf_mount `hostname` $MOUNT2 || error "mount $MOUNT2 fail"
395     TIER1=$((`date +%s` - BEFORE))
396     BEFORE=`date +%s`
397     replay_barrier $SINGLEMDS
398     touch $MOUNT1/a
399     touch $MOUNT2/b
400     umount $MOUNT2
401     facet_failover $SINGLEMDS
402     df $MOUNT1 || return 1
403     rm $MOUNT1/a
404     zconf_mount `hostname` $MOUNT2 || error "mount $MOUNT2 fail"
405     TIER2=$((`date +%s` - BEFORE))
406     [ $TIER2 -ge $((TIER1 * 2)) ] && \
407         error "recovery time is growing $TIER2 > $TIER1"
408     return 0
409 }
410 run_test 20 "recovery time is not increasing"
411
412 # commit on sharing tests
413 test_21a() {
414     local param_file=$TMP/$tfile-params
415
416     save_lustre_params $(facet_active_host $SINGLEMDS) "mdt.*.commit_on_sharing" > $param_file
417     do_facet $SINGLEMDS lctl set_param mdt.*.commit_on_sharing=1
418     touch  $MOUNT1/$tfile-1
419     mv  $MOUNT2/$tfile-1 $MOUNT2/$tfile-2
420     mv  $MOUNT1/$tfile-2 $MOUNT1/$tfile-3
421     replay_barrier_nosync $SINGLEMDS
422     umount $MOUNT2
423
424     facet_failover $SINGLEMDS
425
426     # all renames are replayed
427     unlink  $MOUNT1/$tfile-3 || return 2
428
429     zconf_mount `hostname` $MOUNT2 || error "mount $MOUNT2 fail"
430
431     do_facet $SINGLEMDS lctl set_param mdt.*.commit_on_sharing=0
432     rm -rf $MOUNT1/$tfile-*
433     restore_lustre_params < $param_file
434     rm -f $param_file
435     return 0
436 }
437 run_test 21a "commit on sharing"
438
439 shutdown_client() {
440     local client=$1
441     local mnt=$2
442
443     if [ "$FAILURE_MODE" = HARD ]; then
444        $POWER_DOWN $client
445        while ping -w 3 -c 1 $client > /dev/null 2>&1; do
446            echo "waiting for node $client to fail"
447            sleep 1
448        done
449     else
450        zconf_umount_clients $client $mnt -f
451     fi
452 }
453
454 # CMD: determine mds index where directory inode presents 
455 get_mds_dir () {
456     local dir=$1
457     local file=$dir/$tfile
458
459     rm -f $file
460     local iused=$(lfs df -i $dir | grep MDT | awk '{print $3}')
461     local oldused=($iused)
462
463     touch $file
464     sleep 1
465     iused=$(lfs df -i $dir | grep MDT | awk '{print $3}')
466     local newused=($iused)
467
468     local num=0
469     for ((i=0; i<${#newused[@]}; i++)); do
470          if [ ${oldused[$i]} -lt ${newused[$i]} ];  then
471              echo $(( i + 1 ))
472              rm -f $dir/$tfile
473              return 0
474          fi 
475     done
476     error "mdt-s : inodes count OLD ${oldused[@]} NEW ${newused[@]}"
477 }
478
479 test_21b_sub () {
480     local mds=$1 
481     do_node $CLIENT1 rm -f $MOUNT1/$tfile-*
482
483     do_facet $mds sync
484     do_node $CLIENT1 touch  $MOUNT1/$tfile-1
485     do_node $CLIENT2 mv  $MOUNT1/$tfile-1 $MOUNT1/$tfile-2
486     do_node $CLIENT1 mv  $MOUNT1/$tfile-2 $MOUNT1/$tfile-3
487
488     replay_barrier_nosync $mds
489     shutdown_client $CLIENT2 $MOUNT1
490
491     facet_failover $mds
492
493     # were renames replayed?
494     local rc=0
495     echo UNLINK $MOUNT1/$tfile-3 
496     do_node $CLIENT1 unlink  $MOUNT1/$tfile-3 || \
497         { echo "unlink $tfile-3 fail!" && rc=1; }
498
499     boot_node $CLIENT2
500     zconf_mount_clients $CLIENT2 $MOUNT1 || error "mount $CLIENT2 $MOUNT1 fail" 
501
502     return $rc
503 }
504
505 test_21b() {
506     [ -z "$CLIENTS" ] && skip "Need two or more clients." && return
507     [ $CLIENTCOUNT -lt 2 ] && \
508         { skip "Need two or more clients, have $CLIENTCOUNT" && return; }
509
510     if [ "$FAILURE_MODE" = "HARD" ] &&  mixed_mdt_devs; then
511         skip "Several mdt services on one mds node are used with FAILURE_MODE=$FAILURE_MODE. "
512         return 0
513     fi
514
515
516     zconf_umount_clients $CLIENTS $MOUNT2
517     zconf_mount_clients $CLIENTS $MOUNT1
518
519     local param_file=$TMP/$tfile-params
520
521     local num=$(get_mds_dir $MOUNT1)
522
523     save_lustre_params $(facet_active_host mds$num) "mdt.*.commit_on_sharing" > $param_file
524
525     # COS enabled
526     local COS=1
527     do_facet mds$num lctl set_param mdt.*.commit_on_sharing=$COS
528
529     test_21b_sub mds$num || error "Not all renames are replayed. COS=$COS"
530
531     # COS disabled (should fail)
532     COS=0
533     do_facet mds$num lctl set_param mdt.*.commit_on_sharing=$COS
534
535     test_21b_sub mds$num && error "Not all renames are replayed. COS=$COS" 
536
537     restore_lustre_params < $param_file
538     rm -f $param_file
539     return 0
540 }
541 run_test 21b "commit on sharing, two clients"
542
543 # end commit on sharing tests 
544
545 equals_msg `basename $0`: test complete, cleaning up
546 SLEEP=$((`date +%s` - $NOW))
547 [ $SLEEP -lt $TIMEOUT ] && sleep $SLEEP
548 [ "$MOUNTED2" = yes ] && zconf_umount $HOSTNAME $MOUNT2 || true
549 check_and_cleanup_lustre
550 [ -f "$TESTSUITELOG" ] && cat $TESTSUITELOG || true
551