LUSTRE=${LUSTRE:-$(dirname $0)/..}
. $LUSTRE/tests/test-framework.sh
-init_test_env $@
+init_test_env "$@"
init_logging
# bug number for skipped test:
# build up a clean test environment.
REFORMAT="yes" check_and_setup_lustre
-MDT_DEV="${FSNAME}-MDT0000"
+MDT_DEV=$(devicelabel $SINGLEMDS $(facet_device $SINGLEMDS))
OST_DEV="${FSNAME}-OST0000"
-MDT_DEVNAME=$(mdsdevname ${SINGLEMDS//mds/})
START_NAMESPACE="do_facet $SINGLEMDS \
$LCTL lfsck_start -M ${MDT_DEV} -t namespace"
START_LAYOUT="do_facet $SINGLEMDS \
$LCTL get_param -n obdfilter.${OST_DEV}.lfsck_layout"
MOUNT_OPTS_SCRUB="$MDS_MOUNT_OPTS -o user_xattr"
MOUNT_OPTS_NOSCRUB="$MDS_MOUNT_OPTS -o user_xattr,noscrub"
-MOUNT_OPTS_SKIP_LFSCK="-o user_xattr,skip_lfsck"
+MOUNT_OPTS_SKIP_LFSCK="$MDS_MOUNT_OPTS -o user_xattr,skip_lfsck"
lfsck_prep() {
local ndirs=$1
echo "prepared $(date)."
}
-run_e2fsck_on_mdt0() {
+start_facet () {
+ local facet=$1
+ local opts=$2
+ local err=$3
+ local dev=$(facet_device $facet)
+
+ start $facet $dev $opts > /dev/null ||
+ error "($err) Fail to start $facet!"
+}
+
+run_e2fsck_on_mds_facet() {
[ $mds1_FSTYPE == ldiskfs ] || return 0
- stop $SINGLEMDS > /dev/null || error "(0) Fail to the stop MDT0"
- run_e2fsck $(facet_active_host $SINGLEMDS) $(mdsdevname 1) "-n" |
+ local mds=$1
+
+ stop $mds > /dev/null || error "(0) Fail to the stop $mds"
+ local host=$(facet_active_host $mds)
+ local dev=$(facet_device $mds)
+
+ run_e2fsck $host $dev "-n" |
grep "Fix? no" && {
- run_e2fsck $(facet_active_host $SINGLEMDS) $(mdsdevname 1) "-n"
- error "(2) Detected inconsistency on MDT0"
+ run_e2fsck $host $dev "-n"
+ error "(2) Detected inconsistency on $mds"
}
- start $SINGLEMDS $MDT_DEVNAME $MOUNT_OPTS_NOSCRUB > /dev/null ||
- error "(3) Fail to start MDT0"
+ start_facet $mds "$MOUNT_OPTS_NOSCRUB" 3
}
wait_all_targets_blocked() {
[ $repaired -eq 1 ] ||
error "(5) Fail to repair crashed FID-in-dirent: $repaired"
- run_e2fsck_on_mdt0
+ run_e2fsck_on_mds_facet $SINGLEMDS
mount_client $MOUNT || error "(6) Fail to start client!"
error "(5) Fail to repair the missing FID-in-LMA: $repaired"
do_facet $SINGLEMDS $LCTL set_param fail_loc=0
- run_e2fsck_on_mdt0
+ run_e2fsck_on_mds_facet $SINGLEMDS
mount_client $MOUNT || error "(6) Fail to start client!"
[ $repaired -eq 1 ] ||
error "(5) Fail to repair lost FID-in-dirent: $repaired"
- run_e2fsck_on_mdt0
+ run_e2fsck_on_mds_facet $SINGLEMDS
mount_client $MOUNT || error "(6) Fail to start client!"
}
run_test 1c "LFSCK can find out and repair lost FID-in-dirent"
+test_1d() {
+ [ $MDS1_VERSION -lt $(version_code 2.13.57) ] &&
+ skip "MDS older than 2.13.57"
+ [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs"
+
+ check_mount_and_prep
+
+ touch $DIR/$tdir/$tfile
+ mkdir $DIR/$tdir/subdir
+ $LFS mkdir -i 1 $DIR/$tdir/remotedir
+ $LFS path2fid $DIR/$tdir
+ ll_decode_linkea $DIR/$tdir/$tfile
+ ll_decode_linkea $DIR/$tdir/subdir
+ ll_decode_linkea $DIR/$tdir/remotedir
+
+ local mntpt=$(facet_mntpt mds1)
+
+ # unlink OI files to remove the stale entry
+ local saved_opts=$MDS_MOUNT_OPTS
+
+ stopall
+ mount_fstype mds1 $mntpt
+ # increase $tdir FID oid in LMA
+ do_facet mds1 "getfattr -d -m trusted.lma -e hex \
+ --absolute-names $mntpt/ROOT/$tdir | \
+ sed -E 's/0(.{8})$/1\1/' | setfattr --restore=-"
+ unmount_fstype mds1 $mntpt
+ setupall
+
+ # the FID oid in LMA was increased above, and it's not in OI table,
+ # run scrub first to generate mapping in OI, so the following namespace
+ # check can fix linkea correctly, this is not necessary normally.
+ do_facet mds1 $LCTL lfsck_start -M ${MDT_DEV} -t scrub ||
+ error "failed to start LFSCK for scrub!"
+ wait_update_facet mds1 "$LCTL get_param -n \
+ osd-*.$(facet_svc mds1).oi_scrub |
+ awk '/^status/ { print \\\$2 }'" "completed" 32 ||
+ error "unexpected status"
+
+ $START_NAMESPACE -r -A || error "fail to start LFSCK for namespace!"
+ wait_update_facet mds1 "$LCTL get_param -n \
+ mdd.${MDT_DEV}.lfsck_namespace |
+ awk '/^status/ { print \\\$2 }'" "completed" 32 || {
+ $SHOW_NAMESPACE
+ error "unexpected status"
+ }
+ $LFS path2fid $DIR/$tdir
+ ll_decode_linkea $DIR/$tdir/$tfile
+ ll_decode_linkea $DIR/$tdir/subdir
+ ll_decode_linkea $DIR/$tdir/remotedir
+
+ local pfid
+ local fid
+
+ fid=$($LFS path2fid $DIR/$tdir)
+ for f in $tfile subdir remotedir; do
+ pfid=$(ll_decode_linkea $DIR/$tdir/$f |
+ awk '/pfid/ { print $3 }')
+ pfid=${pfid%,}
+ [ "$pfid" == "$fid" ] || error "$fid in LMA != $pfid in linkea"
+ done
+}
+run_test 1d "LFSCK can fix mismatch of FID in LMA and FID in child linkea"
+
test_2a() {
lfsck_prep 1 1
[ $repaired -eq 1 ] ||
error "(5) Fail to repair crashed linkEA: $repaired"
- run_e2fsck_on_mdt0
+ run_e2fsck_on_mds_facet $SINGLEMDS
mount_client $MOUNT || error "(6) Fail to start client!"
[ $repaired -eq 1 ] ||
error "(5) Fail to repair crashed linkEA: $repaired"
- run_e2fsck_on_mdt0
+ run_e2fsck_on_mds_facet $SINGLEMDS
mount_client $MOUNT || error "(6) Fail to start client!"
[ $repaired -eq 1 ] ||
error "(5) Fail to repair crashed linkEA: $repaired"
- run_e2fsck_on_mdt0
+ run_e2fsck_on_mds_facet $SINGLEMDS
mount_client $MOUNT || error "(6) Fail to start client!"
[ $repaired -eq 1 ] ||
error "(5) Fail to repair crashed linkEA: $repaired"
- run_e2fsck_on_mdt0
+ run_e2fsck_on_mds_facet $SINGLEMDS
mount_client $MOUNT || error "(6) Fail to start client!"
lfsck_prep 3 3
cleanup_mount $MOUNT || error "(0.1) Fail to stop client!"
- stop $SINGLEMDS > /dev/null || error "(0.2) Fail to stop MDS!"
+ stop $SINGLEMDS > /dev/null || error "(0.2) Fail to stop $SINGLEMDS!"
mds_backup_restore $SINGLEMDS || error "(1) Fail to backup/restore!"
echo "start $SINGLEMDS with disabling OI scrub"
- start $SINGLEMDS $MDT_DEVNAME $MOUNT_OPTS_NOSCRUB > /dev/null ||
- error "(2) Fail to start MDS!"
+ start_facet $SINGLEMDS "$MOUNT_OPTS_NOSCRUB" 2
#define OBD_FAIL_LFSCK_DELAY2 0x1601
do_facet $SINGLEMDS $LCTL set_param fail_val=1 fail_loc=0x1601
error "(7) unexpected status"
}
- FLAGS=$($SHOW_NAMESPACE | awk '/^flags/ { print $2 }')
+ local FLAGS=$($SHOW_NAMESPACE | awk '/^flags/ { print $2 }')
[ -z "$FLAGS" ] || error "(8) Expect empty flags, but got '$FLAGS'"
local repaired=$($SHOW_NAMESPACE |
[ $repaired -ge 9 ] ||
error "(9) Fail to re-generate FID-in-dirent: $repaired"
- run_e2fsck_on_mdt0
+ run_e2fsck_on_mds_facet $SINGLEMDS
mount_client $MOUNT || error "(10) Fail to start client!"
lfsck_prep 1 1 1
cleanup_mount $MOUNT || error "(0.1) Fail to stop client!"
- stop $SINGLEMDS > /dev/null || error "(0.2) Fail to stop MDS!"
+ stop $SINGLEMDS > /dev/null || error "(0.2) Fail to stop $SINGLEMDS!"
mds_backup_restore $SINGLEMDS 1 || error "(1) Fail to backup/restore!"
echo "start $SINGLEMDS with disabling OI scrub"
- start $SINGLEMDS $MDT_DEVNAME $MOUNT_OPTS_NOSCRUB > /dev/null ||
- error "(2) Fail to start MDS!"
+ start_facet $SINGLEMDS "$MOUNT_OPTS_NOSCRUB" 2
#define OBD_FAIL_LFSCK_DELAY2 0x1601
do_facet $SINGLEMDS $LCTL set_param fail_val=1 fail_loc=0x1601
error "(7) unexpected status"
}
- FLAGS=$($SHOW_NAMESPACE | awk '/^flags/ { print $2 }')
+ local FLAGS=$($SHOW_NAMESPACE | awk '/^flags/ { print $2 }')
[ -z "$FLAGS" ] || error "(8) Expect empty flags, but got '$FLAGS'"
local repaired=$($SHOW_NAMESPACE |
[ $repaired -ge 2 ] ||
error "(9) Fail to generate FID-in-dirent for IGIF: $repaired"
- run_e2fsck_on_mdt0
+ run_e2fsck_on_mds_facet $SINGLEMDS
mount_client $MOUNT || error "(10) Fail to start client!"
# Sleep 3 sec to guarantee at least one object processed by LFSCK
sleep 3
echo "stop $SINGLEMDS"
- stop $SINGLEMDS > /dev/null || error "(4) Fail to stop MDS!"
+ stop $SINGLEMDS > /dev/null || error "(4) Fail to stop $SINGLEMDS!"
do_facet $SINGLEMDS $LCTL set_param fail_loc=0 fail_val=0
echo "start $SINGLEMDS"
- start $SINGLEMDS $MDT_DEVNAME $MOUNT_OPTS_SCRUB > /dev/null ||
- error "(5) Fail to start MDS!"
+ start_facet $SINGLEMDS "$MOUNT_OPTS_SCRUB" 5
wait_update_facet $SINGLEMDS "$LCTL get_param -n \
mdd.${MDT_DEV}.lfsck_namespace |
umount_client $MOUNT
echo "stop $SINGLEMDS"
- stop $SINGLEMDS > /dev/null || error "(5) Fail to stop MDS!"
+ stop $SINGLEMDS > /dev/null || error "(5) Fail to stop $SINGLEMDS!"
do_facet $SINGLEMDS $LCTL set_param fail_loc=0 fail_val=0
echo "start $SINGLEMDS"
- start $SINGLEMDS $MDT_DEVNAME $MOUNT_OPTS_SCRUB > /dev/null ||
- error "(6) Fail to start MDS!"
+ start_facet $SINGLEMDS "$MOUNT_OPTS_SCRUB" 6
wait_update_facet $SINGLEMDS "$LCTL get_param -n \
mdd.${MDT_DEV}.lfsck_namespace |
}
run_test 7b "non-stopped LFSCK should auto restarts after MDS remount (2)"
+namespace_error()
+{
+ $SHOW_NAMESPACE
+ error "$@"
+}
+
test_8()
{
echo "formatall"
local STATUS=$($SHOW_NAMESPACE | awk '/^status/ { print $2 }')
[ "$STATUS" == "init" ] ||
- error "(2) Expect 'init', but got '$STATUS'"
+ namespace_error "(2) Expect 'init', but got '$STATUS'"
#define OBD_FAIL_LFSCK_LINKEA_CRASH 0x1603
do_facet $SINGLEMDS $LCTL set_param fail_loc=0x1603
#define OBD_FAIL_LFSCK_DELAY2 0x1601
do_facet $SINGLEMDS $LCTL set_param fail_val=2 fail_loc=0x1601
- $START_NAMESPACE || error "(4) Fail to start LFSCK for namespace!"
+ $START_NAMESPACE ||
+ namespace_error "(4) Fail to start LFSCK for namespace!"
STATUS=$($SHOW_NAMESPACE | awk '/^status/ { print $2 }')
[ "$STATUS" == "scanning-phase1" ] ||
- error "(5) Expect 'scanning-phase1', but got '$STATUS'"
+ namespace_error "(5) Expect 'scanning-phase1', but got '$STATUS'"
- $STOP_LFSCK || error "(6) Fail to stop LFSCK!"
+ $STOP_LFSCK || namespace_error "(6) Fail to stop LFSCK!"
STATUS=$($SHOW_NAMESPACE | awk '/^status/ { print $2 }')
[ "$STATUS" == "stopped" ] ||
- error "(7) Expect 'stopped', but got '$STATUS'"
+ namespace_error "(7) Expect 'stopped', but got '$STATUS'"
- $START_NAMESPACE || error "(8) Fail to start LFSCK for namespace!"
+ $START_NAMESPACE ||
+ namespace_error "(8) Fail to start LFSCK for namespace!"
STATUS=$($SHOW_NAMESPACE | awk '/^status/ { print $2 }')
[ "$STATUS" == "scanning-phase1" ] ||
- error "(9) Expect 'scanning-phase1', but got '$STATUS'"
+ namespace_error "(9) Expect 'scanning-phase1', but got '$STATUS'"
#define OBD_FAIL_LFSCK_FATAL2 0x1609
do_facet $SINGLEMDS $LCTL set_param fail_loc=0x80001609
mdd.${MDT_DEV}.lfsck_namespace |
awk '/^status/ { print \\\$2 }'" "failed" 32 || {
$SHOW_NAMESPACE
- error "(10) unexpected status"
+ namespace_error "(10) unexpected status"
}
#define OBD_FAIL_LFSCK_DELAY1 0x1600
do_facet $SINGLEMDS $LCTL set_param fail_loc=0x1600
- $START_NAMESPACE || error "(11) Fail to start LFSCK for namespace!"
+ $START_NAMESPACE ||
+ namespace_error "(11) Fail to start LFSCK for namespace!"
STATUS=$($SHOW_NAMESPACE | awk '/^status/ { print $2 }')
[ "$STATUS" == "scanning-phase1" ] ||
- error "(12) Expect 'scanning-phase1', but got '$STATUS'"
+ namespace_error "(12) Expect 'scanning-phase1', but got '$STATUS'"
#define OBD_FAIL_LFSCK_CRASH 0x160a
do_facet $SINGLEMDS $LCTL set_param fail_loc=0x160a
sleep 5
echo "stop $SINGLEMDS"
- stop $SINGLEMDS > /dev/null || error "(13) Fail to stop MDS!"
+ stop $SINGLEMDS > /dev/null || namespace_error "(13) Fail to stop MDS!"
#define OBD_FAIL_LFSCK_NO_AUTO 0x160b
do_facet $SINGLEMDS $LCTL set_param fail_loc=0x160b
echo "start $SINGLEMDS"
- start $SINGLEMDS $MDT_DEVNAME $MOUNT_OPTS_SCRUB > /dev/null ||
- error "(14) Fail to start MDS!"
+ start_facet $SINGLEMDS "$MOUNT_OPTS_SCRUB" 14
local timeout=$(max_recovery_time)
local timer=0
timer=$((timer + 1))
done
- [ $timer != $timeout ] ||
+ [ $timer != $timeout ] || (
+ do_facet $SINGLEMDS "$LCTL get_param -n \
+ mdt.${MDT_DEV}.recovery_status"
error "(14.1) recovery timeout"
+ )
STATUS=$($SHOW_NAMESPACE | awk '/^status/ { print $2 }')
[ "$STATUS" == "crashed" ] ||
- error "(15) Expect 'crashed', but got '$STATUS'"
+ namespace_error "(15) Expect 'crashed', but got '$STATUS'"
#define OBD_FAIL_LFSCK_DELAY2 0x1601
do_facet $SINGLEMDS $LCTL set_param fail_loc=0x1601
- $START_NAMESPACE || error "(16) Fail to start LFSCK for namespace!"
+ $START_NAMESPACE ||
+ namespace_error "(16) Fail to start LFSCK for namespace!"
STATUS=$($SHOW_NAMESPACE | awk '/^status/ { print $2 }')
[ "$STATUS" == "scanning-phase1" ] ||
- error "(17) Expect 'scanning-phase1', but got '$STATUS'"
+ namespace_error "(17) Expect 'scanning-phase1', but got '$STATUS'"
echo "stop $SINGLEMDS"
- stop $SINGLEMDS > /dev/null || error "(18) Fail to stop MDS!"
+ stop $SINGLEMDS > /dev/null || error "(18) Fail to stop $SINGLEMDS!"
#define OBD_FAIL_LFSCK_NO_AUTO 0x160b
do_facet $SINGLEMDS $LCTL set_param fail_loc=0x160b
echo "start $SINGLEMDS"
- start $SINGLEMDS $MDT_DEVNAME $MOUNT_OPTS_SCRUB > /dev/null ||
- error "(19) Fail to start MDS!"
+ start_facet $SINGLEMDS "$MOUNT_OPTS_SCRUB" 19
timer=0
while [ $timer -lt $timeout ]; do
timer=$((timer + 1))
done
- [ $timer != $timeout ] ||
+ [ $timer != $timeout ] || (
+ do_facet $SINGLEMDS "$LCTL get_param -n \
+ mdt.${MDT_DEV}.recovery_status"
error "(19.1) recovery timeout"
+ )
STATUS=$($SHOW_NAMESPACE | awk '/^status/ { print $2 }')
[ "$STATUS" == "paused" ] ||
- error "(20) Expect 'paused', but got '$STATUS'"
+ namespace_error "(20) Expect 'paused', but got '$STATUS'"
echo "stop $SINGLEMDS"
stop $SINGLEMDS > /dev/null || error "(20.1) Fail to stop MDS!"
echo "start $SINGLEMDS without resume LFSCK"
- start $SINGLEMDS $MDT_DEVNAME $MOUNT_OPTS_SKIP_LFSCK > /dev/null ||
- error "(20.2) Fail to start MDS!"
+ start_facet $SINGLEMDS "$MOUNT_OPTS_SKIP_LFSCK" 20.2
timer=0
while [ $timer -lt $timeout ]; do
timer=$((timer + 1))
done
- [ $timer != $timeout ] ||
+ [ $timer != $timeout ] || (
+ do_facet $SINGLEMDS "$LCTL get_param -n \
+ mdt.${MDT_DEV}.recovery_status"
error "(20.3) recovery timeout"
+ )
STATUS=$($SHOW_NAMESPACE | awk '/^status/ { print $2 }')
[ "$STATUS" == "paused" ] ||
- error "(20.4) Expect 'paused', but got '$STATUS'"
+ namespace_error "(20.4) Expect 'paused', but got '$STATUS'"
#define OBD_FAIL_LFSCK_DELAY3 0x1602
do_facet $SINGLEMDS $LCTL set_param fail_val=2 fail_loc=0x1602
- $START_NAMESPACE || error "(21) Fail to start LFSCK for namespace!"
+ $START_NAMESPACE ||
+ namespace_error "(21) Fail to start LFSCK for namespace!"
wait_update_facet $SINGLEMDS "$LCTL get_param -n \
mdd.${MDT_DEV}.lfsck_namespace |
awk '/^status/ { print \\\$2 }'" "scanning-phase2" 32 || {
$SHOW_NAMESPACE
- error "(22) unexpected status"
+ namespace_error "(22) unexpected status"
}
+ # wait to process one inode at least (OBD_FAIL_LFSCK_DELAY3)
+ sleep 3
+
local FLAGS=$($SHOW_NAMESPACE | awk '/^flags/ { print $2 }')
[ "$FLAGS" == "scanned-once,inconsistent" ] ||
- error "(23) Expect 'scanned-once,inconsistent',but got '$FLAGS'"
+ namespace_error "(23) Expect 'scanned-once,inconsistent',but got '$FLAGS'"
do_facet $SINGLEMDS $LCTL set_param fail_loc=0 fail_val=0
wait_update_facet $SINGLEMDS "$LCTL get_param -n \
mdd.${MDT_DEV}.lfsck_namespace |
awk '/^status/ { print \\\$2 }'" "completed" 32 || {
$SHOW_NAMESPACE
- error "(24) unexpected status"
+ namespace_error "(24) unexpected status"
}
FLAGS=$($SHOW_NAMESPACE | awk '/^flags/ { print $2 }')
- [ -z "$FLAGS" ] || error "(25) Expect empty flags, but got '$FLAGS'"
+ [ -z "$FLAGS" ] ||
+ namespace_error "(25) Expect empty flags, but got '$FLAGS'"
}
run_test 8 "LFSCK state machine"
# We allow another 20% schedule error.
local TIME_DIFF=2
# MAX_MARGIN = 1.3 = 13 / 10
- local MAX_SPEED=$((BASE_SPEED1 * (RUN_TIME1 + TIME_DIFF) / \
+ local MAX_SPEED=$((BASE_SPEED1 * (RUN_TIME1 + TIME_DIFF) /
RUN_TIME1 * 13 / 10))
[ $SPEED -lt $MAX_SPEED ] || {
$SHOW_LAYOUT
SPEED=$($SHOW_LAYOUT | awk '/^average_speed_phase1/ { print $2 }')
# MIN_MARGIN = 0.7 = 7 / 10
- local MIN_SPEED=$(((BASE_SPEED1 * (RUN_TIME1 - TIME_DIFF) + \
- BASE_SPEED2 * (RUN_TIME2 - TIME_DIFF)) / \
+ local MIN_SPEED=$(((BASE_SPEED1 * (RUN_TIME1 - TIME_DIFF) +
+ BASE_SPEED2 * (RUN_TIME2 - TIME_DIFF)) /
(RUN_TIME1 + RUN_TIME2) * 7 / 10))
[ $SPEED -gt $MIN_SPEED ] || {
if [ $mds1_FSTYPE != ldiskfs ]; then
}
# MAX_MARGIN = 1.3 = 13 / 10
- MAX_SPEED=$(((BASE_SPEED1 * (RUN_TIME1 + TIME_DIFF) + \
- BASE_SPEED2 * (RUN_TIME2 + TIME_DIFF)) / \
+ MAX_SPEED=$(((BASE_SPEED1 * (RUN_TIME1 + TIME_DIFF) +
+ BASE_SPEED2 * (RUN_TIME2 + TIME_DIFF)) /
(RUN_TIME1 + RUN_TIME2) * 13 / 10))
[ $SPEED -lt $MAX_SPEED ] || {
$SHOW_LAYOUT
# We allow another 20% schedule error.
local TIME_DIFF=2
# MAX_MARGIN = 1.3 = 13 / 10
- local MAX_SPEED=$((BASE_SPEED1 * (RUN_TIME1 + TIME_DIFF) / \
+ local MAX_SPEED=$((BASE_SPEED1 * (RUN_TIME1 + TIME_DIFF) /
RUN_TIME1 * 13 / 10))
[ $SPEED -lt $MAX_SPEED ] || {
$SHOW_NAMESPACE
SPEED=$($SHOW_NAMESPACE | awk '/^average_speed_phase2/ { print $2 }')
# MIN_MARGIN = 0.7 = 7 / 10
- local MIN_SPEED=$(((BASE_SPEED1 * (RUN_TIME1 - TIME_DIFF) + \
- BASE_SPEED2 * (RUN_TIME2 - TIME_DIFF)) / \
+ local MIN_SPEED=$(((BASE_SPEED1 * (RUN_TIME1 - TIME_DIFF) +
+ BASE_SPEED2 * (RUN_TIME2 - TIME_DIFF)) /
(RUN_TIME1 + RUN_TIME2) * 7 / 10))
[ $SPEED -gt $MIN_SPEED ] || {
if [ $mds1_FSTYPE != ldiskfs ]; then
}
# MAX_MARGIN = 1.3 = 13 / 10
- MAX_SPEED=$(((BASE_SPEED1 * (RUN_TIME1 + TIME_DIFF) + \
- BASE_SPEED2 * (RUN_TIME2 + TIME_DIFF)) / \
+ MAX_SPEED=$(((BASE_SPEED1 * (RUN_TIME1 + TIME_DIFF) +
+ BASE_SPEED2 * (RUN_TIME2 + TIME_DIFF)) /
(RUN_TIME1 + RUN_TIME2) * 13 / 10))
[ $SPEED -lt $MAX_SPEED ] || {
$SHOW_NAMESPACE
}
run_test 15c "LFSCK can repair unmatched MDT-object/OST-object pairs (3)"
+test_15d() {
+ (( $MDSCOUNT > 1 )) || skip "needs >= 2 MDTs"
+
+ check_mount_and_prep
+ rm -rf $DIR/$tdir
+ $LFS mkdir -c -1 $DIR/$tdir || error "create $tdir failed"
+ $LFS setdirstripe -D -i -1 -c 1 $DIR/$tdir ||
+ error "setdirstripe failed"
+
+ createmany -o $DIR/$tdir/f 100 || error "create sub files failed"
+ createmany -d $DIR/$tdir/s 100 || error "create sub dirs failed"
+
+ echo "Migrate $DIR/$tdir to MDT1"
+ $LFS migrate -m 1 $DIR/$tdir &
+ pid=$!
+
+ sleep 2
+ # fail sub transactions on random MDTs, which may cause some file
+ # inaccessible
+ #define OBD_FAIL_OUT_EIO 0x1709
+ for ((i = 0; i < $MDSCOUNT; i++)); do
+ do_facet mds$i $LCTL set_param fail_loc=0x1709
+ sleep 0.1
+ do_facet mds$i $LCTL set_param fail_loc=0
+ done
+
+ wait $pid
+
+ # LFSCK can't fully fix migrating directories, and may leave some
+ # files inaccessible, but it shouldn't cause crash
+ $START_NAMESPACE -A -r ||
+ error "Fail to start LFSCK for namespace"
+
+ wait_all_targets_blocked namespace completed 1
+
+ # resume migration may fail because some file may be inaccessible, but
+ # it shouldn't cause crash
+ $LFS migrate -m 1 $DIR/$tdir
+
+ # rm $tdir to avoid cleanup failure in the end
+ rm -rf $DIR/$tdir/*
+ $LFS rm_entry $DIR/$tdir/*
+ rm -rf $DIR/$tdir
+ REFORMAT="yes" cleanup_and_setup_lustre
+}
+run_test 15d "LFSCK don't crash upon dir migration failure"
+
test_16() {
(( $MDS1_VERSION > $(version_code 2.5.55) )) ||
skip "MDS older than 2.5.55, LU-3594"
check_mount_and_prep
- $LFS mkdir -i 1 $DIR/$tdir/d0 || error "(1) Fail to mkdir d0"
+ mkdir_on_mdt -i1 $DIR/$tdir/d0 || error "(1) Fail to mkdir d0"
mkdir $DIR/$tdir/d0/guard || error "(1) Fail to mkdir guard"
$LFS path2fid $DIR/$tdir/d0/guard
#define OBD_FAIL_LFSCK_MUL_REF 0x1622
do_facet $SINGLEMDS $LCTL set_param fail_loc=0x1622
- $LFS mkdir -i 0 $DIR/$tdir/d0/dummy/foo ||
+ mkdir_on_mdt -i0 $DIR/$tdir/d0/dummy/foo ||
error "(4) Fail to mkdir $DIR/$tdir/d0/dummy/foo"
$LFS path2fid $DIR/$tdir/d0/dummy/foo
local cfid=$($LFS path2fid $DIR/$tdir/d0/dummy/foo)
umount_client $MOUNT || error "(10) Fail to stop client!"
- stop $SINGLEMDS || error "(11) Fail to stop MDT0"
+ stop $SINGLEMDS || error "(11) Fail to stop $SINGLEMDS"
+
+ local dev=$(facet_device $SINGLEMDS)
- echo "run e2fsck"
- run_e2fsck $(facet_host $SINGLEMDS) $MDT_DEVNAME "-y" ||
+ echo "run e2fsck on $SINGLEMDS"
+ run_e2fsck $(facet_active_host $SINGLEMDS) $dev "-y" ||
error "(12) Fail to run e2fsck"
- start $SINGLEMDS $MDT_DEVNAME $MOUNT_OPTS_NOSCRUB > /dev/null ||
- error "(13) Fail to start MDT0"
+ start_facet $SINGLEMDS "$MOUNT_OPTS_NOSCRUB" 13
echo "Trigger namespace LFSCK to recover backend orphans"
$START_NAMESPACE -r -A ||
[ $repaired -ge 1 ] ||
error "(5) Fail to repair bad name hash: $repaired"
+ local rc=$($LFS find -H badtype $DIR/$tdir/striped_dir | wc -l)
+ [ $rc -ge 1 ] ||
+ error "Fail to find flag bad type: $rc"
+
umount_client $MOUNT || error "(6) umount failed"
mount_client $MOUNT || error "(7) mount failed"
[ $repaired -eq 1 ] ||
error "(4) Fail to re-generate master LMV EA: $repaired"
+ local rc=$($LFS find -H lostlmv $DIR/$tdir/striped_dir | wc -l)
+ [ $rc -eq 1 ] || error "Fail to find flag lost LMV: $rc"
+
umount_client $MOUNT || error "(5) umount failed"
mount_client $MOUNT || error "(6) mount failed"
error "$DIR/$tdir/$tfile: setstripe should fail"
# R/W should fail
- cat $DIR/$tdir/$tfile && "$DIR/$tdir/$tfile: read should fail"
+ cat $DIR/$tdir/$tfile && error "$DIR/$tdir/$tfile: read should fail"
cat /etc/passwd > $DIR/$tdir/$tfile &&
error "$DIR/$tdir/$tfile: write should fail"
}
run_test 40a "LFSCK correctly fixes lmm_oi in composite layout"
+test_41()
+{
+ local old_debug=$(do_facet $SINGLEMDS $LCTL get_param -n debug)
+
+ do_facet $SINGLEMDS $LCTL set_param debug=+lfsck
+ $LFS setstripe -E 1G -z 64M -E -1 -z 128M $DIR/$tfile
+ do_facet $SINGLEMDS $LCTL dk > /dev/null
+
+ echo "trigger LFSCK for SEL layout"
+ do_facet $SINGLEMDS $LCTL lfsck_start -M ${MDT_DEV} -A -t all -r -n on
+ wait_update_facet $SINGLEMDS "$LCTL get_param -n \
+ mdd.${MDT_DEV}.lfsck_layout |
+ awk '/^status/ { print \\\$2 }'" "completed" 32 || {
+ $SHOW_LAYOUT
+ error "(2) unexpected status"
+ }
+
+ local errors=$(do_facet $SINGLEMDS $LCTL dk |
+ grep "lfsck_layout_verify_header")
+
+ [[ "x$errors" == "x" ]] || {
+ echo "$errors"
+ error "lfsck failed"
+ }
+
+ do_facet $SINGLEMDS "$LCTL set_param debug='$old_debug'"
+}
+run_test 41 "SEL support in LFSCK"
+
# restore MDS/OST size
MDSSIZE=${SAVED_MDSSIZE}
OSTSIZE=${SAVED_OSTSIZE}