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
34 [[ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.3.60) ]] &&
35 skip "Need MDS version at least 2.3.60" && check_and_cleanup_lustre &&
40 $LCTL set_param debug=+lfsck > /dev/null || true
42 MDT_DEV="${FSNAME}-MDT0000"
43 MDT_DEVNAME=$(mdsdevname ${SINGLEMDS//mds/})
44 START_NAMESPACE="do_facet $SINGLEMDS \
45 $LCTL lfsck_start -M ${MDT_DEV} -t namespace"
46 STOP_LFSCK="do_facet $SINGLEMDS $LCTL lfsck_stop -M ${MDT_DEV}"
47 SHOW_NAMESPACE="do_facet $SINGLEMDS \
48 $LCTL get_param -n mdd.${MDT_DEV}.lfsck_namespace"
49 MOUNT_OPTS_SCRUB="-o user_xattr"
50 MOUNT_OPTS_NOSCRUB="-o user_xattr,noscrub"
63 if [ ! -z $igif ]; then
64 #define OBD_FAIL_FID_IGIF 0x1504
65 do_facet $SINGLEMDS $LCTL set_param fail_loc=0x1504
68 echo "preparing... ${nfiles} * ${ndirs} files will be created."
70 cp $LUSTRE/tests/*.sh $DIR/
71 for ((i=0; i<${ndirs}; i++)); do
72 mkdir $DIR/$tdir/d${i}
73 touch $DIR/$tdir/f${i}
74 for ((j=0; j<${nfiles}; j++)); do
75 touch $DIR/$tdir/d${i}/f${j}
77 mkdir $DIR/$tdir/e${i}
80 if [ ! -z $igif ]; then
81 touch $DIR/$tdir/dummy
82 do_facet $SINGLEMDS $LCTL set_param fail_loc=0
86 cleanup_mount $MOUNT > /dev/null || error "Fail to stop client!"
87 echo "stop $SINGLEMDS"
88 stop $SINGLEMDS > /dev/null || error "Fail to stop MDS!"
93 echo "start $SINGLEMDS"
94 start $SINGLEMDS $MDT_DEVNAME $MOUNT_OPTS_SCRUB > /dev/null ||
95 error "(1) Fail to start MDS!"
97 #define OBD_FAIL_LFSCK_DELAY1 0x1600
98 do_facet $SINGLEMDS $LCTL set_param fail_val=3
99 do_facet $SINGLEMDS $LCTL set_param fail_loc=0x1600
100 $START_NAMESPACE || error "(2) Fail to start LFSCK for namespace!"
102 $SHOW_NAMESPACE || error "Fail to monitor LFSCK (3)"
104 local STATUS=$($SHOW_NAMESPACE | awk '/^status/ { print $2 }')
105 [ "$STATUS" == "scanning-phase1" ] ||
106 error "(4) Expect 'scanning-phase1', but got '$STATUS'"
108 $STOP_LFSCK || error "(5) Fail to stop LFSCK!"
110 STATUS=$($SHOW_NAMESPACE | awk '/^status/ { print $2 }')
111 [ "$STATUS" == "stopped" ] ||
112 error "(6) Expect 'stopped', but got '$STATUS'"
114 $START_NAMESPACE || error "(7) Fail to start LFSCK for namespace!"
116 STATUS=$($SHOW_NAMESPACE | awk '/^status/ { print $2 }')
117 [ "$STATUS" == "scanning-phase1" ] ||
118 error "(8) Expect 'scanning-phase1', but got '$STATUS'"
120 do_facet $SINGLEMDS $LCTL set_param fail_loc=0
121 do_facet $SINGLEMDS $LCTL set_param fail_val=0
123 STATUS=$($SHOW_NAMESPACE | awk '/^status/ { print $2 }')
124 [ "$STATUS" == "completed" ] ||
125 error "(9) Expect 'completed', but got '$STATUS'"
127 local repaired=$($SHOW_NAMESPACE |
128 awk '/^updated_phase1/ { print $2 }')
129 [ $repaired -eq 0 ] ||
130 error "(10) Expect nothing to be repaired, but got: $repaired"
132 local scanned1=$($SHOW_NAMESPACE | awk '/^success_count/ { print $2 }')
133 $START_NAMESPACE -r || error "(11) Fail to reset LFSCK!"
136 STATUS=$($SHOW_NAMESPACE | awk '/^status/ { print $2 }')
137 [ "$STATUS" == "completed" ] ||
138 error "(12) Expect 'completed', but got '$STATUS'"
140 local scanned2=$($SHOW_NAMESPACE | awk '/^success_count/ { print $2 }')
141 [ $((scanned1 + 1)) -eq $scanned2 ] ||
142 error "(13) Expect success $((scanned1 + 1)), but got $scanned2"
144 echo "stopall, should NOT crash LU-3649"
147 run_test 0 "Control LFSCK manually"
151 echo "start $SINGLEMDS"
152 start $SINGLEMDS $MDT_DEVNAME $MOUNT_OPTS_SCRUB > /dev/null ||
153 error "(1) Fail to start MDS!"
155 mount_client $MOUNT || error "(2) Fail to start client!"
157 #define OBD_FAIL_FID_INDIR 0x1501
158 do_facet $SINGLEMDS $LCTL set_param fail_loc=0x1501
159 touch $DIR/$tdir/dummy
161 do_facet $SINGLEMDS $LCTL set_param fail_loc=0
163 $START_NAMESPACE || error "(3) Fail to start LFSCK for namespace!"
166 local STATUS=$($SHOW_NAMESPACE | awk '/^status/ { print $2 }')
167 [ "$STATUS" == "completed" ] ||
168 error "(4) Expect 'completed', but got '$STATUS'"
170 local repaired=$($SHOW_NAMESPACE |
171 awk '/^updated_phase1/ { print $2 }')
172 [ $repaired -eq 1 ] ||
173 error "(5) Fail to repair crashed FID-in-dirent: $repaired"
175 mount_client $MOUNT || error "(6) Fail to start client!"
177 #define OBD_FAIL_FID_LOOKUP 0x1505
178 do_facet $SINGLEMDS $LCTL set_param fail_loc=0x1505
179 ls $DIR/$tdir/ > /dev/null || error "(7) no FID-in-dirent."
181 do_facet $SINGLEMDS $LCTL set_param fail_loc=0
183 run_test 1a "LFSCK can find out and repair crashed FID-in-dirent"
188 echo "start $SINGLEMDS"
189 start $SINGLEMDS $MDT_DEVNAME $MOUNT_OPTS_SCRUB > /dev/null ||
190 error "(1) Fail to start MDS!"
192 mount_client $MOUNT || error "(2) Fail to start client!"
194 #define OBD_FAIL_FID_INLMA 0x1502
195 do_facet $SINGLEMDS $LCTL set_param fail_loc=0x1502
196 touch $DIR/$tdir/dummy
198 do_facet $SINGLEMDS $LCTL set_param fail_loc=0
200 #define OBD_FAIL_FID_NOLMA 0x1506
201 do_facet $SINGLEMDS $LCTL set_param fail_loc=0x1506
202 $START_NAMESPACE || error "(3) Fail to start LFSCK for namespace!"
205 local STATUS=$($SHOW_NAMESPACE | awk '/^status/ { print $2 }')
206 [ "$STATUS" == "completed" ] ||
207 error "(4) Expect 'completed', but got '$STATUS'"
209 local repaired=$($SHOW_NAMESPACE |
210 awk '/^updated_phase1/ { print $2 }')
211 [ $repaired -eq 1 ] ||
212 error "(5) Fail to repair missed FID-in-LMA: $repaired"
214 do_facet $SINGLEMDS $LCTL set_param fail_loc=0
215 mount_client $MOUNT || error "(6) Fail to start client!"
217 #define OBD_FAIL_FID_LOOKUP 0x1505
218 do_facet $SINGLEMDS $LCTL set_param fail_loc=0x1505
219 stat $DIR/$tdir/dummy > /dev/null || error "(7) no FID-in-LMA."
221 do_facet $SINGLEMDS $LCTL set_param fail_loc=0
223 run_test 1b "LFSCK can find out and repair missed FID-in-LMA"
227 echo "start $SINGLEMDS"
228 start $SINGLEMDS $MDT_DEVNAME $MOUNT_OPTS_SCRUB > /dev/null ||
229 error "(1) Fail to start MDS!"
231 mount_client $MOUNT || error "(2) Fail to start client!"
233 #define OBD_FAIL_LFSCK_LINKEA_CRASH 0x1603
234 do_facet $SINGLEMDS $LCTL set_param fail_loc=0x1603
235 touch $DIR/$tdir/dummy
237 do_facet $SINGLEMDS $LCTL set_param fail_loc=0
239 $START_NAMESPACE || error "(3) Fail to start LFSCK for namespace!"
242 local STATUS=$($SHOW_NAMESPACE | awk '/^status/ { print $2 }')
243 [ "$STATUS" == "completed" ] ||
244 error "(4) Expect 'completed', but got '$STATUS'"
246 local repaired=$($SHOW_NAMESPACE |
247 awk '/^updated_phase1/ { print $2 }')
248 [ $repaired -eq 1 ] ||
249 error "(5) Fail to repair crashed linkEA: $repaired"
251 mount_client $MOUNT || error "(6) Fail to start client!"
253 stat $DIR/$tdir/dummy | grep "Links: 1" > /dev/null ||
254 error "(7) Fail to stat $DIR/$tdir/dummy"
256 local dummyfid=$($LFS path2fid $DIR/$tdir/dummy)
257 local dummyname=$($LFS fid2path $DIR $dummyfid)
258 [ "$dummyname" == "$DIR/$tdir/dummy" ] ||
259 error "(8) Fail to repair linkEA: $dummyfid $dummyname"
261 run_test 2a "LFSCK can find out and repair crashed linkEA entry"
266 echo "start $SINGLEMDS"
267 start $SINGLEMDS $MDT_DEVNAME $MOUNT_OPTS_SCRUB > /dev/null ||
268 error "(1) Fail to start MDS!"
270 mount_client $MOUNT || error "(2) Fail to start client!"
272 #define OBD_FAIL_LFSCK_LINKEA_MORE 0x1604
273 do_facet $SINGLEMDS $LCTL set_param fail_loc=0x1604
274 touch $DIR/$tdir/dummy
276 do_facet $SINGLEMDS $LCTL set_param fail_loc=0
278 $START_NAMESPACE || error "(3) Fail to start LFSCK for namespace!"
281 local STATUS=$($SHOW_NAMESPACE | awk '/^status/ { print $2 }')
282 [ "$STATUS" == "completed" ] ||
283 error "(4) Expect 'completed', but got '$STATUS'"
285 local repaired=$($SHOW_NAMESPACE |
286 awk '/^updated_phase2/ { print $2 }')
287 [ $repaired -eq 1 ] ||
288 error "(5) Fail to repair crashed linkEA: $repaired"
290 mount_client $MOUNT || error "(6) Fail to start client!"
292 stat $DIR/$tdir/dummy | grep "Links: 1" > /dev/null ||
293 error "(7) Fail to stat $DIR/$tdir/dummy"
295 local dummyfid=$($LFS path2fid $DIR/$tdir/dummy)
296 local dummyname=$($LFS fid2path $DIR $dummyfid)
297 [ "$dummyname" == "$DIR/$tdir/dummy" ] ||
298 error "(8) Fail to repair linkEA: $dummyfid $dummyname"
300 run_test 2b "LFSCK can find out and remove invalid linkEA entry"
305 mds_backup_restore || error "(1) Fail to backup/restore!"
306 echo "start $SINGLEMDS with disabling OI scrub"
307 start $SINGLEMDS $MDT_DEVNAME $MOUNT_OPTS_NOSCRUB > /dev/null ||
308 error "(2) Fail to start MDS!"
310 local STATUS=$($SHOW_NAMESPACE | awk '/^status/ { print $2 }')
311 [ "$STATUS" == "init" ] ||
312 error "(3) Expect 'init', but got '$STATUS'"
314 #define OBD_FAIL_LFSCK_DELAY2 0x1601
315 do_facet $SINGLEMDS $LCTL set_param fail_val=1
316 do_facet $SINGLEMDS $LCTL set_param fail_loc=0x1601
317 $START_NAMESPACE || error "(4) Fail to start LFSCK for namespace!"
320 STATUS=$($SHOW_NAMESPACE | awk '/^status/ { print $2 }')
321 [ "$STATUS" == "scanning-phase1" ] ||
322 error "(5) Expect 'scanning-phase1', but got '$STATUS'"
324 local FLAGS=$($SHOW_NAMESPACE | awk '/^flags/ { print $2 }')
325 [ "$FLAGS" == "inconsistent" ] ||
326 error "(6) Expect 'inconsistent', but got '$FLAGS'"
328 do_facet $SINGLEMDS $LCTL set_param fail_loc=0
329 do_facet $SINGLEMDS $LCTL set_param fail_val=0
331 STATUS=$($SHOW_NAMESPACE | awk '/^status/ { print $2 }')
332 [ "$STATUS" == "completed" ] ||
333 error "(7) Expect 'completed', but got '$STATUS'"
335 FLAGS=$($SHOW_NAMESPACE | awk '/^flags/ { print $2 }')
336 [ -z "$FLAGS" ] || error "(8) Expect empty flags, but got '$FLAGS'"
338 local repaired=$($SHOW_NAMESPACE |
339 awk '/^updated_phase1/ { print $2 }')
340 [ $repaired -ge 9 ] ||
341 error "(9) Fail to repair crashed linkEA: $repaired"
343 mount_client $MOUNT || error "(10) Fail to start client!"
345 #define OBD_FAIL_FID_LOOKUP 0x1505
346 do_facet $SINGLEMDS $LCTL set_param fail_loc=0x1505
347 ls $DIR/$tdir/ > /dev/null || error "(11) no FID-in-dirent."
349 do_facet $SINGLEMDS $LCTL set_param fail_loc=0
351 run_test 4 "FID-in-dirent can be rebuilt after MDT file-level backup/restore"
356 mds_backup_restore 1 || error "(1) Fail to backup/restore!"
357 echo "start $SINGLEMDS with disabling OI scrub"
358 start $SINGLEMDS $MDT_DEVNAME $MOUNT_OPTS_NOSCRUB > /dev/null ||
359 error "(2) Fail to start MDS!"
361 local STATUS=$($SHOW_NAMESPACE | awk '/^status/ { print $2 }')
362 [ "$STATUS" == "init" ] ||
363 error "(3) Expect 'init', but got '$STATUS'"
365 #define OBD_FAIL_LFSCK_DELAY2 0x1601
366 do_facet $SINGLEMDS $LCTL set_param fail_val=1
367 do_facet $SINGLEMDS $LCTL set_param fail_loc=0x1601
368 $START_NAMESPACE || error "(4) Fail to start LFSCK for namespace!"
371 STATUS=$($SHOW_NAMESPACE | awk '/^status/ { print $2 }')
372 [ "$STATUS" == "scanning-phase1" ] ||
373 error "(5) Expect 'scanning-phase1', but got '$STATUS'"
375 local FLAGS=$($SHOW_NAMESPACE | awk '/^flags/ { print $2 }')
376 [ "$FLAGS" == "inconsistent,upgrade" ] ||
377 error "(6) Expect 'inconsistent,upgrade', but got '$FLAGS'"
379 do_facet $SINGLEMDS $LCTL set_param fail_loc=0
380 do_facet $SINGLEMDS $LCTL set_param fail_val=0
382 STATUS=$($SHOW_NAMESPACE | awk '/^status/ { print $2 }')
383 [ "$STATUS" == "completed" ] ||
384 error "(7) Expect 'completed', but got '$STATUS'"
386 FLAGS=$($SHOW_NAMESPACE | awk '/^flags/ { print $2 }')
387 [ -z "$FLAGS" ] || error "(8) Expect empty flags, but got '$FLAGS'"
389 local repaired=$($SHOW_NAMESPACE |
390 awk '/^updated_phase1/ { print $2 }')
391 [ $repaired -ge 2 ] ||
392 error "(9) Fail to repair crashed linkEA: $repaired"
394 mount_client $MOUNT || error "(10) Fail to start client!"
396 #define OBD_FAIL_FID_LOOKUP 0x1505
397 do_facet $SINGLEMDS $LCTL set_param fail_loc=0x1505
398 stat $DIR/$tdir/dummy > /dev/null || error "(11) no FID-in-LMA."
400 ls $DIR/$tdir/ > /dev/null || error "(12) no FID-in-dirent."
402 do_facet $SINGLEMDS $LCTL set_param fail_loc=0
403 local dummyfid=$($LFS path2fid $DIR/$tdir/dummy)
404 local dummyname=$($LFS fid2path $DIR $dummyfid)
405 [ "$dummyname" == "$DIR/$tdir/dummy" ] ||
406 error "(13) Fail to generate linkEA: $dummyfid $dummyname"
408 run_test 5 "LFSCK can handle IFIG object upgrading"
412 echo "start $SINGLEMDS"
413 start $SINGLEMDS $MDT_DEVNAME $MOUNT_OPTS_SCRUB > /dev/null ||
414 error "(1) Fail to start MDS!"
416 #define OBD_FAIL_LFSCK_DELAY1 0x1600
417 do_facet $SINGLEMDS $LCTL set_param fail_val=1
418 do_facet $SINGLEMDS $LCTL set_param fail_loc=0x1600
419 $START_NAMESPACE || error "(2) Fail to start LFSCK for namespace!"
421 local STATUS=$($SHOW_NAMESPACE | awk '/^status/ { print $2 }')
422 [ "$STATUS" == "scanning-phase1" ] ||
423 error "(3) Expect 'scanning-phase1', but got '$STATUS'"
425 # Sleep 3 sec to guarantee at least one object processed by LFSCK
427 # Fail the LFSCK to guarantee there is at least one checkpoint
428 #define OBD_FAIL_LFSCK_FATAL1 0x1608
429 do_facet $SINGLEMDS $LCTL set_param fail_loc=0x80001608
431 STATUS=$($SHOW_NAMESPACE | awk '/^status/ { print $2 }')
432 [ "$STATUS" == "failed" ] ||
433 error "(4) Expect 'failed', but got '$STATUS'"
435 local POSITION0=$($SHOW_NAMESPACE |
436 awk '/^last_checkpoint_position/ { print $2 }' |
439 #define OBD_FAIL_LFSCK_DELAY1 0x1600
440 do_facet $SINGLEMDS $LCTL set_param fail_val=1
441 do_facet $SINGLEMDS $LCTL set_param fail_loc=0x1600
442 $START_NAMESPACE || error "(5) Fail to start LFSCK for namespace!"
444 STATUS=$($SHOW_NAMESPACE | awk '/^status/ { print $2 }')
445 [ "$STATUS" == "scanning-phase1" ] ||
446 error "(6) Expect 'scanning-phase1', but got '$STATUS'"
448 local POSITION1=$($SHOW_NAMESPACE |
449 awk '/^latest_start_position/ { print $2 }' |
451 [ $POSITION0 -lt $POSITION1 ] ||
452 error "(7) Expect larger than: $POSITION0, but got $POSITION1"
454 do_facet $SINGLEMDS $LCTL set_param fail_loc=0
455 do_facet $SINGLEMDS $LCTL set_param fail_val=0
457 STATUS=$($SHOW_NAMESPACE | awk '/^status/ { print $2 }')
458 [ "$STATUS" == "completed" ] ||
459 error "(8) Expect 'completed', but got '$STATUS'"
461 run_test 6a "LFSCK resumes from last checkpoint (1)"
465 echo "start $SINGLEMDS"
466 start $SINGLEMDS $MDT_DEVNAME $MOUNT_OPTS_SCRUB > /dev/null ||
467 error "(1) Fail to start MDS!"
469 #define OBD_FAIL_LFSCK_DELAY2 0x1601
470 do_facet $SINGLEMDS $LCTL set_param fail_val=1
471 do_facet $SINGLEMDS $LCTL set_param fail_loc=0x1601
472 $START_NAMESPACE || error "(2) Fail to start LFSCK for namespace!"
474 local STATUS=$($SHOW_NAMESPACE | awk '/^status/ { print $2 }')
475 [ "$STATUS" == "scanning-phase1" ] ||
476 error "(3) Expect 'scanning-phase1', but got '$STATUS'"
478 # Sleep 3 sec to guarantee at least one object processed by LFSCK
480 # Fail the LFSCK to guarantee there is at least one checkpoint
481 #define OBD_FAIL_LFSCK_FATAL2 0x1609
482 do_facet $SINGLEMDS $LCTL set_param fail_loc=0x80001609
484 STATUS=$($SHOW_NAMESPACE | awk '/^status/ { print $2 }')
485 [ "$STATUS" == "failed" ] ||
486 error "(4) Expect 'failed', but got '$STATUS'"
488 local POSITION0=$($SHOW_NAMESPACE |
489 awk '/^last_checkpoint_position/ { print $4 }')
491 #define OBD_FAIL_LFSCK_DELAY2 0x1601
492 do_facet $SINGLEMDS $LCTL set_param fail_val=1
493 do_facet $SINGLEMDS $LCTL set_param fail_loc=0x1601
494 $START_NAMESPACE || error "(5) Fail to start LFSCK for namespace!"
496 STATUS=$($SHOW_NAMESPACE | awk '/^status/ { print $2 }')
497 [ "$STATUS" == "scanning-phase1" ] ||
498 error "(6) Expect 'scanning-phase1', but got '$STATUS'"
500 local POSITION1=$($SHOW_NAMESPACE |
501 awk '/^latest_start_position/ { print $4 }')
502 if [ $POSITION0 -gt $POSITION1 ]; then
503 [ $POSITION1 -eq 0 -a $POSITION0 -eq $((POSITION1 + 1)) ] ||
504 error "(7) Expect larger than: $POSITION0, but got $POSITION1"
507 do_facet $SINGLEMDS $LCTL set_param fail_loc=0
508 do_facet $SINGLEMDS $LCTL set_param fail_val=0
510 STATUS=$($SHOW_NAMESPACE | awk '/^status/ { print $2 }')
511 [ "$STATUS" == "completed" ] ||
512 error "(8) Expect 'completed', but got '$STATUS'"
514 run_test 6b "LFSCK resumes from last checkpoint (2)"
519 echo "start $SINGLEMDS"
520 start $SINGLEMDS $MDT_DEVNAME $MOUNT_OPTS_SCRUB > /dev/null ||
521 error "(1) Fail to start MDS!"
523 #define OBD_FAIL_LFSCK_DELAY2 0x1601
524 do_facet $SINGLEMDS $LCTL set_param fail_val=1
525 do_facet $SINGLEMDS $LCTL set_param fail_loc=0x1601
526 $START_NAMESPACE || error "(2) Fail to start LFSCK for namespace!"
528 local STATUS=$($SHOW_NAMESPACE | awk '/^status/ { print $2 }')
529 [ "$STATUS" == "scanning-phase1" ] ||
530 error "(3) Expect 'scanning-phase1', but got '$STATUS'"
532 # Sleep 3 sec to guarantee at least one object processed by LFSCK
534 echo "stop $SINGLEMDS"
535 stop $SINGLEMDS > /dev/null || error "(4) Fail to stop MDS!"
537 echo "start $SINGLEMDS"
538 start $SINGLEMDS $MDT_DEVNAME $MOUNT_OPTS_SCRUB > /dev/null ||
539 error "(5) Fail to start MDS!"
541 STATUS=$($SHOW_NAMESPACE | awk '/^status/ { print $2 }')
542 [ "$STATUS" == "scanning-phase1" ] ||
543 error "(6) Expect 'scanning-phase1', but got '$STATUS'"
545 do_facet $SINGLEMDS $LCTL set_param fail_loc=0
546 do_facet $SINGLEMDS $LCTL set_param fail_val=0
548 STATUS=$($SHOW_NAMESPACE | awk '/^status/ { print $2 }')
549 [ "$STATUS" == "completed" ] ||
550 error "(7) Expect 'completed', but got '$STATUS'"
552 run_test 7a "non-stopped LFSCK should auto restarts after MDS remount (1)"
557 echo "start $SINGLEMDS"
558 start $SINGLEMDS $MDT_DEVNAME $MOUNT_OPTS_SCRUB > /dev/null ||
559 error "(1) Fail to start MDS!"
561 mount_client $MOUNT || error "(2) Fail to start client!"
563 #define OBD_FAIL_LFSCK_LINKEA_MORE 0x1604
564 do_facet $SINGLEMDS $LCTL set_param fail_loc=0x1604
565 for ((i=0; i<10; i++)); do
566 touch $DIR/$tdir/dummy${i}
569 #define OBD_FAIL_LFSCK_DELAY3 0x1602
570 do_facet $SINGLEMDS $LCTL set_param fail_val=1
571 do_facet $SINGLEMDS $LCTL set_param fail_loc=0x1602
572 $START_NAMESPACE || error "(3) Fail to start LFSCK for namespace!"
575 local STATUS=$($SHOW_NAMESPACE | awk '/^status/ { print $2 }')
576 [ "$STATUS" == "scanning-phase2" ] ||
577 error "(4) Expect 'scanning-phase2', but got '$STATUS'"
579 echo "stop $SINGLEMDS"
580 stop $SINGLEMDS > /dev/null || error "(5) Fail to stop MDS!"
582 echo "start $SINGLEMDS"
583 start $SINGLEMDS $MDT_DEVNAME $MOUNT_OPTS_SCRUB > /dev/null ||
584 error "(6) Fail to start MDS!"
586 STATUS=$($SHOW_NAMESPACE | awk '/^status/ { print $2 }')
587 [ "$STATUS" == "scanning-phase2" ] ||
588 error "(7) Expect 'scanning-phase2', but got '$STATUS'"
590 do_facet $SINGLEMDS $LCTL set_param fail_loc=0
591 do_facet $SINGLEMDS $LCTL set_param fail_val=0
593 STATUS=$($SHOW_NAMESPACE | awk '/^status/ { print $2 }')
594 [ "$STATUS" == "completed" ] ||
595 error "(8) Expect 'completed', but got '$STATUS'"
597 run_test 7b "non-stopped LFSCK should auto restarts after MDS remount (2)"
602 echo "start $SINGLEMDS"
603 start $SINGLEMDS $MDT_DEVNAME $MOUNT_OPTS_SCRUB > /dev/null ||
604 error "(1) Fail to start MDS!"
606 local STATUS=$($SHOW_NAMESPACE | awk '/^status/ { print $2 }')
607 [ "$STATUS" == "init" ] ||
608 error "(2) Expect 'init', but got '$STATUS'"
610 mount_client $MOUNT || error "(3) Fail to start client!"
612 #define OBD_FAIL_LFSCK_LINKEA_CRASH 0x1603
613 do_facet $SINGLEMDS $LCTL set_param fail_loc=0x1603
614 mkdir $DIR/$tdir/crashed
616 #define OBD_FAIL_LFSCK_LINKEA_MORE 0x1604
617 do_facet $SINGLEMDS $LCTL set_param fail_loc=0x1604
618 for ((i=0; i<5; i++)); do
619 touch $DIR/$tdir/dummy${i}
622 #define OBD_FAIL_LFSCK_DELAY2 0x1601
623 do_facet $SINGLEMDS $LCTL set_param fail_val=2
624 do_facet $SINGLEMDS $LCTL set_param fail_loc=0x1601
625 $START_NAMESPACE || error "(4) Fail to start LFSCK for namespace!"
627 STATUS=$($SHOW_NAMESPACE | awk '/^status/ { print $2 }')
628 [ "$STATUS" == "scanning-phase1" ] ||
629 error "(5) Expect 'scanning-phase1', but got '$STATUS'"
631 $STOP_LFSCK || error "(6) Fail to stop LFSCK!"
633 STATUS=$($SHOW_NAMESPACE | awk '/^status/ { print $2 }')
634 [ "$STATUS" == "stopped" ] ||
635 error "(7) Expect 'stopped', but got '$STATUS'"
637 $START_NAMESPACE || error "(8) Fail to start LFSCK for namespace!"
639 STATUS=$($SHOW_NAMESPACE | awk '/^status/ { print $2 }')
640 [ "$STATUS" == "scanning-phase1" ] ||
641 error "(9) Expect 'scanning-phase1', but got '$STATUS'"
643 #define OBD_FAIL_LFSCK_FATAL2 0x1609
644 do_facet $SINGLEMDS $LCTL set_param fail_loc=0x80001609
646 STATUS=$($SHOW_NAMESPACE | awk '/^status/ { print $2 }')
647 [ "$STATUS" == "failed" ] ||
648 error "(10) Expect 'failed', but got '$STATUS'"
650 #define OBD_FAIL_LFSCK_DELAY1 0x1600
651 do_facet $SINGLEMDS $LCTL set_param fail_loc=0x1600
652 $START_NAMESPACE || error "(11) Fail to start LFSCK for namespace!"
654 STATUS=$($SHOW_NAMESPACE | awk '/^status/ { print $2 }')
655 [ "$STATUS" == "scanning-phase1" ] ||
656 error "(12) Expect 'scanning-phase1', but got '$STATUS'"
658 #define OBD_FAIL_LFSCK_CRASH 0x160a
659 do_facet $SINGLEMDS $LCTL set_param fail_loc=0x160a
662 echo "stop $SINGLEMDS"
663 stop $SINGLEMDS > /dev/null || error "(13) Fail to stop MDS!"
665 #define OBD_FAIL_LFSCK_NO_AUTO 0x160b
666 do_facet $SINGLEMDS $LCTL set_param fail_loc=0x160b
668 echo "start $SINGLEMDS"
669 start $SINGLEMDS $MDT_DEVNAME $MOUNT_OPTS_SCRUB > /dev/null ||
670 error "(14) Fail to start MDS!"
672 STATUS=$($SHOW_NAMESPACE | awk '/^status/ { print $2 }')
673 [ "$STATUS" == "crashed" ] ||
674 error "(15) Expect 'crashed', but got '$STATUS'"
676 #define OBD_FAIL_LFSCK_DELAY2 0x1601
677 do_facet $SINGLEMDS $LCTL set_param fail_loc=0x1601
678 $START_NAMESPACE || error "(16) Fail to start LFSCK for namespace!"
680 STATUS=$($SHOW_NAMESPACE | awk '/^status/ { print $2 }')
681 [ "$STATUS" == "scanning-phase1" ] ||
682 error "(17) Expect 'scanning-phase1', but got '$STATUS'"
684 echo "stop $SINGLEMDS"
685 stop $SINGLEMDS > /dev/null || error "(18) Fail to stop MDS!"
687 #define OBD_FAIL_LFSCK_NO_AUTO 0x160b
688 do_facet $SINGLEMDS $LCTL set_param fail_loc=0x160b
690 echo "start $SINGLEMDS"
691 start $SINGLEMDS $MDT_DEVNAME $MOUNT_OPTS_SCRUB > /dev/null ||
692 error "(19) Fail to start MDS!"
694 STATUS=$($SHOW_NAMESPACE | awk '/^status/ { print $2 }')
695 [ "$STATUS" == "paused" ] ||
696 error "(20) Expect 'paused', but got '$STATUS'"
698 #define OBD_FAIL_LFSCK_DELAY3 0x1602
699 do_facet $SINGLEMDS $LCTL set_param fail_val=2
700 do_facet $SINGLEMDS $LCTL set_param fail_loc=0x1602
702 $START_NAMESPACE || error "(21) Fail to start LFSCK for namespace!"
704 STATUS=$($SHOW_NAMESPACE | awk '/^status/ { print $2 }')
705 [ "$STATUS" == "scanning-phase2" ] ||
706 error "(22) Expect 'scanning-phase2', but got '$STATUS'"
708 local FLAGS=$($SHOW_NAMESPACE | awk '/^flags/ { print $2 }')
709 [ "$FLAGS" == "scanned-once,inconsistent" ] ||
710 error "(23) Expect 'scanned-once,inconsistent',but got '$FLAGS'"
712 do_facet $SINGLEMDS $LCTL set_param fail_loc=0
713 do_facet $SINGLEMDS $LCTL set_param fail_val=0
715 STATUS=$($SHOW_NAMESPACE | awk '/^status/ { print $2 }')
716 [ "$STATUS" == "completed" ] ||
717 error "(24) Expect 'completed', but got '$STATUS'"
719 FLAGS=$($SHOW_NAMESPACE | awk '/^flags/ { print $2 }')
720 [ -z "$FLAGS" ] || error "(25) Expect empty flags, but got '$FLAGS'"
723 run_test 8 "LFSCK state machine"
726 if [ -z "$(grep "processor.*: 1" /proc/cpuinfo)" ]; then
727 skip "Testing on UP system, the speed may be inaccurate."
732 echo "start $SINGLEMDS"
733 start $SINGLEMDS $MDT_DEVNAME $MOUNT_OPTS_SCRUB > /dev/null ||
734 error "(1) Fail to start MDS!"
736 local STATUS=$($SHOW_NAMESPACE | awk '/^status/ { print $2 }')
737 [ "$STATUS" == "init" ] ||
738 error "(2) Expect 'init', but got '$STATUS'"
740 local BASE_SPEED1=100
742 $START_NAMESPACE -s $BASE_SPEED1 || error "(3) Fail to start LFSCK!"
745 STATUS=$($SHOW_NAMESPACE | awk '/^status/ { print $2 }')
746 [ "$STATUS" == "scanning-phase1" ] ||
747 error "(3) Expect 'scanning-phase1', but got '$STATUS'"
749 local SPEED=$($SHOW_NAMESPACE |
750 awk '/^average_speed_phase1/ { print $2 }')
752 # There may be time error, normally it should be less than 2 seconds.
753 # We allow another 20% schedule error.
755 # MAX_MARGIN = 1.2 = 12 / 10
756 local MAX_SPEED=$((BASE_SPEED1 * (RUN_TIME1 + TIME_DIFF) / \
757 RUN_TIME1 * 12 / 10))
758 [ $SPEED -lt $MAX_SPEED ] ||
759 error "(4) Got speed $SPEED, expected less than $MAX_SPEED"
762 local BASE_SPEED2=300
764 do_facet $SINGLEMDS \
765 $LCTL set_param -n mdd.${MDT_DEV}.lfsck_speed_limit $BASE_SPEED2
768 SPEED=$($SHOW_NAMESPACE | awk '/^average_speed_phase1/ { print $2 }')
769 # MIN_MARGIN = 0.8 = 8 / 10
770 local MIN_SPEED=$(((BASE_SPEED1 * (RUN_TIME1 - TIME_DIFF) + \
771 BASE_SPEED2 * (RUN_TIME2 - TIME_DIFF)) / \
772 (RUN_TIME1 + RUN_TIME2) * 8 / 10))
773 [ $SPEED -gt $MIN_SPEED ] ||
774 error "(5) Got speed $SPEED, expected more than $MIN_SPEED"
776 # MAX_MARGIN = 1.2 = 12 / 10
777 MAX_SPEED=$(((BASE_SPEED1 * (RUN_TIME1 + TIME_DIFF) + \
778 BASE_SPEED2 * (RUN_TIME2 + TIME_DIFF)) / \
779 (RUN_TIME1 + RUN_TIME2) * 12 / 10))
780 [ $SPEED -lt $MAX_SPEED ] ||
781 error "(6) Got speed $SPEED, expected less than $MAX_SPEED"
783 do_facet $SINGLEMDS \
784 $LCTL set_param -n mdd.${MDT_DEV}.lfsck_speed_limit 0
786 STATUS=$($SHOW_NAMESPACE | awk '/^status/ { print $2 }')
787 [ "$STATUS" == "completed" ] ||
788 error "(7) Expect 'completed', but got '$STATUS'"
790 run_test 9a "LFSCK speed control (1)"
793 if [ -z "$(grep "processor.*: 1" /proc/cpuinfo)" ]; then
794 skip "Testing on UP system, the speed may be inaccurate."
799 echo "start $SINGLEMDS"
800 start $SINGLEMDS $MDT_DEVNAME $MOUNT_OPTS_SCRUB > /dev/null ||
801 error "(1) Fail to start MDS!"
803 mount_client $MOUNT || error "(2) Fail to start client!"
805 echo "Another preparing... 50 * 50 files (with error) will be created."
806 #define OBD_FAIL_LFSCK_LINKEA_MORE 0x1604
807 do_facet $SINGLEMDS $LCTL set_param fail_loc=0x1604
808 for ((i=0; i<50; i++)); do
809 mkdir -p $DIR/$tdir/d${i}
810 touch $DIR/$tdir/f${i}
811 for ((j=0; j<50; j++)); do
812 touch $DIR/$tdir/d${i}/f${j}
816 local STATUS=$($SHOW_NAMESPACE | awk '/^status/ { print $2 }')
817 [ "$STATUS" == "init" ] ||
818 error "(3) Expect 'init', but got '$STATUS'"
820 #define OBD_FAIL_LFSCK_NO_DOUBLESCAN 0x160c
821 do_facet $SINGLEMDS $LCTL set_param fail_loc=0x160c
822 $START_NAMESPACE || error "(4) Fail to start LFSCK!"
825 STATUS=$($SHOW_NAMESPACE | awk '/^status/ { print $2 }')
826 [ "$STATUS" == "stopped" ] ||
827 error "(5) Expect 'stopped', but got '$STATUS'"
829 do_facet $SINGLEMDS $LCTL set_param fail_loc=0
833 $START_NAMESPACE -s $BASE_SPEED1 || error "(6) Fail to start LFSCK!"
836 STATUS=$($SHOW_NAMESPACE | awk '/^status/ { print $2 }')
837 [ "$STATUS" == "scanning-phase2" ] ||
838 error "(7) Expect 'scanning-phase2', but got '$STATUS'"
840 local SPEED=$($SHOW_NAMESPACE |
841 awk '/^average_speed_phase2/ { print $2 }')
842 # There may be time error, normally it should be less than 2 seconds.
843 # We allow another 20% schedule error.
845 # MAX_MARGIN = 1.2 = 12 / 10
846 local MAX_SPEED=$((BASE_SPEED1 * (RUN_TIME1 + TIME_DIFF) / \
847 RUN_TIME1 * 12 / 10))
848 [ $SPEED -lt $MAX_SPEED ] ||
849 error "(8) Got speed $SPEED, expected less than $MAX_SPEED"
852 local BASE_SPEED2=150
854 do_facet $SINGLEMDS \
855 $LCTL set_param -n mdd.${MDT_DEV}.lfsck_speed_limit $BASE_SPEED2
858 SPEED=$($SHOW_NAMESPACE | awk '/^average_speed_phase2/ { print $2 }')
859 # MIN_MARGIN = 0.8 = 8 / 10
860 local MIN_SPEED=$(((BASE_SPEED1 * (RUN_TIME1 - TIME_DIFF) + \
861 BASE_SPEED2 * (RUN_TIME2 - TIME_DIFF)) / \
862 (RUN_TIME1 + RUN_TIME2) * 8 / 10))
863 [ $SPEED -gt $MIN_SPEED ] ||
864 error "(9) Got speed $SPEED, expected more than $MIN_SPEED"
866 # MAX_MARGIN = 1.2 = 12 / 10
867 MAX_SPEED=$(((BASE_SPEED1 * (RUN_TIME1 + TIME_DIFF) + \
868 BASE_SPEED2 * (RUN_TIME2 + TIME_DIFF)) / \
869 (RUN_TIME1 + RUN_TIME2) * 12 / 10))
870 [ $SPEED -lt $MAX_SPEED ] ||
871 error "(10) Got speed $SPEED, expected less than $MAX_SPEED"
873 do_facet $SINGLEMDS \
874 $LCTL set_param -n mdd.${MDT_DEV}.lfsck_speed_limit 0
876 STATUS=$($SHOW_NAMESPACE | awk '/^status/ { print $2 }')
877 [ "$STATUS" == "completed" ] ||
878 error "(11) Expect 'completed', but got '$STATUS'"
880 run_test 9b "LFSCK speed control (2)"
885 echo "start $SINGLEMDS"
886 start $SINGLEMDS $MDT_DEVNAME $MOUNT_OPTS_SCRUB > /dev/null ||
887 error "(1) Fail to start MDS!"
889 mount_client $MOUNT || error "(2) Fail to start client!"
891 #define OBD_FAIL_LFSCK_LINKEA_CRASH 0x1603
892 do_facet $SINGLEMDS $LCTL set_param fail_loc=0x1603
893 for ((i=0; i<1000; i=$((i+2)))); do
894 mkdir -p $DIR/$tdir/d${i}
895 touch $DIR/$tdir/f${i}
896 for ((j=0; j<5; j++)); do
897 touch $DIR/$tdir/d${i}/f${j}
901 #define OBD_FAIL_LFSCK_LINKEA_MORE 0x1604
902 do_facet $SINGLEMDS $LCTL set_param fail_loc=0x1604
903 for ((i=1; i<1000; i=$((i+2)))); do
904 mkdir -p $DIR/$tdir/d${i}
905 touch $DIR/$tdir/f${i}
906 for ((j=0; j<5; j++)); do
907 touch $DIR/$tdir/d${i}/f${j}
911 do_facet $SINGLEMDS $LCTL set_param fail_loc=0
912 ln $DIR/$tdir/f200 $DIR/$tdir/d200/dummy
915 mount_client $MOUNT || error "(3) Fail to start client!"
917 local STATUS=$($SHOW_NAMESPACE | awk '/^status/ { print $2 }')
918 [ "$STATUS" == "init" ] ||
919 error "(4) Expect 'init', but got '$STATUS'"
921 $START_NAMESPACE -s 100 || error "(5) Fail to start LFSCK!"
924 STATUS=$($SHOW_NAMESPACE | awk '/^status/ { print $2 }')
925 [ "$STATUS" == "scanning-phase1" ] ||
926 error "(6) Expect 'scanning-phase1', but got '$STATUS'"
928 ls -ailR $MOUNT > /dev/null || error "(7) Fail to ls!"
930 touch $DIR/$tdir/d198/a0 || error "(8) Fail to touch!"
932 mkdir $DIR/$tdir/d199/a1 || error "(9) Fail to mkdir!"
934 unlink $DIR/$tdir/f200 || error "(10) Fail to unlink!"
936 rm -rf $DIR/$tdir/d201 || error "(11) Fail to rmdir!"
938 mv $DIR/$tdir/f202 $DIR/$tdir/d203/ || error "(12) Fail to rename!"
940 ln $DIR/$tdir/f204 $DIR/$tdir/d205/a3 || error "(13) Fail to hardlink!"
942 ln -s $DIR/$tdir/d206 $DIR/$tdir/d207/a4 ||
943 error "(14) Fail to softlink!"
945 STATUS=$($SHOW_NAMESPACE | awk '/^status/ { print $2 }')
946 [ "$STATUS" == "scanning-phase1" ] ||
947 error "(15) Expect 'scanning-phase1', but got '$STATUS'"
949 do_facet $SINGLEMDS \
950 $LCTL set_param -n mdd.${MDT_DEV}.lfsck_speed_limit 0
953 STATUS=$($SHOW_NAMESPACE | awk '/^status/ { print $2 }')
954 [ "$STATUS" == "completed" ] ||
955 error "(16) Expect 'completed', but got '$STATUS'"
957 run_test 10 "System is available during LFSCK scanning"
959 $LCTL set_param debug=-lfsck > /dev/null || true
961 # restore MDS/OST size
962 MDSSIZE=${SAVED_MDSSIZE}
963 OSTSIZE=${SAVED_OSTSIZE}
965 # cleanup the system at last