Whamcloud - gitweb
Merge from HEAD to b1_2 select fixes for 1.2.2
[fs/lustre-release.git] / lustre / tests / recovery-small.sh
1 #!/bin/sh
2
3 set -e
4
5 # 17 = bug 2732   2986
6 ALWAYS_EXCEPT="17 20b"
7
8 LUSTRE=${LUSTRE:-`dirname $0`/..}
9 UPCALL=${UPCALL:-$PWD/recovery-small-upcall.sh}
10 . $LUSTRE/tests/test-framework.sh
11
12 init_test_env $@
13
14 . ${CONFIG:=$LUSTRE/tests/cfg/local.sh}
15
16 build_test_filter
17
18
19 # Allow us to override the setup if we already have a mounted system by
20 # setting SETUP=" " and CLEANUP=" "
21 SETUP=${SETUP:-"setup"}
22 CLEANUP=${CLEANUP:-"cleanup"}
23
24
25 make_config() {
26     rm -f $XMLCONFIG
27     add_mds mds --dev $MDSDEV --size $MDSSIZE
28     add_lov lov1 mds --stripe_sz $STRIPE_BYTES\
29         --stripe_cnt $STRIPES_PER_OBJ --stripe_pattern 0
30     add_ost ost --lov lov1 --dev $OSTDEV --size $OSTSIZE
31     add_ost ost2 --lov lov1 --dev ${OSTDEV}-2 --size $OSTSIZE
32     add_client client mds --lov lov1 --path $MOUNT
33 }
34
35 setup() {
36     make_config
37     start ost --reformat $OSTLCONFARGS 
38     start ost2 --reformat $OSTLCONFARGS 
39     [ "$DAEMONFILE" ] && $LCTL debug_daemon start $DAEMONFILE $DAEMONSIZE
40     start mds $MDSLCONFARGS --reformat
41     zconf_mount `hostname`  $MOUNT
42 }
43
44 cleanup() {
45     zconf_umount `hostname` $MOUNT
46     stop mds ${FORCE} $MDSLCONFARGS
47     stop ost2 ${FORCE} --dump cleanup.log
48     stop ost ${FORCE} --dump cleanup.log
49 }
50
51 replay() {
52     do_mds "sync"
53     do_mds 'echo -e "device \$mds1\\nprobe\\nnotransno\\nreadonly" | lctl'
54     do_client "$1" &
55     shutdown_mds -f
56     start_mds
57     wait
58     do_client "df -h $MOUNT" # trigger failover, if we haven't already
59 }
60
61 if [ ! -z "$EVAL" ]; then
62     eval "$EVAL"
63     exit $?
64 fi
65
66 REFORMAT=--reformat $SETUP
67 unset REFORMAT
68
69 test_1() {
70     drop_request "mcreate $MOUNT/1"  || return 1
71     drop_reply "mcreate $MOUNT/2"    || return 2
72 }
73 run_test 1 "mcreate: drop req, drop rep"
74
75 test_2() {
76     drop_request "tchmod 111 $MOUNT/2"  || return 1
77     drop_reply "tchmod 666 $MOUNT/2"    || return 2
78 }
79 run_test 2 "chmod: drop req, drop rep"
80
81 test_3() {
82     drop_request "statone $MOUNT/2" || return 1
83     drop_reply "statone $MOUNT/2"   || return 2
84 }
85 run_test 3 "stat: drop req, drop rep"
86
87 test_4() {
88     do_facet client "cp /etc/resolv.conf $MOUNT/resolv.conf" || return 1
89     drop_request "cat $MOUNT/resolv.conf > /dev/null"   || return 2
90     drop_reply "cat $MOUNT/resolv.conf > /dev/null"     || return 3
91 }
92 run_test 4 "open: drop req, drop rep"
93
94 test_5() {
95     drop_request "mv $MOUNT/resolv.conf $MOUNT/renamed" || return 1
96     drop_reply "mv $MOUNT/renamed $MOUNT/renamed-again" || return 2
97     do_facet client "checkstat -v $MOUNT/renamed-again"  || return 3
98 }
99 run_test 5 "rename: drop req, drop rep"
100
101 test_6() {
102     drop_request "mlink $MOUNT/renamed-again $MOUNT/link1" || return 1
103     drop_reply "mlink $MOUNT/renamed-again $MOUNT/link2"   || return 2
104 }
105 run_test 6 "link: drop req, drop rep"
106
107 test_7() {
108     drop_request "munlink $MOUNT/link1"   || return 1
109     drop_reply "munlink $MOUNT/link2"     || return 2
110 }
111 run_test 7 "unlink: drop req, drop rep"
112
113
114 #bug 1423
115 test_8() {
116     drop_reply "touch $MOUNT/renamed"    || return 1
117 }
118 run_test 8 "touch: drop rep (bug 1423)"
119
120 #bug 1420
121 test_9() {
122     pause_bulk "cp /etc/profile $MOUNT"       || return 1
123     do_facet client "cp /etc/termcap $MOUNT"  || return 2
124     do_facet client "sync"
125     do_facet client "rm $MOUNT/termcap $MOUNT/profile" || return 3
126 }
127 run_test 9 "pause bulk on OST (bug 1420)"
128
129 #bug 1521
130 test_10() {
131     do_facet client mcreate $MOUNT/f10        || return 1
132     drop_bl_callback "chmod 0777 $MOUNT/f10"  || return 2
133     # wait for the mds to evict the client
134     #echo "sleep $(($TIMEOUT*2))"
135     #sleep $(($TIMEOUT*2))
136     do_facet client touch  $MOUNT/f10 || echo "touch failed, evicted"
137     do_facet client checkstat -v -p 0777 $MOUNT/f10  || return 3
138     do_facet client "munlink $MOUNT/f10"
139 }
140 run_test 10 "finish request on server after client eviction (bug 1521)"
141
142 #bug 2460
143 # wake up a thead waiting for completion after eviction
144 test_11(){
145     do_facet client multiop $MOUNT/$tfile Ow  || return 1
146     do_facet client multiop $MOUNT/$tfile or  || return 2
147
148     cancel_lru_locks OSC
149
150     do_facet client multiop $MOUNT/$tfile or  || return 3
151     drop_bl_callback multiop $MOUNT/$tfile Ow  || 
152         echo "client evicted, as expected"
153
154     do_facet client munlink $MOUNT/$tfile  || return 4
155 }
156 run_test 11 "wake up a thead waiting for completion after eviction (b=2460)"
157
158 #b=2494
159 test_12(){
160     $LCTL mark multiop $MOUNT/$tfile OS_c 
161     do_facet mds "sysctl -w lustre.fail_loc=0x115"
162     clear_failloc mds $((TIMEOUT * 2)) &
163     multiop $MOUNT/$tfile OS_c  &
164     PID=$!
165 #define OBD_FAIL_MDS_CLOSE_NET           0x115
166     sleep 2
167     kill -USR1 $PID
168     echo "waiting for multiop $PID"
169     wait $PID || return 2
170     do_facet client munlink $MOUNT/$tfile  || return 3
171 }
172 run_test 12 "recover from timed out resend in ptlrpcd (b=2494)"
173
174 # Bug 113, check that readdir lost recv timeout works.
175 test_13() {
176     mkdir /mnt/lustre/readdir
177     touch /mnt/lustre/readdir/newentry
178 # OBD_FAIL_MDS_READPAGE_NET|OBD_FAIL_ONCE
179     do_facet mds "sysctl -w lustre.fail_loc=0x80000104"
180     ls /mnt/lustre/readdir || return 1
181     do_facet mds "sysctl -w lustre.fail_loc=0"
182     rm -rf /mnt/lustre/readdir
183 }
184 run_test 13 "mdc_readpage restart test (bug 1138)"
185
186 # Bug 113, check that readdir lost send timeout works.
187 test_14() {
188     mkdir /mnt/lustre/readdir
189     touch /mnt/lustre/readdir/newentry
190 # OBD_FAIL_MDS_SENDPAGE|OBD_FAIL_ONCE
191     do_facet mds "sysctl -w lustre.fail_loc=0x80000106"
192     ls /mnt/lustre/readdir || return 1
193     do_facet mds "sysctl -w lustre.fail_loc=0"
194 }
195 run_test 14 "mdc_readpage resend test (bug 1138)"
196
197 test_15() {
198     do_facet mds "sysctl -w lustre.fail_loc=0x80000128"
199     touch $DIR/$tfile && return 1
200     return 0
201 }
202 run_test 15 "failed open (-ENOMEM)"
203
204 test_16() {
205     do_facet client cp /etc/termcap $MOUNT
206     sync
207
208 #define OBD_FAIL_PTLRPC_BULK_PUT_NET 0x504 | OBD_FAIL_ONCE
209     sysctl -w lustre.fail_loc=0x80000504
210     cancel_lru_locks OSC
211     # will get evicted here
212     do_facet client "diff /etc/termcap $MOUNT/termcap"  && return 1
213     sysctl -w lustre.fail_loc=0
214     do_facet client "diff /etc/termcap $MOUNT/termcap"  || return 2
215 }
216 run_test 16 "timeout bulk put, evict client (2732)"
217   
218 test_17() {
219 #define OBD_FAIL_PTLRPC_BULK_GET_NET 0x504 | OBD_FAIL_ONCE
220     # will get evicted here
221     sysctl -w lustre.fail_loc=0x80000503
222     do_facet client cp /etc/termcap $MOUNT && return 1
223
224     do_facet client "diff /etc/termcap $MOUNT/termcap"  && return 2
225     sysctl -w lustre.fail_loc=0
226     do_facet client "diff /etc/termcap $MOUNT/termcap"  || return 3
227 }
228 run_test 17 "timeout bulk get, evict client (2732)"
229   
230 test_18a() {
231     do_facet client mkdir -p $MOUNT/$tdir
232     f=$MOUNT/$tdir/$tfile
233
234     cancel_lru_locks OSC
235     pgcache_empty || return 1
236
237     # 1 stripe on ost2
238     lfs setstripe $f $((128 * 1024)) 1 1
239
240     do_facet client cp /etc/termcap $f
241     sync
242     local osc2_dev=`$LCTL device_list | \
243         awk '(/ost2.*client_facet/){print $4}' `
244     $LCTL --device %$osc2_dev deactivate
245     # my understanding is that there should be nothing in the page
246     # cache after the client reconnects?     
247     rc=0
248     pgcache_empty || rc=2
249     $LCTL --device %$osc2_dev activate
250     rm -f $f
251     return $rc
252 }
253 run_test 18a "manual ost invalidate clears page cache immediately"
254
255 test_18b() {
256 # OBD_FAIL_PTLRPC_BULK_PUT_NET|OBD_FAIL_ONCE
257     do_facet client mkdir -p $MOUNT/$tdir
258     f=$MOUNT/$tdir/$tfile
259     f2=$MOUNT/$tdir/${tfile}-2
260
261     cancel_lru_locks OSC
262     pgcache_empty || return 1
263  
264     # shouldn't have to set stripe size of count==1
265     lfs setstripe $f $((128 * 1024)) 0 1
266     sync
267     sysctl -w lustre.fail_loc=0
268     # allow recovery to complete
269     sleep $((TIMEOUT + 2))
270     # my understanding is that there should be nothing in the page
271     # cache after the client reconnects?     
272     rc=0
273     pgcache_empty || rc=2
274     rm -f $f $f2
275     return $rc
276 }
277 run_test 18b "eviction and reconnect clears page cache (2766)"
278
279 test_19a() {
280     f=$MOUNT/$tfile
281     do_facet client mcreate $f        || return 1
282     drop_ldlm_cancel "chmod 0777 $f"  || echo evicted
283
284     do_facet client checkstat -v -p 0777 $f  || echo evicted
285     do_facet client "munlink $f"
286 }
287 run_test 19a "test expired_lock_main on mds (2867)"
288
289 test_19b() {
290     f=$MOUNT/$tfile
291     do_facet client multiop $f Ow  || return 1
292     do_facet client multiop $f or  || return 2
293
294     cancel_lru_locks OSC
295
296     do_facet client multiop $f or  || return 3
297     drop_ldlm_cancel multiop $f Ow  || echo "client evicted, as expected"
298
299     do_facet client munlink $f  || return 4
300 }
301 run_test 19b "test expired_lock_main on ost (2867)"
302
303 test_20a() {    # bug 2983 - ldlm_handle_enqueue cleanup
304         mkdir -p $DIR/$tdir
305         multiop $DIR/$tdir/${tfile} O_wc &
306         MULTI_PID=$!
307         usleep 500
308         cancel_lru_locks OSC
309 #define OBD_FAIL_LDLM_ENQUEUE_EXTENT_ERR 0x308
310         do_facet ost sysctl -w lustre.fail_loc=0x80000308
311         set -vx
312         kill -USR1 $MULTI_PID
313         wait $MULTI_PID
314         rc=$?
315         [ $rc -eq 0 ] && error "multiop didn't fail enqueue: rc $rc" || true
316         set +vx
317 }
318 run_test 20a "ldlm_handle_enqueue error (should return error)" 
319
320 test_20b() {    # bug 2986 - ldlm_handle_enqueue error during open
321         mkdir -p $DIR/$tdir
322         touch $DIR/$tdir/${tfile}
323         cancel_lru_locks OSC
324 #define OBD_FAIL_LDLM_ENQUEUE_EXTENT_ERR 0x308
325         do_facet ost sysctl -w lustre.fail_loc=0x80000308
326         dd if=/etc/hosts of=$DIR/$tdir/$tfile && \
327                 error "didn't fail open enqueue" || true
328 }
329 run_test 20b "ldlm_handle_enqueue error (should return error)"
330
331 $CLEANUP