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