X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Ftests%2Flfsck.sh;h=1c805a1e6a810366dd1fd4f0f889d72b195c0b37;hb=1d371ca47e67a46492ddcfddd7676662362ce0b7;hp=866c1e9b735c9900e98fc00f3394285b91e500fb;hpb=d44b89dce32f4de91a8ef6c07d2340c9ff75773b;p=fs%2Flustre-release.git diff --git a/lustre/tests/lfsck.sh b/lustre/tests/lfsck.sh index 866c1e9..1c805a1 100644 --- a/lustre/tests/lfsck.sh +++ b/lustre/tests/lfsck.sh @@ -1,4 +1,6 @@ #!/bin/bash +# -*- mode: Bash; tab-width: 4; indent-tabs-mode: t; -*- +# vim:shiftwidth=4:softtabstop=4:tabstop=4: # # test e2fsck and lfsck to detect and fix filesystem corruption # @@ -18,15 +20,27 @@ OBJGRP=${OBJGRP:-0} # the OST object group [ -d "$SHARED_DIRECTORY" ] || \ { skip "SHARED_DIRECTORY should be specified with a shared directory \ which can be accessable on all of the nodes" && exit 0; } +[[ $(facet_fstype $SINGLEMDS) != ldiskfs ]] && + skip "Only applicable to ldiskfs-based MDTs" && exit 0 +[[ $(facet_fstype OST) != ldiskfs ]] && + skip "Only applicable to ldiskfs-based OST" && exit 0 -which getfattr > /dev/null 2>&1 || { skip "could not find getfattr" && exit 0; } -which setfattr > /dev/null 2>&1 || { skip "could not find setfattr" && exit 0; } +which getfattr &>/dev/null || { skip_env "could not find getfattr" && exit 0; } +which setfattr &>/dev/null || { skip_env "could not find setfattr" && exit 0; } + +if [ ! -x `which $LFSCK_BIN` ]; then + log "$($E2FSCK -V)" + error "e2fsprogs does not support lfsck" +fi MOUNT_2="" check_and_setup_lustre assert_DIR +SAMPLE_FILE=$TMP/$(basename $0 .sh).junk +dd if=/dev/urandom of=$SAMPLE_FILE bs=1M count=1 + # Create some dirs and files on the filesystem. create_files_sub() { local test_dir=$1 @@ -62,7 +76,7 @@ create_files() { # create files to be modified for f in $(seq -f $test_dir/testfile.%g $((num_files * 3))); do echo "creating $f" - cp /etc/termcap $f || error "cp /etc/termcap $f failed" + cp $SAMPLE_FILE $f || error "cp $SAMPLE_FILE $f failed" done # create some more files @@ -98,7 +112,7 @@ get_ost_node() { local ost_node local node - ost_uuid=$($LFS osts | grep "^$obdidx: " | cut -d' ' -f2 | head -n1) + ost_uuid=$(ostuuid_from_index $obdidx) for node in $(osts_nodes); do do_node $node "lctl get_param -n obdfilter.*.uuid" | grep -q $ost_uuid @@ -111,25 +125,24 @@ get_ost_node() { # Get the OST target device (given the OST facet name and OST index). get_ost_dev() { - local node=$1 - local obdidx=$2 - local ost_name - local ost_dev - - ost_name=$($LFS osts | grep "^$obdidx: " | cut -d' ' -f2 | \ - head -n1 | sed -e 's/_UUID$//') - - ost_dev=$(do_node $node "lctl get_param -n obdfilter.$ost_name.mntdev") - [ ${PIPESTATUS[0]} -ne 0 ] && \ - echo "failed to find the OST device with index $obdidx on $facet" && \ - return 1 + local node=$1 + local obdidx=$2 + local ost_name + local ost_dev + + ost_name=$(ostname_from_index $obdidx) + ost_dev=$(get_obdfilter_param $node $ost_name mntdev) + if [ $? -ne 0 ]; then + printf "unable to find OST%04x on $facet\n" $obdidx + return 1 + fi - if [[ $ost_dev = *loop* ]]; then - ost_dev=$(do_node $node "losetup $ost_dev" | \ - sed -e "s/.*(//" -e "s/).*//") - fi + if [[ $ost_dev = *loop* ]]; then + ost_dev=$(do_node $node "losetup $ost_dev" | \ + sed -e "s/.*(//" -e "s/).*//") + fi - echo $ost_dev + echo $ost_dev } # Get the file names to be duplicated or removed on the MDS. @@ -205,7 +218,7 @@ init_logging # get the server target devices get_svr_devs -if [ "$SKIP_LFSCK" = "no" ] && is_empty_fs $MOUNT; then +if is_empty_fs $MOUNT; then # create test directory TESTDIR=$DIR/d0.$TESTSUITE mkdir -p $TESTDIR || error "mkdir $TESTDIR failed" @@ -241,7 +254,7 @@ if [ "$SKIP_LFSCK" = "no" ] && is_empty_fs $MOUNT; then duplicate_files $SINGLEMDS $MDTDEV $MDS_DUPE || \ error "duplicating files failed" FSCK_MAX_ERR=1 # file system errors corrected -else # I_MOUNTED=no +else # is_empty_fs $MOUNT FSCK_MAX_ERR=4 # file system errors left uncorrected fi @@ -249,38 +262,30 @@ fi # lfsck will return 1 if the filesystem had errors fixed # run e2fsck to generate databases used for lfsck generate_db -if [ "$SKIP_LFSCK" != "no" ]; then - echo "skip lfsck" + +# remount filesystem +REFORMAT="" +check_and_setup_lustre + +# run lfsck +rc=0 +run_lfsck || rc=$? +if [ $rc -eq 0 ]; then + echo "clean after the first check" else - # remount filesystem - REFORMAT="" - check_and_setup_lustre + # run e2fsck again to generate databases used for lfsck + generate_db - # run lfsck + # run lfsck again rc=0 run_lfsck || rc=$? if [ $rc -eq 0 ]; then - echo "clean after the first check" + echo "clean after the second check" else - # run e2fsck again to generate databases used for lfsck - generate_db - - # run lfsck again - rc=0 - run_lfsck || rc=$? - if [ $rc -eq 0 ]; then - echo "clean after the second check" - else - error "lfsck test 2 - finished with rc=$rc" - fi + error "lfsck test 2 - finished with rc=$rc" fi fi -equals_msg $(basename $0): test complete, cleaning up - -LFSCK_ALWAYS=no +complete $(basename $0) $SECONDS check_and_cleanup_lustre -[ -f "$TESTSUITELOG" ] && cat $TESTSUITELOG && \ - grep -q FAIL $TESTSUITELOG && exit 1 || true - -echo "$0: completed" +exit_status