X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=blobdiff_plain;f=lustre%2Ftests%2Fsanity-lfsck.sh;h=960b4d30dcb2c894ddb13038394b2c37a356db6d;hp=ed3a84e64f2be05edfac5d478c2a91993f433bdb;hb=aa90d9a8c96a9683d033456666e00f5065c0aaeb;hpb=42adbae36f206a6ed4170e7619cd993c8fa80b1d diff --git a/lustre/tests/sanity-lfsck.sh b/lustre/tests/sanity-lfsck.sh index ed3a84e..960b4d3 100644 --- a/lustre/tests/sanity-lfsck.sh +++ b/lustre/tests/sanity-lfsck.sh @@ -8,17 +8,17 @@ set -e ONLY=${ONLY:-"$*"} -#Bug number for excepting test -ALWAYS_EXCEPT="$SANITY_LFSCK_EXCEPT" +LUSTRE=${LUSTRE:-$(dirname $0)/..} +. $LUSTRE/tests/test-framework.sh +init_test_env "$@" +init_logging -[ "$SLOW" = "no" ] && EXCEPT_SLOW="" +# bug number for skipped test: +ALWAYS_EXCEPT="$SANITY_LFSCK_EXCEPT " # UPDATE THE COMMENT ABOVE WITH BUG NUMBERS WHEN CHANGING ALWAYS_EXCEPT! -LUSTRE=${LUSTRE:-$(cd $(dirname $0)/..; echo $PWD)} -. $LUSTRE/tests/test-framework.sh -init_test_env $@ -. ${CONFIG:=$LUSTRE/tests/cfg/$NAME.sh} -init_logging +[ "$SLOW" = "no" ] && EXCEPT_SLOW="" +build_test_filter require_dsh_mds || exit 0 @@ -29,8 +29,8 @@ if ! check_versions; then exit 0 fi -[[ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.3.60) ]] && - skip "Need MDS version at least 2.3.60" && exit 0 +(( $MDS1_VERSION >= $(version_code 2.3.60) )) || + skip "Need MDS version at least 2.3.60" LTIME=${LTIME:-120} @@ -40,9 +40,9 @@ SAVED_OSTCOUNT=${OSTCOUNT} # use small MDS + OST size to speed formatting time # do not use too small MDSSIZE/OSTSIZE, which affect the default journal size MDSSIZE=100000 -[ $(facet_fstype $SINGLEMDS) == zfs ] && MDSSIZE=300000 +[ "$mds1_FSTYPE" == zfs ] && MDSSIZE=300000 OSTSIZE=100000 -[ $(facet_fstype ost1) == zfs ] && OSTSIZE=300000 +[ "$ost1_FSTYPE" == zfs ] && OSTSIZE=300000 # no need too many OSTs, to reduce the format/start/stop overhead cleanupall @@ -51,24 +51,8 @@ cleanupall # build up a clean test environment. REFORMAT="yes" check_and_setup_lustre -[[ $(lustre_version_code $SINGLEMDS) -le $(version_code 2.4.90) ]] && - ALWAYS_EXCEPT="$ALWAYS_EXCEPT 2c" - -[[ $(lustre_version_code ost1) -lt $(version_code 2.5.55) ]] && - ALWAYS_EXCEPT="$ALWAYS_EXCEPT 11 12 13 14 15 16 17 18 19 20 21" - -[[ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.6.50) ]] && - ALWAYS_EXCEPT="$ALWAYS_EXCEPT 2d 2e 3 22 23 24 25 26 27 28 29 30 31" - -# DNE does not support striped directory on zfs-based backend yet. -[ $(facet_fstype $SINGLEMDS) != ldiskfs ] && - ALWAYS_EXCEPT="$ALWAYS_EXCEPT 31" - -build_test_filter - -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 \ @@ -81,9 +65,9 @@ SHOW_LAYOUT="do_facet $SINGLEMDS \ $LCTL get_param -n mdd.${MDT_DEV}.lfsck_layout" SHOW_LAYOUT_ON_OST="do_facet ost1 \ $LCTL get_param -n obdfilter.${OST_DEV}.lfsck_layout" -MOUNT_OPTS_SCRUB="-o user_xattr" -MOUNT_OPTS_NOSCRUB="-o user_xattr,noscrub" -MOUNT_OPTS_SKIP_LFSCK="-o user_xattr,skip_lfsck" +MOUNT_OPTS_SCRUB="$MDS_MOUNT_OPTS -o user_xattr" +MOUNT_OPTS_NOSCRUB="$MDS_MOUNT_OPTS -o user_xattr,noscrub" +MOUNT_OPTS_SKIP_LFSCK="$MDS_MOUNT_OPTS -o user_xattr,skip_lfsck" lfsck_prep() { local ndirs=$1 @@ -119,17 +103,31 @@ lfsck_prep() { echo "prepared $(date)." } -run_e2fsck_on_mdt0() { - [ $(facet_fstype $SINGLEMDS) != ldiskfs ] && return +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() { @@ -242,7 +240,7 @@ test_1a() { [ $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!" @@ -256,8 +254,8 @@ run_test 1a "LFSCK can find out and repair crashed FID-in-dirent" test_1b() { - [ $(facet_fstype $SINGLEMDS) != ldiskfs ] && - skip "OI Scrub not implemented for ZFS" && return + [ "$mds1_FSTYPE" != ldiskfs ] && + skip "OI Scrub not implemented for ZFS" lfsck_prep 1 1 @@ -288,7 +286,7 @@ test_1b() 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!" @@ -327,7 +325,7 @@ test_1c() { [ $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!" @@ -339,6 +337,70 @@ test_1c() { } 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 @@ -366,7 +428,7 @@ test_2a() { [ $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!" @@ -403,7 +465,7 @@ test_2b() [ $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!" @@ -419,6 +481,9 @@ run_test 2b "LFSCK can find out and remove invalid linkEA entry" test_2c() { + (( $MDS1_VERSION > $(version_code 2.4.90) )) || + skip "MDS older than 2.4.90" + lfsck_prep 1 1 #define OBD_FAIL_LFSCK_LINKEA_MORE2 0x1605 @@ -440,7 +505,7 @@ test_2c() [ $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!" @@ -456,6 +521,9 @@ run_test 2c "LFSCK can find out and remove repeated linkEA entry" test_2d() { + (( $MDS1_VERSION > $(version_code 2.6.50) )) || + skip "MDS older than 2.6.50, LU-4788" + lfsck_prep 1 1 #define OBD_FAIL_LFSCK_NO_LINKEA 0x161d @@ -477,7 +545,7 @@ test_2d() [ $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!" @@ -493,7 +561,9 @@ run_test 2d "LFSCK can recover the missing linkEA entry" test_2e() { - [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return + [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" + (( $MDS1_VERSION > $(version_code 2.6.50) )) || + skip "MDS older than 2.6.50, LU-5511" check_mount_and_prep @@ -522,6 +592,9 @@ run_test 2e "namespace LFSCK can verify remote object linkEA" test_3() { + (( $MDS1_VERSION > $(version_code 2.6.50) )) || + skip "MDS older than 2.6.50, LU-4788" + lfsck_prep 4 4 mkdir $DIR/$tdir/dummy || error "(1) Fail to mkdir" @@ -564,17 +637,16 @@ run_test 3 "LFSCK can verify multiple-linked objects" test_4() { - [ $(facet_fstype $SINGLEMDS) != ldiskfs ] && - skip "OI Scrub not implemented for ZFS" && return + [ "$mds1_FSTYPE" != ldiskfs ] && + skip "OI Scrub not implemented for ZFS" 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 @@ -598,7 +670,7 @@ test_4() 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 | @@ -611,7 +683,7 @@ test_4() [ $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!" @@ -624,17 +696,16 @@ run_test 4 "FID-in-dirent can be rebuilt after MDT file-level backup/restore" test_5() { - [ $(facet_fstype $SINGLEMDS) != ldiskfs ] && - skip "OI Scrub not implemented for ZFS" && return + [ "$mds1_FSTYPE" != ldiskfs ] && + skip "OI Scrub not implemented for ZFS" 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 @@ -658,7 +729,7 @@ test_5() 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 | @@ -671,7 +742,7 @@ test_5() [ $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!" @@ -821,12 +892,11 @@ test_7a() # 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 | @@ -859,12 +929,11 @@ test_7b() 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 | @@ -875,6 +944,12 @@ test_7b() } run_test 7b "non-stopped LFSCK should auto restarts after MDS remount (2)" +namespace_error() +{ + $SHOW_NAMESPACE + error "$@" +} + test_8() { echo "formatall" @@ -886,7 +961,7 @@ test_8() 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 @@ -902,23 +977,25 @@ test_8() #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 @@ -926,30 +1003,30 @@ test_8() 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 @@ -963,30 +1040,33 @@ test_8() 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 @@ -998,19 +1078,21 @@ test_8() 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 @@ -1022,38 +1104,46 @@ test_8() 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" @@ -1084,7 +1174,7 @@ test_9a() { # 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 @@ -1101,11 +1191,11 @@ test_9a() { 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 [ $(facet_fstype $SINGLEMDS) != ldiskfs ]; then + if [ $mds1_FSTYPE != ldiskfs ]; then error_ignore LU-5624 \ "(5.1) Got speed $SPEED, expected more than $MIN_SPEED" else @@ -1115,8 +1205,8 @@ test_9a() { } # 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 @@ -1182,7 +1272,7 @@ test_9b() { # 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 @@ -1199,11 +1289,11 @@ test_9b() { 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 [ $(facet_fstype $SINGLEMDS) != ldiskfs ]; then + if [ $mds1_FSTYPE != ldiskfs ]; then error_ignore LU-5624 \ "(9.1) Got speed $SPEED, expected more than $MIN_SPEED" else @@ -1213,8 +1303,8 @@ test_9b() { } # 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 @@ -1238,8 +1328,7 @@ run_test 9b "LFSCK speed control (2)" test_10() { - [ $(facet_fstype $SINGLEMDS) != ldiskfs ] && - skip "lookup(..)/linkea on ZFS issue" && return + [[ $mds1_FSTYPE == ldiskfs ]] || skip "lookup(..)/linkea on ZFS issue" lfsck_prep 1 1 @@ -1328,8 +1417,11 @@ ost_remove_lastid() { } test_11a() { + (( $MDS1_VERSION > $(version_code 2.5.55) )) || + skip "MDS older than 2.5.55, LU-1267" + check_mount_and_prep - $SETSTRIPE -c 1 -i 0 $DIR/$tdir + $LFS setstripe -c 1 -i 0 $DIR/$tdir createmany -o $DIR/$tdir/f 64 || error "(0) Fail to create 64 files." echo "stopall" @@ -1369,8 +1461,11 @@ test_11a() { run_test 11a "LFSCK can rebuild lost last_id" test_11b() { + (( $MDS1_VERSION > $(version_code 2.5.55) )) || + skip "MDS older than 2.5.55, LU-1267" + check_mount_and_prep - $SETSTRIPE -c 1 -i 0 $DIR/$tdir + $LFS setstripe -c 1 -i 0 $DIR/$tdir echo "set fail_loc=0x160d to skip the updating LAST_ID on-disk" #define OBD_FAIL_LFSCK_SKIP_LASTID 0x160d @@ -1383,9 +1478,8 @@ test_11b() { local proc_path="${FSNAME}-OST0000-osc-MDT0000" local seq=$(do_facet mds1 $LCTL get_param -n \ osp.${proc_path}.prealloc_last_seq) - local lastid1=$(do_facet ost1 "lctl get_param -n \ - obdfilter.${ost1_svc}.last_id" | grep $seq | - awk -F: '{ print $2 }') + local id_used=$(do_facet mds1 $LCTL get_param -n \ + osp.${proc_path}.prealloc_last_id) umount_client $MOUNT stop ost1 || error "(1) Fail to stop ost1" @@ -1397,23 +1491,23 @@ test_11b() { error "(2) Fail to start ost1" for ((i = 0; i < 60; i++)); do - lastid2=$(do_facet ost1 "lctl get_param -n \ - obdfilter.${ost1_svc}.last_id" | grep $seq | - awk -F: '{ print $2 }') - [ ! -z $lastid2 ] && break; + id_ost1=$(do_facet ost1 \ + "$LCTL get_param -n obdfilter.$ost1_svc.last_id" | + awk -F: "/$seq/ { print \$2 }") + [ -n "$id_ost1" ] && break sleep 1 done echo "the on-disk LAST_ID should be smaller than the expected one" - [ $lastid1 -gt $lastid2 ] || - error "(4) expect lastid1 [ $lastid1 ] > lastid2 [ $lastid2 ]" + [ $id_used -gt $id_ost1 ] || + error "(4) expect id_used '$id_used' > id_ost1 '$id_ost1'" echo "trigger LFSCK for layout on ost1 to rebuild the on-disk LAST_ID" $START_LAYOUT_ON_OST -r || error "(5) Fail to start LFSCK on OST!" - wait_update_facet ost1 "$LCTL get_param -n \ - obdfilter.${OST_DEV}.lfsck_layout | - awk '/^status/ { print \\\$2 }'" "completed" 32 || { + wait_update_facet ost1 \ + "$LCTL get_param -n obdfilter.$ost1_svc.lfsck_layout | + awk '/^status/ { print \\\$2 }'" "completed" 32 || { $SHOW_LAYOUT_ON_OST error "(6) unexpected status" } @@ -1424,12 +1518,12 @@ test_11b() { error "(8) Fail to start ost1" echo "the on-disk LAST_ID should have been rebuilt" - wait_update_facet ost1 "$LCTL get_param -n \ - obdfilter.${ost1_svc}.last_id | grep $seq | - awk -F: '{ print \\\$2 }'" "$lastid1" 60 || { - do_facet ost1 $LCTL get_param -n \ - obdfilter.${ost1_svc}.last_id - error "(9) expect lastid1 $seq:$lastid1" + # last_id may be larger than $id_used if objects were created/skipped + wait_update_facet_cond ost1 \ + "$LCTL get_param -n obdfilter.$ost1_svc.last_id | + awk -F: '/$seq/ { print \\\$2 }'" "-ge" "$id_used" 60 || { + do_facet ost1 $LCTL get_param obdfilter.$ost1_svc.last_id + error "(9) expect last_id >= id_used $seq:$id_used" } do_facet ost1 $LCTL set_param fail_loc=0 @@ -1438,7 +1532,9 @@ test_11b() { run_test 11b "LFSCK can rebuild crashed last_id" test_12a() { - [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return + [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" + (( $MDS1_VERSION > $(version_code 2.5.55) )) || + skip "MDS older than 2.5.55, LU-3950" check_mount_and_prep for k in $(seq $MDSCOUNT); do @@ -1504,6 +1600,9 @@ test_12a() { run_test 12a "single command to trigger LFSCK on all devices" test_12b() { + (( $MDS1_VERSION > $(version_code 2.5.55) )) || + skip "MDS older than 2.5.55, LU-3950" + check_mount_and_prep echo "Start LFSCK without '-M' specified." @@ -1527,6 +1626,9 @@ test_12b() { run_test 12b "auto detect Lustre device" test_13() { + (( $MDS1_VERSION > $(version_code 2.5.55) )) || + skip "MDS older than 2.5.55, LU-3593" + echo "#####" echo "The lmm_oi in layout EA should be consistent with the MDT-object" echo "FID; otherwise, the LFSCK should re-generate the lmm_oi from the" @@ -1561,6 +1663,9 @@ test_13() { run_test 13 "LFSCK can repair crashed lmm_oi" test_14a() { + (( $MDS1_VERSION > $(version_code 2.5.55) )) || + skip "MDS older than 2.5.55, LU-3590" + echo "#####" echo "The OST-object referenced by the MDT-object should be there;" echo "otherwise, the LFSCK should re-create the missing OST-object." @@ -1662,6 +1767,9 @@ test_14a() { run_test 14a "LFSCK can repair MDT-object with dangling LOV EA reference (1)" test_14b() { + (( $MDS1_VERSION > $(version_code 2.5.55) )) || + skip "MDS older than 2.5.55, LU-3590" + echo "#####" echo "The OST-object referenced by the MDT-object should be there;" echo "otherwise, the LFSCK should re-create the missing OST-object." @@ -1734,6 +1842,9 @@ test_14b() { run_test 14b "LFSCK can repair MDT-object with dangling LOV EA reference (2)" test_15a() { + (( $MDS1_VERSION > $(version_code 2.5.55) )) || + skip "MDS older than 2.5.55, LU-3591" + echo "#####" echo "If the OST-object referenced by the MDT-object back points" echo "to some non-exist MDT-object, then the LFSCK should repair" @@ -1778,6 +1889,9 @@ test_15a() { run_test 15a "LFSCK can repair unmatched MDT-object/OST-object pairs (1)" test_15b() { + (( $MDS1_VERSION > $(version_code 2.5.55) )) || + skip "MDS older than 2.5.55, LU-3591" + echo "#####" echo "If the OST-object referenced by the MDT-object back points" echo "to other MDT-object that doesn't recognize the OST-object," @@ -1825,10 +1939,11 @@ test_15b() { run_test 15b "LFSCK can repair unmatched MDT-object/OST-object pairs (2)" test_15c() { - [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return - - [ $(lustre_version_code $SINGLEMDS) -ge $(version_code 2.7.55) ] && - skip "Skip the test after 2.7.55 see LU-6437" && return + [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" + (( $MDS1_VERSION < $(version_code 2.7.55) )) || + skip "MDS newer than 2.7.55, LU-6475" + (( $MDS1_VERSION > $(version_code 2.5.55) )) || + skip "MDS older than 2.5.55, LU-3591" echo "#####" echo "According to current metadata migration implementation," @@ -1873,7 +1988,57 @@ test_15c() { } 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" + echo "#####" echo "If the OST-object's owner information does not match the owner" echo "information stored in the MDT-object, then the LFSCK trust the" @@ -1916,6 +2081,9 @@ test_16() { run_test 16 "LFSCK can repair inconsistent MDT-object/OST-object owner" test_17() { + (( $MDS1_VERSION > $(version_code 2.5.55) )) || + skip "MDS older than 2.5.55, LU-3594" + echo "#####" echo "If more than one MDT-objects reference the same OST-object," echo "and the OST-object only recognizes one MDT-object, then the" @@ -1992,6 +2160,9 @@ run_test 17 "LFSCK can repair multiple references" $LCTL set_param debug=+cache > /dev/null test_18a() { + (( $MDS1_VERSION > $(version_code 2.5.55) )) || + skip "MDS older than 2.5.55, LU-3336" + echo "#####" echo "The target MDT-object is there, but related stripe information" echo "is lost or partly lost. The LFSCK should regenerate the missing" @@ -2131,6 +2302,8 @@ run_test 18a "Find out orphan OST-object and repair it (1)" test_18b() { [ -n "$FILESET" ] && skip "Not functional for FILESET set" + (( $MDS1_VERSION > $(version_code 2.5.55) )) || + skip "MDS older than 2.5.55, LU-3336" echo "#####" echo "The target MDT-object is lost. The LFSCK should re-create the" @@ -2191,6 +2364,28 @@ test_18b() { cancel_lru_locks mdc cancel_lru_locks osc + # dryrun mode only check orphans, not repaie + echo "Trigger layout LFSCK --dryrun to find out orphan OST-object" + $START_LAYOUT --dryrun -o -r || + error "Fail to start layout LFSCK in dryrun mode" + wait_all_targets_blocked layout completed 2 + + local PARAMS=$($SHOW_LAYOUT | awk '/^param/ { print $2 }') + [ "$PARAMS" == "dryrun,all_targets,orphan" ] || + error "Expect 'dryrun,all_targets,orphan', got '$PARAMS'" + + local orphans=$(do_facet mds1 $LCTL get_param -n \ + mdd.$(facet_svc mds1).lfsck_layout | + awk '/^inconsistent_orphan/ { print $2 }') + [ $orphans -eq 3 ] || + error "Expect 3 found on mds1, but got: $orphans" + + # orphan parents should not be created + local subdir + for subdir in $MOUNT/.lustre/lost+found/*; do + [ ! "$(ls -A $subdir)" ] || error "$subdir not empty" + done + echo "Trigger layout LFSCK on all devices to find out orphan OST-object" $START_LAYOUT -r -o || error "(1) Fail to start LFSCK for layout!" @@ -2268,6 +2463,8 @@ run_test 18b "Find out orphan OST-object and repair it (2)" test_18c() { [ -n "$FILESET" ] && skip "Not functional for FILESET set" + (( $MDS1_VERSION > $(version_code 2.5.55) )) || + skip "MDS older than 2.5.55, LU-3336" echo "#####" echo "The target MDT-object is lost, and the OST-object FID is missing." @@ -2386,6 +2583,9 @@ test_18c() { run_test 18c "Find out orphan OST-object and repair it (3)" test_18d() { + (( $MDS1_VERSION > $(version_code 2.5.55) )) || + skip "MDS older than 2.5.55, LU-3336" + echo "#####" echo "The target MDT-object layout EA is corrupted, but the right" echo "OST-object is still alive as orphan. The layout LFSCK will" @@ -2495,6 +2695,8 @@ run_test 18d "Find out orphan OST-object and repair it (4)" test_18e() { [ -n "$FILESET" ] && skip "Not functional for FILESET set" + (( $MDS1_VERSION > $(version_code 2.5.55) )) || + skip "MDS older than 2.5.55, LU-3336" echo "#####" echo "The target MDT-object layout EA slot is occpuied by some new" @@ -2924,6 +3126,9 @@ run_test 18h "LFSCK can repair crashed PFL extent range" $LCTL set_param debug=-cache > /dev/null test_19a() { + (( $MDS1_VERSION > $(version_code 2.5.55) )) || + skip "MDS older than 2.5.55, LU-3951" + check_mount_and_prep $LFS setstripe -c 1 -i 0 $DIR/$tdir @@ -2952,6 +3157,9 @@ test_19a() { run_test 19a "OST-object inconsistency self detect" test_19b() { + (( $MDS1_VERSION > $(version_code 2.5.55) )) || + skip "MDS older than 2.5.55, LU-3951" + check_mount_and_prep $LFS setstripe -c 1 -i 0 $DIR/$tdir @@ -3002,6 +3210,8 @@ PATTERN_WITHOUT_HOLE="raid0" test_20a() { [ $OSTCOUNT -lt 2 ] && skip "needs >= 2 OSTs" && return [ -n "$FILESET" ] && skip "Not functional for FILESET set" + (( $MDS1_VERSION > $(version_code 2.5.55) )) || + skip "MDS older than 2.5.55, LU-4887" echo "#####" echo "The target MDT-object and some of its OST-object are lost." @@ -3342,6 +3552,8 @@ run_test 20a "Handle the orphan with dummy LOV EA slot properly" test_20b() { [ $OSTCOUNT -lt 2 ] && skip "needs >= 2 OSTs" && return [ -n "$FILESET" ] && skip "Not functional for FILESET set" + (( $MDS1_VERSION > $(version_code 2.5.55) )) || + skip "MDS older than 2.5.55, LU-4887" echo "#####" echo "The target MDT-object and some of its OST-object are lost." @@ -3650,8 +3862,8 @@ test_20b() { run_test 20b "Handle the orphan with dummy LOV EA slot properly - PFL case" test_21() { - [[ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.5.59) ]] && - skip "ignore the test if MDS is older than 2.5.59" && return + (( $MDS1_VERSION > $(version_code 2.5.59) )) || + skip "MDS older than 2.5.59, LU-4887" check_mount_and_prep createmany -o $DIR/$tdir/f 100 || error "(0) Fail to create 100 files" @@ -3678,6 +3890,8 @@ run_test 21 "run all LFSCK components by default" test_22a() { [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return + (( $MDS1_VERSION > $(version_code 2.6.50) )) || + skip "MDS older than 2.6.50, LU-5511" echo "#####" echo "The parent_A references the child directory via some name entry," @@ -3720,6 +3934,8 @@ run_test 22a "LFSCK can repair unmatched pairs (1)" test_22b() { [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return + (( $MDS1_VERSION > $(version_code 2.6.50) )) || + skip "MDS older than 2.6.50, LU-5511" echo "#####" echo "The parent_A references the child directory via the name entry_B," @@ -3769,6 +3985,8 @@ run_test 22b "LFSCK can repair unmatched pairs (2)" test_23a() { [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return + (( $MDS1_VERSION > $(version_code 2.6.50) )) || + skip "MDS older than 2.6.50, LU-5512" echo "#####" echo "The name entry is there, but the MDT-object for such name " @@ -3821,6 +4039,9 @@ test_23a() { run_test 23a "LFSCK can repair dangling name entry (1)" test_23b() { + (( $MDS1_VERSION > $(version_code 2.6.50) )) || + skip "MDS older than 2.6.50, LU-5512" + echo "#####" echo "The objectA has multiple hard links, one of them corresponding" echo "to the name entry_B. But there is something wrong for the name" @@ -3920,6 +4141,9 @@ cleanup_23c() { } test_23c() { + (( $MDS1_VERSION > $(version_code 2.6.50) )) || + skip "MDS older than 2.6.50, LU-5512" + echo "#####" echo "The objectA has multiple hard links, one of them corresponding" echo "to the name entry_B. But there is something wrong for the name" @@ -4025,6 +4249,8 @@ run_test 23c "LFSCK can repair dangling name entry (3)" test_24() { [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return [ -n "$FILESET" ] && skip "Not functional for FILESET set" + (( $MDS1_VERSION > $(version_code 2.6.50) )) || + skip "MDS older than 2.6.50, LU-5513" echo "#####" echo "Two MDT-objects back reference the same name entry via their" @@ -4037,7 +4263,7 @@ test_24() { 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 @@ -4046,7 +4272,7 @@ test_24() { $LFS path2fid $DIR/$tdir/d0/dummy local pfid - if [ $(facet_fstype $SINGLEMDS) != ldiskfs ]; then + if [ $mds1_FSTYPE != ldiskfs ]; then pfid=$($LFS path2fid $DIR/$tdir/d0/guard) else pfid=$($LFS path2fid $DIR/$tdir/d0/dummy) @@ -4065,7 +4291,7 @@ test_24() { #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) @@ -4099,8 +4325,9 @@ test_24() { run_test 24 "LFSCK can repair multiple-referenced name entry" test_25() { - [ $(facet_fstype $SINGLEMDS) != ldiskfs ] && - skip "ldiskfs only test" && return + [[ $mds1_FSTYPE == ldiskfs ]] || skip "only ldiskfs fixes dirent type" + (( $MDS1_VERSION > $(version_code 2.6.50) )) || + skip "MDS older than 2.6.50, LU-5515" echo "#####" echo "The file type in the name entry does not match the file type" @@ -4140,6 +4367,9 @@ test_25() { run_test 25 "LFSCK can repair bad file type in the name entry" test_26a() { + (( $MDS1_VERSION > $(version_code 2.6.50) )) || + skip "MDS older than 2.6.50, LU-5516" + echo "#####" echo "The local name entry back referenced by the MDT-object is lost." echo "The namespace LFSCK will add the missing local name entry back" @@ -4188,7 +4418,9 @@ test_26a() { run_test 26a "LFSCK can add the missing local name entry back to the namespace" test_26b() { - [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return + [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" + (( $MDS1_VERSION > $(version_code 2.6.50) )) || + skip "MDS older than 2.6.50, LU-5516" echo "#####" echo "The remote name entry back referenced by the MDT-object is lost." @@ -4236,6 +4468,8 @@ run_test 26b "LFSCK can add the missing remote name entry back to the namespace" test_27a() { [ -n "$FILESET" ] && skip "Not functional for FILESET set" + (( $MDS1_VERSION > $(version_code 2.6.50) )) || + skip "MDS older than 2.6.50, LU-5516" echo "#####" echo "The local parent referenced by the MDT-object linkEA is lost." @@ -4289,8 +4523,10 @@ test_27a() { run_test 27a "LFSCK can recreate the lost local parent directory as orphan" test_27b() { - [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return + [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" [ -n "$FILESET" ] && skip "Not functional for FILESET set" + (( $MDS1_VERSION > $(version_code 2.6.50) )) || + skip "MDS older than 2.6.50, LU-5516" echo "#####" echo "The remote parent referenced by the MDT-object linkEA is lost." @@ -4343,7 +4579,9 @@ test_27b() { run_test 27b "LFSCK can recreate the lost remote parent directory as orphan" test_28() { - [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return + [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" + (( $MDS1_VERSION > $(version_code 2.6.50) )) || + skip "MDS older than 2.6.50, LU-5506" echo "#####" echo "The target name entry is lost. The LFSCK should insert the" @@ -4437,6 +4675,9 @@ test_28() { run_test 28 "Skip the failed MDT(s) when handle orphan MDT-objects" test_29a() { + (( $MDS1_VERSION > $(version_code 2.6.50) )) || + skip "MDS older than 2.6.50, LU-5517" + echo "#####" echo "The object's nlink attribute is larger than the object's known" echo "name entries count. The LFSCK will repair the object's nlink" @@ -4482,6 +4723,9 @@ test_29a() { #run_test 29a "LFSCK can repair bad nlink count (1)" test_29b() { + (( $MDS1_VERSION > $(version_code 2.6.50) )) || + skip "MDS older than 2.6.50, LU-5517" + echo "#####" echo "The object's nlink attribute is smaller than the object's known" echo "name entries count. The LFSCK will repair the object's nlink" @@ -4525,6 +4769,9 @@ run_test 29b "LFSCK can repair bad nlink count (2)" test_29c() { + (( $MDS1_VERSION > $(version_code 2.6.50) )) || + skip "MDS older than 2.6.50, LU-5517" + echo "#####" echo "The namespace LFSCK will create many hard links to the target" echo "file as to exceed the linkEA size limitation. Under such case" @@ -4619,9 +4866,10 @@ test_29c() run_test 29c "verify linkEA size limitation" test_30() { - [ $(facet_fstype $SINGLEMDS) != ldiskfs ] && - skip "ldiskfs only test" && return + [[ $mds1_FSTYPE == ldiskfs ]] || skip "only ldiskfs has lost+found" [ -n "$FILESET" ] && skip "Not functional for FILESET set" + (( $MDS1_VERSION > $(version_code 2.6.50) )) || + skip "MDS older than 2.6.50, LU-5518" echo "#####" echo "The namespace LFSCK will move the orphans from backend" @@ -4664,14 +4912,15 @@ test_30() { 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 || @@ -4705,7 +4954,9 @@ test_30() { run_test 30 "LFSCK can recover the orphans from backend /lost+found" test_31a() { - [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return + [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" + (( $MDS1_VERSION > $(version_code 2.6.50) )) || + skip "MDS older than 2.6.50, LU-5519" echo "#####" echo "For the name entry under a striped directory, if the name" @@ -4739,6 +4990,10 @@ test_31a() { [ $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" @@ -4755,7 +5010,9 @@ test_31a() { run_test 31a "The LFSCK can find/repair the name entry with bad name hash (1)" test_31b() { - [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return + [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" + (( $MDS1_VERSION > $(version_code 2.6.50) )) || + skip "MDS older than 2.6.50, LU-5519" echo "#####" echo "For the name entry under a striped directory, if the name" @@ -4774,7 +5031,7 @@ test_31b() { #define OBD_FAIL_LFSCK_BAD_NAME_HASH 0x1628 $LCTL set_param fail_loc=0x1628 fail_val=1 - createmany -d $DIR/$tdir/striped_dir/d $MDSCOUNT || + createmany -d $DIR/$tdir/striped_dir/d $((MDSCOUNT * 5)) || error "(2) Fail to create file under striped directory" $LCTL set_param fail_loc=0 fail_val=0 @@ -4787,13 +5044,14 @@ test_31b() { local repaired=$(do_facet mds2 $LCTL get_param -n \ mdd.$(facet_svc mds2).lfsck_namespace | awk '/^name_hash_repaired/ { print $2 }') + echo "repaired $repaired name entries with bad hash" [ $repaired -ge 1 ] || error "(5) Fail to repair bad name hash: $repaired" umount_client $MOUNT || error "(6) umount failed" mount_client $MOUNT || error "(7) mount failed" - for ((i = 0; i < $MDSCOUNT; i++)); do + for ((i = 0; i < $((MDSCOUNT * 5)); i++)); do stat $DIR/$tdir/striped_dir/d$i || error "(8) Fail to stat d$i after LFSCK" rmdir $DIR/$tdir/striped_dir/d$i || @@ -4806,7 +5064,9 @@ test_31b() { run_test 31b "The LFSCK can find/repair the name entry with bad name hash (2)" test_31c() { - [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return + [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" + (( $MDS1_VERSION > $(version_code 2.6.50) )) || + skip "MDS older than 2.6.50, LU-5519" echo "#####" echo "For some reason, the master MDT-object of the striped directory" @@ -4837,6 +5097,9 @@ test_31c() { [ $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" @@ -4849,7 +5112,9 @@ test_31c() { run_test 31c "Re-generate the lost master LMV EA for striped directory" test_31d() { - [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return + [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" + (( $MDS1_VERSION > $(version_code 2.6.50) )) || + skip "MDS older than 2.6.50, LU-5519" echo "#####" echo "For some reason, the master MDT-object of the striped directory" @@ -4903,7 +5168,9 @@ test_31d() { run_test 31d "Set broken striped directory (modified after broken) as read-only" test_31e() { - [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return + [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" + (( $MDS1_VERSION > $(version_code 2.6.50) )) || + skip "MDS older than 2.6.50, LU-5519" echo "#####" echo "For some reason, the slave MDT-object of the striped directory" @@ -4941,6 +5208,8 @@ run_test 31e "Re-generate the lost slave LMV EA for striped directory (1)" test_31f() { [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return + (( $MDS1_VERSION > $(version_code 2.6.50) )) || + skip "MDS older than 2.6.50, LU-5519" echo "#####" echo "For some reason, the slave MDT-object of the striped directory" @@ -4979,6 +5248,8 @@ run_test 31f "Re-generate the lost slave LMV EA for striped directory (2)" test_31g() { [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return + (( $MDS1_VERSION > $(version_code 2.6.50) )) || + skip "MDS older than 2.6.50, LU-5519" echo "#####" echo "For some reason, the stripe index in the slave LMV EA is" @@ -5024,6 +5295,8 @@ run_test 31g "Repair the corrupted slave LMV EA" test_31h() { [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return + (( $MDS1_VERSION > $(version_code 2.6.50) )) || + skip "MDS older than 2.6.50, LU-5519" echo "#####" echo "For some reason, the shard's name entry in the striped" @@ -5157,9 +5430,8 @@ run_test 33 "check LFSCK paramters" test_34() { - [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return - [ $(facet_fstype $SINGLEMDS) != zfs ] && - skip "Only valid for ZFS backend" && return + [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" + [ "$mds1_FSTYPE" != zfs ] && skip "Only valid for ZFS backend" lfsck_prep 1 1 @@ -5251,6 +5523,11 @@ test_36a() { check_mount_and_prep + lfs df $DIR + lfs df -i $DIR + lctl get_param osc.*.*grant* + stack_trap "lfs df $DIR; lfs df -i $DIR; lctl get_param osc.*.*grant*" + $LFS setstripe -N -E 1M -o 0,1 -E -1 -o 2 -N -E 2M -o 1,2 -E -1 -o 0 \ -N -E 3M -o 2,0 -E -1 -o 1 $DIR/$tdir/f0 || error "(0) Fail to create mirror file $DIR/$tdir/f0" @@ -5368,6 +5645,7 @@ test_36a() { run_test 36a "rebuild LOV EA for mirrored file (1)" test_36b() { + [ -n "$FILESET" ] && skip "Not functional for FILESET set" [ $OSTCOUNT -lt 3 ] && skip "needs >= 3 OSTs" && return echo "#####" @@ -5455,6 +5733,7 @@ test_36b() { run_test 36b "rebuild LOV EA for mirrored file (2)" test_36c() { + [ -n "$FILESET" ] && skip "Not functional for FILESET set" [ $OSTCOUNT -lt 3 ] && skip "needs >= 3 OSTs" && return echo "#####" @@ -5572,6 +5851,250 @@ test_37() } run_test 37 "LFSCK must skip a ORPHAN" +test_38() +{ + [[ "$MDS1_VERSION" -le $(version_code 2.12.51) ]] && + skip "Need MDS version newer than 2.12.51" + + test_mkdir $DIR/$tdir + local uuid1=$(cat /proc/sys/kernel/random/uuid) + local uuid2=$(cat /proc/sys/kernel/random/uuid) + + # create foreign file + $LFS setstripe --foreign=none --flags 0xda05 \ + -x "${uuid1}@${uuid2}" $DIR/$tdir/$tfile || + error "$DIR/$tdir/$tfile: create failed" + + $LFS getstripe -v $DIR/$tdir/$tfile | + grep "lfm_magic:.*0x0BD70BD0" || + error "$DIR/$tdir/$tfile: invalid LOV EA foreign magic" + # lfm_length is LOV EA size - sizeof(lfm_magic) - sizeof(lfm_length) + $LFS getstripe -v $DIR/$tdir/$tfile | grep "lfm_length:.*73" || + error "$DIR/$tdir/$tfile: invalid LOV EA foreign size" + $LFS getstripe -v $DIR/$tdir/$tfile | grep "lfm_type:.*none" || + error "$DIR/$tdir/$tfile: invalid LOV EA foreign type" + $LFS getstripe -v $DIR/$tdir/$tfile | + grep "lfm_flags:.*0x0000DA05" || + error "$DIR/$tdir/$tfile: invalid LOV EA foreign flags" + $LFS getstripe $DIR/$tdir/$tfile | + grep "lfm_value:.*${uuid1}@${uuid2}" || + error "$DIR/$tdir/$tfile: invalid LOV EA foreign value" + + # modify striping should fail + $LFS setstripe -c 2 $DIR/$tdir/$tfile && + error "$DIR/$tdir/$tfile: setstripe should fail" + + $START_NAMESPACE -r -A || error "Fail to start LFSCK for namespace" + + wait_all_targets_blocked namespace completed 1 + + # check that "global" namespace_repaired == 0 !!! + local repaired=$(do_facet mds1 \ + "$LCTL lfsck_query -t all -M ${FSNAME}-MDT0000 | + awk '/^namespace_repaired/ { print \\\$2 }'") + [ $repaired -eq 0 ] || + error "(2) Expect no namespace repair, but got: $repaired" + + $START_LAYOUT -A -r || error "Fail to start LFSCK for layout" + + wait_all_targets_blocked layout completed 2 + + # check that "global" layout_repaired == 0 !!! + local repaired=$(do_facet mds1 \ + "$LCTL lfsck_query -t all -M ${FSNAME}-MDT0000 | + awk '/^layout_repaired/ { print \\\$2 }'") + [ $repaired -eq 0 ] || + error "(2) Expect no layout repair, but got: $repaired" + + echo "post-lfsck checks of foreign file" + + $LFS getstripe -v $DIR/$tdir/$tfile | + grep "lfm_magic:.*0x0BD70BD0" || + error "$DIR/$tdir/$tfile: invalid LOV EA foreign magic" + # lfm_length is LOV EA size - sizeof(lfm_magic) - sizeof(lfm_length) + $LFS getstripe -v $DIR/$tdir/$tfile | grep "lfm_length:.*73" || + error "$DIR/$tdir/$tfile: invalid LOV EA foreign size" + $LFS getstripe -v $DIR/$tdir/$tfile | grep "lfm_type:.*none" || + error "$DIR/$tdir/$tfile: invalid LOV EA foreign type" + $LFS getstripe -v $DIR/$tdir/$tfile | + grep "lfm_flags:.*0x0000DA05" || + error "$DIR/$tdir/$tfile: invalid LOV EA foreign flags" + $LFS getstripe $DIR/$tdir/$tfile | + grep "lfm_value:.*${uuid1}@${uuid2}" || + error "$DIR/$tdir/$tfile: invalid LOV EA foreign value" + + # modify striping should fail + $LFS setstripe -c 2 $DIR/$tdir/$tfile && + error "$DIR/$tdir/$tfile: setstripe should fail" + + # R/W 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" + + #remove foreign file + rm $DIR/$tdir/$tfile || + error "$DIR/$tdir/$tfile: remove of foreign file has failed" +} +run_test 38 "LFSCK does not break foreign file and reverse is also true" + +test_39() +{ + [[ "$MDS1_VERSION" -le $(version_code 2.12.51) ]] && + skip "Need MDS version newer than 2.12.51" + + test_mkdir $DIR/$tdir + local uuid1=$(cat /proc/sys/kernel/random/uuid) + local uuid2=$(cat /proc/sys/kernel/random/uuid) + + # create foreign dir + $LFS mkdir --foreign=none --xattr="${uuid1}@${uuid2}" --flags=0xda05 \ + $DIR/$tdir/${tdir}2 || + error "$DIR/$tdir/${tdir}2: create failed" + + $LFS getdirstripe -v $DIR/$tdir/${tdir}2 | + grep "lfm_magic:.*0x0CD50CD0" || + error "$DIR/$tdir/${tdir}2: invalid LMV EA magic" + # lfm_length is LMV EA size - sizeof(lfm_magic) - sizeof(lfm_length) + # - sizeof(lfm_type) - sizeof(lfm_flags) + $LFS getdirstripe -v $DIR/$tdir/${tdir}2 | grep "lfm_length:.*73" || + error "$DIR/$tdir/${tdir}2: invalid LMV EA size" + $LFS getdirstripe -v $DIR/$tdir/${tdir}2 | grep "lfm_type:.*none" || + error "$DIR/$tdir/${tdir}2: invalid LMV EA type" + $LFS getdirstripe -v $DIR/$tdir/${tdir}2 | + grep "lfm_flags:.*0x0000DA05" || + error "$DIR/$tdir/${tdir}2: invalid LMV EA flags" + $LFS getdirstripe $DIR/$tdir/${tdir}2 | + grep "lfm_value.*${uuid1}@${uuid2}" || + error "$DIR/$tdir/${tdir}2: invalid LMV EA value" + + # file create in dir should fail + touch $DIR/$tdir/${tdir}2/$tfile && + "$DIR/${tdir}2: file create should fail" + + # chmod should work + chmod 777 $DIR/$tdir/${tdir}2 || + error "$DIR/${tdir}2: chmod failed" + + # chown should work + chown $RUNAS_ID:$RUNAS_GID $DIR/$tdir/${tdir}2 || + error "$DIR/${tdir}2: chown failed" + + $START_NAMESPACE -r -A || error "Fail to start LFSCK for namespace" + + wait_all_targets_blocked namespace completed 1 + + # check that "global" namespace_repaired == 0 !!! + local repaired=$(do_facet mds1 \ + "$LCTL lfsck_query -t all -M ${FSNAME}-MDT0000 | + awk '/^namespace_repaired/ { print \\\$2 }'") + [ $repaired -eq 0 ] || + error "(2) Expect nothing to be repaired, but got: $repaired" + + $START_LAYOUT -A -r || error "Fail to start LFSCK for layout" + + wait_all_targets_blocked layout completed 2 + + # check that "global" layout_repaired == 0 !!! + local repaired=$(do_facet mds1 \ + "$LCTL lfsck_query -t all -M ${FSNAME}-MDT0000 | + awk '/^layout_repaired/ { print \\\$2 }'") + [ $repaired -eq 0 ] || + error "(2) Expect no layout repair, but got: $repaired" + + echo "post-lfsck checks of foreign dir" + + $LFS getdirstripe -v $DIR/$tdir/${tdir}2 | + grep "lfm_magic:.*0x0CD50CD0" || + error "$DIR/$tdir/${tdir}2: invalid LMV EA magic" + # lfm_length is LMV EA size - sizeof(lfm_magic) - sizeof(lfm_length) + # - sizeof(lfm_type) - sizeof(lfm_flags) + $LFS getdirstripe -v $DIR/$tdir/${tdir}2 | grep "lfm_length:.*73" || + error "$DIR/$tdir/${tdir}2: invalid LMV EA size" + $LFS getdirstripe -v $DIR/$tdir/${tdir}2 | grep "lfm_type:.*none" || + error "$DIR/$tdir/${tdir}2: invalid LMV EA type" + $LFS getdirstripe -v $DIR/$tdir/${tdir}2 | + grep "lfm_flags:.*0x0000DA05" || + error "$DIR/$tdir/${tdir}2: invalid LMV EA flags" + $LFS getdirstripe $DIR/$tdir/${tdir}2 | + grep "lfm_value.*${uuid1}@${uuid2}" || + error "$DIR/$tdir/${tdir}2: invalid LMV EA value" + + # file create in dir should fail + touch $DIR/$tdir/${tdir}2/$tfile && + "$DIR/${tdir}2: file create should fail" + + # chmod should work + chmod 777 $DIR/$tdir/${tdir}2 || + error "$DIR/${tdir}2: chmod failed" + + # chown should work + chown $RUNAS_ID:$RUNAS_GID $DIR/$tdir/${tdir}2 || + error "$DIR/${tdir}2: chown failed" + + #remove foreign dir + rmdir $DIR/$tdir/${tdir}2 || + error "$DIR/$tdir/${tdir}2: remove of foreign dir has failed" +} +run_test 39 "LFSCK does not break foreign dir and reverse is also true" + +test_40a() { + [[ $MDSCOUNT -ge 2 ]] || skip "needs >= 2 MDTs" + + check_mount_and_prep + $LFS mkdir -i 1 $DIR/$tdir/dir1 + $LFS setstripe -E 1M -c1 -S 1M -E 128M -c2 -S 4M -E eof $DIR/$tdir/dir1 + + touch $DIR/$tdir/dir1/f1 + local layout1=$(get_layout_param $DIR/$tdir/dir1/f1) + + echo "Migrate $DIR/$tdir/dir1 from MDT1 to MDT0" + $LFS migrate -m 0 $DIR/$tdir/dir1 + + echo "trigger LFSCK for layout" + do_facet $SINGLEMDS $LCTL lfsck_start -M ${MDT_DEV} -t layout -r + + 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 layout2=$(get_layout_param $DIR/$tdir/dir1/f1) + + [[ "$layout1" == "$layout2" ]] || error "layout lost after lfsck" +} +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}