Whamcloud - gitweb
land 0.5.20.3 b_devel onto HEAD (b_devel will remain)
[fs/lustre-release.git] / lustre / tests / recovery-cleanup.sh
1 #!/bin/sh
2
3 set -ex
4
5 LUSTRE=${LUSTRE:-`dirname $0`/..}
6 PATH=$PATH:$LUSTRE/utils:$LUSTRE/tests
7
8 . $LUSTRE/../ltest/functional/llite/common/common.sh
9
10 PDSH='pdsh -S -w'
11
12 # XXX I wish all this stuff was in some default-config.sh somewhere
13 MDSNODE=${MDSNODE:-mdev6}
14 OSTNODE=${OSTNODE:-mdev7}
15 CLIENT=${CLIENTNODE:-mdev8}
16 NETWORKTYPE=${NETWORKTYPE:-tcp}
17 MOUNTPT=${MOUNTPT:-/mnt/lustre}
18 CONFIG=recovery-small.xml
19 MDSDEV=/tmp/mds
20 OSTDEV=/tmp/ost
21 MDSSIZE=100000
22 OSTSIZE=100000
23
24 do_mds() {
25     $PDSH $MDSNODE "PATH=\$PATH:$LUSTRE/utils:$LUSTRE/tests; cd $PWD; $@"
26 }
27
28 do_client() {
29     $PDSH $CLIENT "PATH=\$PATH:$LUSTRE/utils:$LUSTRE/tests; cd $PWD; $@"
30 }
31
32 do_ost() {
33     $PDSH $OSTNODE "PATH=\$PATH:$LUSTRE/utils:$LUSTRE/tests; cd $PWD; $@"
34 }
35
36 drop_request() {
37     do_mds "echo 0x121 > /proc/sys/lustre/fail_loc"
38     do_client "$1 & sleep ${TIMEOUT:-5}; sleep 2; kill \$!"
39     do_mds "echo 0 > /proc/sys/lustre/fail_loc"
40 }
41
42 make_config() {
43     rm -f $CONFIG
44     for NODE in $CLIENT $MDSNODE $OSTNODE; do
45        lmc -m $CONFIG --add net --node $NODE --nid `h2$NETWORKTYPE $NODE` \
46            --nettype $NETWORKTYPE || exit 4
47     done
48     lmc -m $CONFIG --add mds --node $MDSNODE --mds mds1 --dev $MDSDEV \
49         --size $MDSSIZE || exit 5
50     lmc -m $CONFIG --add ost --node $OSTNODE --ost ost1 --dev $OSTDEV \
51         --size $OSTSIZE || exit 6
52     lmc -m $CONFIG --add mtpt --node $CLIENT --path $MOUNTPT --mds mds1 \
53         --ost ost1 || exit 7
54 }
55
56 start_mds() {
57     do_mds "lconf $@ $CONFIG"
58 }
59
60 shutdown_mds() {
61     do_mds "lconf $@ --cleanup $CONFIG"
62 }
63
64 start_ost() {
65     do_ost "lconf $@ $CONFIG"
66 }
67
68 shutdown_ost() {
69     do_ost "lconf $@ --cleanup $CONFIG"
70 }
71
72 mount_client() {
73     do_client "lconf $@ $CONFIG"
74 }
75
76 unmount_client() {
77     do_client "lconf $@ --cleanup $CONFIG"
78 }
79
80 setup() {
81     make_config
82     start_mds ${REFORMAT:---reformat}
83     start_ost ${REFORMAT:---reformat}
84     mount_client --timeout=${TIMEOUT:-5} --recovery_upcall=/bin/true
85 }
86
87 cleanup() {
88     do_mds "echo 0 > /proc/sys/lustre/fail_loc"
89     unmount_client $@ || true
90     shutdown_mds $@ || true
91     shutdown_ost $@ || true
92 }
93
94 wait_for_timeout() {
95     # wait to make sure we enter recovery
96     # it'd be better if the upcall notified us somehow, I think
97     sleep $(( ${TIMEOUT:-5} + 2 ))
98 }
99
100 try_to_cleanup() {
101     kill -INT $!
102     unmount_client --force
103     mount_client --timeout=${TIMEOUT:-5} --recovery_upcall=/bin/true
104 }
105
106 if [ ! -z "$ONLY" ]; then
107     eval "$ONLY"
108     exit $?
109 fi
110
111 setup
112 drop_request "mcreate /mnt/lustre/1" & wait_for_timeout
113 try_to_cleanup
114
115 drop_request "tchmod 111 /mnt/lustre/2" & wait_for_timeout
116 try_to_cleanup
117
118 drop_request "statone /mnt/lustre/2" & wait_for_timeout
119 try_to_cleanup
120
121 do_client "cp /etc/resolv.conf /mnt/lustre/resolv.conf"
122 drop_request "cat /mnt/lustre/resolv.conf > /dev/null" & wait_for_timeout
123 try_to_cleanup
124
125 drop_request "mv /mnt/lustre/resolv.conf /mnt/lustre/renamed" & wait_for_timeout
126 try_to_cleanup
127
128 drop_request "mlink /mnt/lustre/renamed-again /mnt/lustre/link1" & wait_for_timeout
129 try_to_cleanup
130
131 drop_request "munlink /mnt/lustre/link1" & wait_for_timeout
132 try_to_cleanup
133
134 cleanup