3 # Run select tests by setting ONLY, or as arguments to the script.
4 # Skip specific tests by setting EXCEPT.
10 ALWAYS_EXCEPT="$SANITY_LFSCK_EXCEPT"
11 [ "$SLOW" = "no" ] && EXCEPT_SLOW=""
12 # UPDATE THE COMMENT ABOVE WITH BUG NUMBERS WHEN CHANGING ALWAYS_EXCEPT!
14 LUSTRE=${LUSTRE:-$(cd $(dirname $0)/..; echo $PWD)}
15 . $LUSTRE/tests/test-framework.sh
17 . ${CONFIG:=$LUSTRE/tests/cfg/$NAME.sh}
20 [ $(facet_fstype $SINGLEMDS) != ldiskfs ] &&
21 skip "test LFSCK only for ldiskfs" && exit 0
22 require_dsh_mds || exit 0
24 MCREATE=${MCREATE:-mcreate}
25 SAVED_MDSSIZE=${MDSSIZE}
26 SAVED_OSTSIZE=${OSTSIZE}
27 # use small MDS + OST size to speed formatting time
28 # do not use too small MDSSIZE/OSTSIZE, which affect the default journal size
32 check_and_setup_lustre
35 $LCTL set_param debug=+lfsck > /dev/null || true
37 MDT_DEV="${FSNAME}-MDT0000"
38 MDT_DEVNAME=$(mdsdevname ${SINGLEMDS//mds/})
39 START_NAMESPACE="do_facet $SINGLEMDS \
40 $LCTL lfsck_start -M ${MDT_DEV} -t namespace"
41 STOP_LFSCK="do_facet $SINGLEMDS $LCTL lfsck_stop -M ${MDT_DEV}"
42 SHOW_NAMESPACE="do_facet $SINGLEMDS \
43 $LCTL get_param -n mdd.${MDT_DEV}.lfsck_namespace"
44 MOUNT_OPTS_SCRUB="-o user_xattr"
45 MOUNT_OPTS_NOSCRUB="-o user_xattr,noscrub"
57 echo "preparing... ${nfiles} * ${ndirs} files will be created."
59 cp $LUSTRE/tests/*.sh $DIR/$tdir/
60 for ((i=0; i<${ndirs}; i++)); do
61 mkdir $DIR/$tdir/d${i}
62 touch $DIR/$tdir/f${i}
63 for ((j=0; j<${nfiles}; j++)); do
64 touch $DIR/$tdir/d${i}/f${j}
66 mkdir $DIR/$tdir/e${i}
70 cleanup_mount $MOUNT > /dev/null || error "Fail to stop client!"
71 echo "stop $SINGLEMDS"
72 stop $SINGLEMDS > /dev/null || error "Fail to stop MDS!"
77 echo "start $SINGLEMDS"
78 start $SINGLEMDS $MDT_DEVNAME $MOUNT_OPTS_SCRUB > /dev/null ||
79 error "(1) Fail to start MDS!"
81 #define OBD_FAIL_LFSCK_DELAY1 0x1600
82 do_facet $SINGLEMDS $LCTL set_param fail_val=3
83 do_facet $SINGLEMDS $LCTL set_param fail_loc=0x1600
84 $START_NAMESPACE || error "(2) Fail to start LFSCK for namespace!"
86 $SHOW_NAMESPACE || error "Fail to monitor LFSCK (3)"
88 local STATUS=$($SHOW_NAMESPACE | awk '/^status/ { print $2 }')
89 [ "$STATUS" == "scanning-phase1" ] ||
90 error "(4) Expect 'scanning-phase1', but got '$STATUS'"
92 $STOP_LFSCK || error "(5) Fail to stop LFSCK!"
94 STATUS=$($SHOW_NAMESPACE | awk '/^status/ { print $2 }')
95 [ "$STATUS" == "stopped" ] ||
96 error "(6) Expect 'stopped', but got '$STATUS'"
98 $START_NAMESPACE || error "(7) Fail to start LFSCK for namespace!"
100 STATUS=$($SHOW_NAMESPACE | awk '/^status/ { print $2 }')
101 [ "$STATUS" == "scanning-phase1" ] ||
102 error "(8) Expect 'scanning-phase1', but got '$STATUS'"
104 do_facet $SINGLEMDS $LCTL set_param fail_loc=0
105 do_facet $SINGLEMDS $LCTL set_param fail_val=0
107 STATUS=$($SHOW_NAMESPACE | awk '/^status/ { print $2 }')
108 [ "$STATUS" == "completed" ] ||
109 error "(9) Expect 'completed', but got '$STATUS'"
111 local repaired=$($SHOW_NAMESPACE |
112 awk '/^updated_phase1/ { print $2 }')
113 [ $repaired -eq 0 ] ||
114 error "(10) Expect nothing to be repaired, but got: $repaired"
116 run_test 0 "Control LFSCK manually"
120 echo "start $SINGLEMDS"
121 start $SINGLEMDS $MDT_DEVNAME $MOUNT_OPTS_SCRUB > /dev/null ||
122 error "(1) Fail to start MDS!"
124 mount_client $MOUNT || error "(2) Fail to start client!"
126 #define OBD_FAIL_FID_INDIR 0x1501
127 do_facet $SINGLEMDS $LCTL set_param fail_loc=0x1501
128 touch $DIR/$tdir/dummy
130 do_facet $SINGLEMDS $LCTL set_param fail_loc=0
132 $START_NAMESPACE || error "(3) Fail to start LFSCK for namespace!"
135 local STATUS=$($SHOW_NAMESPACE | awk '/^status/ { print $2 }')
136 [ "$STATUS" == "completed" ] ||
137 error "(4) Expect 'completed', but got '$STATUS'"
139 local repaired=$($SHOW_NAMESPACE |
140 awk '/^updated_phase1/ { print $2 }')
141 [ $repaired -eq 1 ] ||
142 error "(5) Fail to repair crashed FID-in-dirent: $repaired"
144 mount_client $MOUNT || error "(6) Fail to start client!"
146 #define OBD_FAIL_FID_LOOKUP 0x1505
147 do_facet $SINGLEMDS $LCTL set_param fail_loc=0x1505
148 ls $DIR/$tdir/ > /dev/null || error "(7) no FID-in-dirent."
150 do_facet $SINGLEMDS $LCTL set_param fail_loc=0
152 run_test 1a "LFSCK can find out and repair crashed FID-in-dirent"
157 echo "start $SINGLEMDS"
158 start $SINGLEMDS $MDT_DEVNAME $MOUNT_OPTS_SCRUB > /dev/null ||
159 error "(1) Fail to start MDS!"
161 mount_client $MOUNT || error "(2) Fail to start client!"
163 #define OBD_FAIL_FID_INLMA 0x1502
164 do_facet $SINGLEMDS $LCTL set_param fail_loc=0x1502
165 touch $DIR/$tdir/dummy
167 do_facet $SINGLEMDS $LCTL set_param fail_loc=0
169 #define OBD_FAIL_FID_NOLMA 0x1506
170 do_facet $SINGLEMDS $LCTL set_param fail_loc=0x1506
171 $START_NAMESPACE || error "(3) Fail to start LFSCK for namespace!"
174 local STATUS=$($SHOW_NAMESPACE | awk '/^status/ { print $2 }')
175 [ "$STATUS" == "completed" ] ||
176 error "(4) Expect 'completed', but got '$STATUS'"
178 local repaired=$($SHOW_NAMESPACE |
179 awk '/^updated_phase1/ { print $2 }')
180 [ $repaired -eq 1 ] ||
181 error "(5) Fail to repair missed FID-in-LMA: $repaired"
183 do_facet $SINGLEMDS $LCTL set_param fail_loc=0
184 mount_client $MOUNT || error "(6) Fail to start client!"
186 #define OBD_FAIL_FID_LOOKUP 0x1505
187 do_facet $SINGLEMDS $LCTL set_param fail_loc=0x1505
188 stat $DIR/$tdir/dummy > /dev/null || error "(7) no FID-in-LMA."
190 do_facet $SINGLEMDS $LCTL set_param fail_loc=0
192 run_test 1b "LFSCK can find out and repair missed FID-in-LMA"
197 mds_backup_restore || error "(1) Fail to backup/restore!"
198 echo "start $SINGLEMDS with disabling OI scrub"
199 start $SINGLEMDS $MDT_DEVNAME $MOUNT_OPTS_NOSCRUB > /dev/null ||
200 error "(2) Fail to start MDS!"
202 local STATUS=$($SHOW_NAMESPACE | awk '/^status/ { print $2 }')
203 [ "$STATUS" == "init" ] ||
204 error "(3) Expect 'init', but got '$STATUS'"
206 #define OBD_FAIL_LFSCK_DELAY2 0x1601
207 do_facet $SINGLEMDS $LCTL set_param fail_val=1
208 do_facet $SINGLEMDS $LCTL set_param fail_loc=0x1601
209 $START_NAMESPACE || error "(4) Fail to start LFSCK for namespace!"
212 STATUS=$($SHOW_NAMESPACE | awk '/^status/ { print $2 }')
213 [ "$STATUS" == "scanning-phase1" ] ||
214 error "(5) Expect 'scanning-phase1', but got '$STATUS'"
216 local FLAGS=$($SHOW_NAMESPACE | awk '/^flags/ { print $2 }')
217 [ "$FLAGS" == "inconsistent" ] ||
218 error "(6) Expect 'inconsistent', but got '$FLAGS'"
220 do_facet $SINGLEMDS $LCTL set_param fail_loc=0
221 do_facet $SINGLEMDS $LCTL set_param fail_val=0
223 STATUS=$($SHOW_NAMESPACE | awk '/^status/ { print $2 }')
224 [ "$STATUS" == "completed" ] ||
225 error "(7) Expect 'completed', but got '$STATUS'"
227 FLAGS=$($SHOW_NAMESPACE | awk '/^flags/ { print $2 }')
228 [ -z "$FLAGS" ] || error "(8) Expect empty flags, but got '$FLAGS'"
230 local repaired=$($SHOW_NAMESPACE |
231 awk '/^updated_phase1/ { print $2 }')
232 [ $repaired -ge 9 ] ||
233 error "(9) Fail to repair crashed linkEA: $repaired"
235 mount_client $MOUNT || error "(10) Fail to start client!"
237 #define OBD_FAIL_FID_LOOKUP 0x1505
238 do_facet $SINGLEMDS $LCTL set_param fail_loc=0x1505
239 ls $DIR/$tdir/ > /dev/null || error "(11) no FID-in-dirent."
241 do_facet $SINGLEMDS $LCTL set_param fail_loc=0
243 run_test 4 "FID-in-dirent can be rebuilt after MDT file-level backup/restore"
247 echo "start $SINGLEMDS"
248 start $SINGLEMDS $MDT_DEVNAME $MOUNT_OPTS_SCRUB > /dev/null ||
249 error "(1) Fail to start MDS!"
251 #define OBD_FAIL_LFSCK_DELAY1 0x1600
252 do_facet $SINGLEMDS $LCTL set_param fail_val=1
253 do_facet $SINGLEMDS $LCTL set_param fail_loc=0x1600
254 $START_NAMESPACE || error "(2) Fail to start LFSCK for namespace!"
256 local STATUS=$($SHOW_NAMESPACE | awk '/^status/ { print $2 }')
257 [ "$STATUS" == "scanning-phase1" ] ||
258 error "(3) Expect 'scanning-phase1', but got '$STATUS'"
260 # Sleep 3 sec to guarantee at least one object processed by LFSCK
262 # Fail the LFSCK to guarantee there is at least one checkpoint
263 #define OBD_FAIL_LFSCK_FATAL1 0x1608
264 do_facet $SINGLEMDS $LCTL set_param fail_loc=0x80001608
266 STATUS=$($SHOW_NAMESPACE | awk '/^status/ { print $2 }')
267 [ "$STATUS" == "failed" ] ||
268 error "(4) Expect 'failed', but got '$STATUS'"
270 local POSITION0=$($SHOW_NAMESPACE |
271 awk '/^last_checkpoint_position/ { print $2 }' |
274 #define OBD_FAIL_LFSCK_DELAY1 0x1600
275 do_facet $SINGLEMDS $LCTL set_param fail_val=1
276 do_facet $SINGLEMDS $LCTL set_param fail_loc=0x1600
277 $START_NAMESPACE || error "(5) Fail to start LFSCK for namespace!"
279 STATUS=$($SHOW_NAMESPACE | awk '/^status/ { print $2 }')
280 [ "$STATUS" == "scanning-phase1" ] ||
281 error "(6) Expect 'scanning-phase1', but got '$STATUS'"
283 local POSITION1=$($SHOW_NAMESPACE |
284 awk '/^latest_start_position/ { print $2 }' |
286 [ $POSITION0 -lt $POSITION1 ] ||
287 error "(7) Expect larger than: $POSITION0, but got $POSITION1"
289 do_facet $SINGLEMDS $LCTL set_param fail_loc=0
290 do_facet $SINGLEMDS $LCTL set_param fail_val=0
292 STATUS=$($SHOW_NAMESPACE | awk '/^status/ { print $2 }')
293 [ "$STATUS" == "completed" ] ||
294 error "(8) Expect 'completed', but got '$STATUS'"
296 run_test 6a "LFSCK resumes from last checkpoint (1)"
300 echo "start $SINGLEMDS"
301 start $SINGLEMDS $MDT_DEVNAME $MOUNT_OPTS_SCRUB > /dev/null ||
302 error "(1) Fail to start MDS!"
304 #define OBD_FAIL_LFSCK_DELAY2 0x1601
305 do_facet $SINGLEMDS $LCTL set_param fail_val=1
306 do_facet $SINGLEMDS $LCTL set_param fail_loc=0x1601
307 $START_NAMESPACE || error "(2) Fail to start LFSCK for namespace!"
309 local STATUS=$($SHOW_NAMESPACE | awk '/^status/ { print $2 }')
310 [ "$STATUS" == "scanning-phase1" ] ||
311 error "(3) Expect 'scanning-phase1', but got '$STATUS'"
313 # Sleep 3 sec to guarantee at least one object processed by LFSCK
315 # Fail the LFSCK to guarantee there is at least one checkpoint
316 #define OBD_FAIL_LFSCK_FATAL2 0x1609
317 do_facet $SINGLEMDS $LCTL set_param fail_loc=0x80001609
319 STATUS=$($SHOW_NAMESPACE | awk '/^status/ { print $2 }')
320 [ "$STATUS" == "failed" ] ||
321 error "(4) Expect 'failed', but got '$STATUS'"
323 local POSITION0=$($SHOW_NAMESPACE |
324 awk '/^last_checkpoint_position/ { print $4 }')
326 #define OBD_FAIL_LFSCK_DELAY2 0x1601
327 do_facet $SINGLEMDS $LCTL set_param fail_val=1
328 do_facet $SINGLEMDS $LCTL set_param fail_loc=0x1601
329 $START_NAMESPACE || error "(5) Fail to start LFSCK for namespace!"
331 STATUS=$($SHOW_NAMESPACE | awk '/^status/ { print $2 }')
332 [ "$STATUS" == "scanning-phase1" ] ||
333 error "(6) Expect 'scanning-phase1', but got '$STATUS'"
335 local POSITION1=$($SHOW_NAMESPACE |
336 awk '/^latest_start_position/ { print $4 }')
337 if [ $POSITION0 -gt $POSITION1 ]; then
338 [ $POSITION1 -eq 0 -a $POSITINO0 -eq $((POSITION1 + 1)) ] ||
339 error "(7) Expect larger than: $POSITION0, but got $POSITION1"
342 do_facet $SINGLEMDS $LCTL set_param fail_loc=0
343 do_facet $SINGLEMDS $LCTL set_param fail_val=0
345 STATUS=$($SHOW_NAMESPACE | awk '/^status/ { print $2 }')
346 [ "$STATUS" == "completed" ] ||
347 error "(8) Expect 'completed', but got '$STATUS'"
349 run_test 6b "LFSCK resumes from last checkpoint (2)"
354 echo "start $SINGLEMDS"
355 start $SINGLEMDS $MDT_DEVNAME $MOUNT_OPTS_SCRUB > /dev/null ||
356 error "(1) Fail to start MDS!"
358 #define OBD_FAIL_LFSCK_DELAY2 0x1601
359 do_facet $SINGLEMDS $LCTL set_param fail_val=1
360 do_facet $SINGLEMDS $LCTL set_param fail_loc=0x1601
361 $START_NAMESPACE || error "(2) Fail to start LFSCK for namespace!"
363 local STATUS=$($SHOW_NAMESPACE | awk '/^status/ { print $2 }')
364 [ "$STATUS" == "scanning-phase1" ] ||
365 error "(3) Expect 'scanning-phase1', but got '$STATUS'"
367 # Sleep 3 sec to guarantee at least one object processed by LFSCK
369 echo "stop $SINGLEMDS"
370 stop $SINGLEMDS > /dev/null || error "(4) Fail to stop MDS!"
372 echo "start $SINGLEMDS"
373 start $SINGLEMDS $MDT_DEVNAME $MOUNT_OPTS_SCRUB > /dev/null ||
374 error "(5) Fail to start MDS!"
376 STATUS=$($SHOW_NAMESPACE | awk '/^status/ { print $2 }')
377 [ "$STATUS" == "scanning-phase1" ] ||
378 error "(6) Expect 'scanning-phase1', but got '$STATUS'"
380 do_facet $SINGLEMDS $LCTL set_param fail_loc=0
381 do_facet $SINGLEMDS $LCTL set_param fail_val=0
383 STATUS=$($SHOW_NAMESPACE | awk '/^status/ { print $2 }')
384 [ "$STATUS" == "completed" ] ||
385 error "(7) Expect 'completed', but got '$STATUS'"
387 run_test 7a "non-stopped LFSCK should auto restarts after MDS remount (1)"
390 if [ -z "$(grep "processor.*: 1" /proc/cpuinfo)" ]; then
391 skip "Testing on UP system, the speed may be inaccurate."
396 echo "start $SINGLEMDS"
397 start $SINGLEMDS $MDT_DEVNAME $MOUNT_OPTS_SCRUB > /dev/null ||
398 error "(1) Fail to start MDS!"
400 local STATUS=$($SHOW_NAMESPACE | awk '/^status/ { print $2 }')
401 [ "$STATUS" == "init" ] ||
402 error "(2) Expect 'init', but got '$STATUS'"
404 $START_NAMESPACE -s 100 || error "(3) Fail to start LFSCK!"
407 STATUS=$($SHOW_NAMESPACE | awk '/^status/ { print $2 }')
408 [ "$STATUS" == "scanning-phase1" ] ||
409 error "(3) Expect 'scanning-phase1', but got '$STATUS'"
411 local SPEED=$($SHOW_NAMESPACE |
412 awk '/^average_speed_phase1/ { print $2 }')
413 # (100 * (10 + 1)) / 10 = 110
414 [ $SPEED -lt 120 ] ||
415 error "(4) Unexpected speed $SPEED, should not more than 120"
418 do_facet $SINGLEMDS \
419 $LCTL set_param -n mdd.${MDT_DEV}.lfsck_speed_limit 300
422 SPEED=$($SHOW_NAMESPACE | awk '/^average_speed_phase1/ { print $2 }')
423 # (100 * (10 - 1) + 300 * (10 - 1)) / 20 = 180
424 [ $SPEED -lt 170 ] &&
425 error "(5) Unexpected speed $SPEED, should not less than 170"
427 # (100 * (10 + 1) + 300 * (10 + 1)) / 20 = 220
428 [ $SPEED -lt 230 ] ||
429 error "(6) Unexpected speed $SPEED, should not more than 230"
431 do_facet $SINGLEMDS \
432 $LCTL set_param -n mdd.${MDT_DEV}.lfsck_speed_limit 0
434 STATUS=$($SHOW_NAMESPACE | awk '/^status/ { print $2 }')
435 [ "$STATUS" == "completed" ] ||
436 error "(7) Expect 'completed', but got '$STATUS'"
438 run_test 9a "LFSCK speed control (1)"
440 $LCTL set_param debug=-lfsck > /dev/null || true
442 # restore MDS/OST size
443 MDSSIZE=${SAVED_MDSSIZE}
444 OSTSIZE=${SAVED_OSTSIZE}
446 # cleanup the system at last