Whamcloud - gitweb
LU-5855 lfsck: misc fixes for zfs-based backend
[fs/lustre-release.git] / lustre / tests / sanity-lfsck.sh
index 150d1d2..0ece9cd 100644 (file)
@@ -48,6 +48,10 @@ setupall
 [[ $(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
 
 $LCTL set_param debug=+lfsck > /dev/null || true
@@ -2758,7 +2762,7 @@ test_22a() {
        echo "#####"
        echo "The parent_A references the child directory via some name entry,"
        echo "but the child directory back references another parent_B via its"
-       echo "".." name entry. The parent_A does not exist. Then the namesapce"
+       echo "".." name entry. The parent_B does not exist. Then the namesapce"
        echo "LFSCK will repair the child directory's ".." name entry."
        echo "#####"
 
@@ -2807,7 +2811,7 @@ test_22b() {
        echo "The parent_A references the child directory via the name entry_B,"
        echo "but the child directory back references another parent_C via its"
        echo "".." name entry. The parent_C exists, but there is no the name"
-       echo "entry_B under the parent_B. Then the namesapce LFSCK will repair"
+       echo "entry_B under the parent_C. Then the namesapce LFSCK will repair"
        echo "the child directory's ".." name entry and its linkEA."
        echo "#####"
 
@@ -2819,8 +2823,8 @@ test_22b() {
        echo "Inject failure stub on MDT0 to simulate bad dotdot name entry"
        echo "and bad linkEA. The dummy's dotdot name entry references the"
        echo "guard. The dummy's linkEA references n non-exist name entry."
-       #define OBD_FAIL_LFSCK_BAD_PARENT2      0x161f
-       do_facet $SINGLEMDS $LCTL set_param fail_loc=0x161f
+       #define OBD_FAIL_LFSCK_BAD_PARENT       0x161e
+       do_facet $SINGLEMDS $LCTL set_param fail_loc=0x161e
        $LFS mkdir -i 0 $DIR/$tdir/foo/dummy ||
                error "(3) Fail to mkdir on MDT0"
        do_facet $SINGLEMDS $LCTL set_param fail_loc=0
@@ -3065,7 +3069,13 @@ test_24() {
 
        mkdir $DIR/$tdir/d0/dummy || error "(2) Fail to mkdir dummy"
        $LFS path2fid $DIR/$tdir/d0/dummy
-       local pfid=$($LFS path2fid $DIR/$tdir/d0/dummy)
+
+       local pfid
+       if [ $(facet_fstype $SINGLEMDS) != ldiskfs ]; then
+               pfid=$($LFS path2fid $DIR/$tdir/d0/guard)
+       else
+               pfid=$($LFS path2fid $DIR/$tdir/d0/dummy)
+       fi
 
        touch $DIR/$tdir/d0/guard/foo ||
                error "(3) Fail to touch $DIR/$tdir/d0/guard/foo"
@@ -3082,6 +3092,7 @@ test_24() {
        do_facet $SINGLEMDS $LCTL set_param fail_loc=0x1622
        $LFS mkdir -i 0 $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)
        rmdir $DIR/$tdir/d0/dummy/foo ||
                error "(5) Fail to remove $DIR/$tdir/d0/dummy/foo name entry"
@@ -3834,6 +3845,303 @@ test_31b() {
 }
 run_test 31b "The LFSCK can find/repair the name entry with bad name hash (2)"
 
+test_31c() {
+       [ $MDSCOUNT -lt 2 ] &&
+               skip "The test needs at least 2 MDTs" && return
+
+       echo "#####"
+       echo "For some reason, the master MDT-object of the striped directory"
+       echo "may lost its master LMV EA. If nobody created files under the"
+       echo "master directly after the master LMV EA lost, then the LFSCK"
+       echo "should re-generate the master LMV EA."
+       echo "#####"
+
+       check_mount_and_prep
+
+       echo "Inject failure stub on MDT0 to simulate the case that the"
+       echo "master MDT-object of the striped directory lost the LMV EA."
+
+       #define OBD_FAIL_LFSCK_LOST_MASTER_LMV  0x1629
+       do_facet $SINGLEMDS $LCTL set_param fail_loc=0x1629
+       $LFS setdirstripe -i 0 -c $MDSCOUNT $DIR/$tdir/striped_dir ||
+               error "(1) Fail to create striped directory"
+       do_facet $SINGLEMDS $LCTL set_param fail_loc=0
+
+       echo "Trigger namespace LFSCK to re-generate master LMV EA"
+       $START_NAMESPACE -r -A ||
+               error "(2) Fail to start LFSCK for namespace"
+
+       wait_update_facet $SINGLEMDS "$LCTL get_param -n \
+               mdd.${MDT_DEV}.lfsck_namespace |
+               awk '/^status/ { print \\\$2 }'" "completed" 32 || {
+               $SHOW_NAMESPACE
+               error "(3) unexpected status"
+       }
+
+       local repaired=$($SHOW_NAMESPACE |
+                        awk '/^striped_dirs_repaired/ { print $2 }')
+       [ $repaired -eq 1 ] ||
+               error "(4) Fail to re-generate master LMV EA: $repaired"
+
+       umount_client $MOUNT || error "(5) umount failed"
+       mount_client $MOUNT || error "(6) mount failed"
+
+       local empty=$(ls $DIR/$tdir/striped_dir/)
+       [ -z "$empty" ] || error "(7) The master LMV EA is not repaired: $empty"
+
+       rmdir $DIR/$tdir/striped_dir ||
+               error "(8) Fail to remove the striped directory after LFSCK"
+}
+run_test 31c "Re-generate the lost master LMV EA for striped directory"
+
+test_31d() {
+       [ $MDSCOUNT -lt 2 ] &&
+               skip "The test needs at least 2 MDTs" && return
+
+       echo "#####"
+       echo "For some reason, the master MDT-object of the striped directory"
+       echo "may lost its master LMV EA. If somebody created files under the"
+       echo "master directly after the master LMV EA lost, then the LFSCK"
+       echo "should NOT re-generate the master LMV EA, instead, it should"
+       echo "change the broken striped dirctory as read-only to prevent"
+       echo "further damage"
+       echo "#####"
+
+       check_mount_and_prep
+
+       echo "Inject failure stub on MDT0 to simulate the case that the"
+       echo "master MDT-object of the striped directory lost the LMV EA."
+
+       #define OBD_FAIL_LFSCK_LOST_MASTER_LMV  0x1629
+       do_facet $SINGLEMDS $LCTL set_param fail_loc=0x1629
+       $LFS setdirstripe -i 0 -c $MDSCOUNT $DIR/$tdir/striped_dir ||
+               error "(1) Fail to create striped directory"
+       do_facet $SINGLEMDS $LCTL set_param fail_loc=0x0
+
+       umount_client $MOUNT || error "(2) umount failed"
+       mount_client $MOUNT || error "(3) mount failed"
+
+       touch $DIR/$tdir/striped_dir/dummy ||
+               error "(4) Fail to touch under broken striped directory"
+
+       echo "Trigger namespace LFSCK to find out the inconsistency"
+       $START_NAMESPACE -r -A ||
+               error "(5) Fail to start LFSCK for namespace"
+
+       wait_update_facet $SINGLEMDS "$LCTL get_param -n \
+               mdd.${MDT_DEV}.lfsck_namespace |
+               awk '/^status/ { print \\\$2 }'" "completed" 32 || {
+               $SHOW_NAMESPACE
+               error "(6) unexpected status"
+       }
+
+       local repaired=$($SHOW_NAMESPACE |
+                        awk '/^striped_dirs_repaired/ { print $2 }')
+       [ $repaired -eq 0 ] ||
+               error "(7) Re-generate master LMV EA unexpected: $repaired"
+
+       stat $DIR/$tdir/striped_dir/dummy ||
+               error "(8) Fail to stat $DIR/$tdir/striped_dir/dummy"
+
+       touch $DIR/$tdir/striped_dir/foo &&
+               error "(9) The broken striped directory should be read-only"
+
+       chattr -i $DIR/$tdir/striped_dir ||
+               error "(10) Fail to chattr on the broken striped directory"
+
+       rmdir $DIR/$tdir/striped_dir ||
+               error "(11) Fail to remove the striped directory after LFSCK"
+}
+run_test 31d "Set broken striped directory (modified after broken) as read-only"
+
+test_31e() {
+       [ $MDSCOUNT -lt 2 ] &&
+               skip "The test needs at least 2 MDTs" && return
+
+       echo "#####"
+       echo "For some reason, the slave MDT-object of the striped directory"
+       echo "may lost its slave LMV EA. The LFSCK should re-generate the"
+       echo "slave LMV EA."
+       echo "#####"
+
+       check_mount_and_prep
+
+       echo "Inject failure stub on MDT0 to simulate the case that the"
+       echo "slave MDT-object (that resides on the same MDT as the master"
+       echo "MDT-object resides on) lost the LMV EA."
+
+       #define OBD_FAIL_LFSCK_LOST_SLAVE_LMV   0x162a
+       do_facet $SINGLEMDS $LCTL set_param fail_loc=0x162a fail_val=0
+       $LFS setdirstripe -i 0 -c $MDSCOUNT $DIR/$tdir/striped_dir ||
+               error "(1) Fail to create striped directory"
+       do_facet $SINGLEMDS $LCTL set_param fail_loc=0x0 fail_val=0
+
+       echo "Trigger namespace LFSCK to re-generate slave LMV EA"
+       $START_NAMESPACE -r -A ||
+               error "(2) Fail to start LFSCK for namespace"
+
+       wait_update_facet $SINGLEMDS "$LCTL get_param -n \
+               mdd.${MDT_DEV}.lfsck_namespace |
+               awk '/^status/ { print \\\$2 }'" "completed" 32 || {
+               $SHOW_NAMESPACE
+               error "(3) unexpected status"
+       }
+
+       local repaired=$($SHOW_NAMESPACE |
+                        awk '/^striped_shards_repaired/ { print $2 }')
+       [ $repaired -eq 1 ] ||
+               error "(4) Fail to re-generate slave LMV EA: $repaired"
+
+       rmdir $DIR/$tdir/striped_dir ||
+               error "(5) Fail to remove the striped directory after LFSCK"
+}
+run_test 31e "Re-generate the lost slave LMV EA for striped directory (1)"
+
+test_31f() {
+       [ $MDSCOUNT -lt 2 ] &&
+               skip "The test needs at least 2 MDTs" && return
+
+       echo "#####"
+       echo "For some reason, the slave MDT-object of the striped directory"
+       echo "may lost its slave LMV EA. The LFSCK should re-generate the"
+       echo "slave LMV EA."
+       echo "#####"
+
+       check_mount_and_prep
+
+       echo "Inject failure stub on MDT0 to simulate the case that the"
+       echo "slave MDT-object (that resides on differnt MDT as the master"
+       echo "MDT-object resides on) lost the LMV EA."
+
+       #define OBD_FAIL_LFSCK_LOST_SLAVE_LMV   0x162a
+       do_facet $SINGLEMDS $LCTL set_param fail_loc=0x162a fail_val=1
+       $LFS setdirstripe -i 0 -c $MDSCOUNT $DIR/$tdir/striped_dir ||
+               error "(1) Fail to create striped directory"
+       do_facet $SINGLEMDS $LCTL set_param fail_loc=0x0 fail_val=0
+
+       echo "Trigger namespace LFSCK to re-generate slave LMV EA"
+       $START_NAMESPACE -r -A ||
+               error "(2) Fail to start LFSCK for namespace"
+
+       wait_update_facet mds2 "$LCTL get_param -n \
+               mdd.$(facet_svc mds2).lfsck_namespace |
+               awk '/^status/ { print \\\$2 }'" "completed" 32 ||
+               error "(3) unexpected status"
+
+       local repaired=$(do_facet mds2 $LCTL get_param -n \
+                        mdd.$(facet_svc mds2).lfsck_namespace |
+                        awk '/^striped_shards_repaired/ { print $2 }')
+       [ $repaired -eq 1 ] ||
+               error "(4) Fail to re-generate slave LMV EA: $repaired"
+
+       rmdir $DIR/$tdir/striped_dir ||
+               error "(5) Fail to remove the striped directory after LFSCK"
+}
+run_test 31f "Re-generate the lost slave LMV EA for striped directory (2)"
+
+test_31g() {
+       [ $MDSCOUNT -lt 2 ] &&
+               skip "The test needs at least 2 MDTs" && return
+
+       echo "#####"
+       echo "For some reason, the stripe index in the slave LMV EA is"
+       echo "corrupted. The LFSCK should repair the slave LMV EA."
+       echo "#####"
+
+       check_mount_and_prep
+
+       echo "Inject failure stub on MDT0 to simulate the case that the"
+       echo "slave LMV EA on the first shard of the striped directory"
+       echo "claims the same index as the second shard claims"
+
+       #define OBD_FAIL_LFSCK_BAD_SLAVE_LMV    0x162b
+       do_facet $SINGLEMDS $LCTL set_param fail_loc=0x162b fail_val=0
+       $LFS setdirstripe -i 0 -c $MDSCOUNT $DIR/$tdir/striped_dir ||
+               error "(1) Fail to create striped directory"
+       do_facet $SINGLEMDS $LCTL set_param fail_loc=0x0 fail_val=0
+
+       echo "Trigger namespace LFSCK to repair the slave LMV EA"
+       $START_NAMESPACE -r -A ||
+               error "(2) Fail to start LFSCK for namespace"
+
+       wait_update_facet $SINGLEMDS "$LCTL get_param -n \
+               mdd.${MDT_DEV}.lfsck_namespace |
+               awk '/^status/ { print \\\$2 }'" "completed" 32 || {
+               $SHOW_NAMESPACE
+               error "(3) unexpected status"
+       }
+
+       local repaired=$($SHOW_NAMESPACE |
+                        awk '/^striped_shards_repaired/ { print $2 }')
+       [ $repaired -eq 1 ] ||
+               error "(4) Fail to repair slave LMV EA: $repaired"
+
+       umount_client $MOUNT || error "(5) umount failed"
+       mount_client $MOUNT || error "(6) mount failed"
+
+       touch $DIR/$tdir/striped_dir/foo ||
+               error "(7) Fail to touch file after the LFSCK"
+
+       rm -f $DIR/$tdir/striped_dir/foo ||
+               error "(8) Fail to unlink file after the LFSCK"
+
+       rmdir $DIR/$tdir/striped_dir ||
+               error "(9) Fail to remove the striped directory after LFSCK"
+}
+run_test 31g "Repair the corrupted slave LMV EA"
+
+test_31h() {
+       [ $MDSCOUNT -lt 2 ] &&
+               skip "The test needs at least 2 MDTs" && return
+
+       echo "#####"
+       echo "For some reason, the shard's name entry in the striped"
+       echo "directory may be corrupted. The LFSCK should repair the"
+       echo "bad shard's name entry."
+       echo "#####"
+
+       check_mount_and_prep
+
+       echo "Inject failure stub on MDT0 to simulate the case that the"
+       echo "first shard's name entry in the striped directory claims"
+       echo "the same index as the second shard's name entry claims."
+
+       #define OBD_FAIL_LFSCK_BAD_SLAVE_NAME   0x162c
+       do_facet $SINGLEMDS $LCTL set_param fail_loc=0x162c fail_val=0
+       $LFS setdirstripe -i 0 -c $MDSCOUNT $DIR/$tdir/striped_dir ||
+               error "(1) Fail to create striped directory"
+       do_facet $SINGLEMDS $LCTL set_param fail_loc=0x0 fail_val=0
+
+       echo "Trigger namespace LFSCK to repair the shard's name entry"
+       $START_NAMESPACE -r -A ||
+               error "(2) Fail to start LFSCK for namespace"
+
+       wait_update_facet $SINGLEMDS "$LCTL get_param -n \
+               mdd.${MDT_DEV}.lfsck_namespace |
+               awk '/^status/ { print \\\$2 }'" "completed" 32 || {
+               $SHOW_NAMESPACE
+               error "(3) unexpected status"
+       }
+
+       local repaired=$($SHOW_NAMESPACE |
+                        awk '/^dirent_repaired/ { print $2 }')
+       [ $repaired -eq 1 ] ||
+               error "(4) Fail to repair shard's name entry: $repaired"
+
+       umount_client $MOUNT || error "(5) umount failed"
+       mount_client $MOUNT || error "(6) mount failed"
+
+       touch $DIR/$tdir/striped_dir/foo ||
+               error "(7) Fail to touch file after the LFSCK"
+
+       rm -f $DIR/$tdir/striped_dir/foo ||
+               error "(8) Fail to unlink file after the LFSCK"
+
+       rmdir $DIR/$tdir/striped_dir ||
+               error "(9) Fail to remove the striped directory after LFSCK"
+}
+run_test 31h "Repair the corrupted shard's name entry"
+
 $LCTL set_param debug=-lfsck > /dev/null || true
 
 # restore MDS/OST size