From 10660c3923bf123be76b65816d8b53b5d8799782 Mon Sep 17 00:00:00 2001 From: Kyrylo Shatskyy Date: Wed, 13 Jun 2012 03:53:46 +0300 Subject: [PATCH] LU-1564 test: sanity test_200d fails Because sub-tests in test_200 group and test_201 group are the parts of one scenario and designed to be run sequentially one-by-one, so each of which depends on previous. Correspondingly, tests from 200a to 200h and from 201a to 201c have been refactored into single test_200 test. Xyratex-bug-id: MRP-346 Signed-off-by: Kyrylo Shatskyy Reviewed-by: Bruce Korb Reviewed-by: Alexander Zarochentsev Change-Id: I9f0b5b76bdb0a060cf6062199d8acf7ea355f7ce Reviewed-on: http://review.whamcloud.com/3184 Tested-by: Hudson Reviewed-by: Yu Jian Tested-by: Maloo Reviewed-by: Oleg Drokin --- lustre/tests/sanity.sh | 388 +++++++++++++++++++++++++++++++------------------ 1 file changed, 249 insertions(+), 139 deletions(-) diff --git a/lustre/tests/sanity.sh b/lustre/tests/sanity.sh index db3c780..071343d 100644 --- a/lustre/tests/sanity.sh +++ b/lustre/tests/sanity.sh @@ -8509,189 +8509,299 @@ test_182() { run_test 182 "Disable MDC RPCs semaphore wouldn't crash client ================" # OST pools tests -POOL=${POOL:-cea1} -TGT_COUNT=$OSTCOUNT -TGTPOOL_FIRST=1 -TGTPOOL_MAX=$(($TGT_COUNT - 1)) -TGTPOOL_STEP=2 -TGTPOOL_LIST=`seq $TGTPOOL_FIRST $TGTPOOL_STEP $TGTPOOL_MAX` -POOL_ROOT=${POOL_ROOT:-$DIR/d200.pools} -POOL_DIR_NAME=dir_tst -POOL_DIR=$POOL_ROOT/$POOL_DIR_NAME -POOL_FILE=$POOL_ROOT/file_tst - check_file_in_pool() { - file=$1 - res=$($GETSTRIPE $file | grep 0x | cut -f2) + local file=$1 + local pool=$2 + local tlist="$3" + local res=$($GETSTRIPE $file | grep 0x | cut -f2) for i in $res do - found=$(echo :$TGTPOOL_LIST: | tr " " ":" | grep :$i:) - if [[ "$found" == "" ]] - then - echo "pool list: $TGTPOOL_LIST" - echo "striping: $res" - error "$file not allocated in $POOL" - return 1 - fi + for t in $tlist ; do + [ "$i" -eq "$t" ] && continue 2 + done + + echo "pool list: $tlist" + echo "striping: $res" + error_noexit "$file not allocated in $pool" + return 1 done return 0 } -trap "cleanup_pools $FSNAME" EXIT +pool_add() { + echo "Creating new pool" + local pool=$1 -test_200a() { - remote_mgs_nodsh && skip "remote MGS with nodsh" && return - create_pool $FSNAME.$POOL || return $? - [ $($LFS pool_list $FSNAME | grep -c $POOL) -eq 1 ] || - error "$POOL not in lfs pool_list" + create_pool $FSNAME.$pool || + { error_noexit "No pool created, result code $?"; return 1; } + [ $($LFS pool_list $FSNAME | grep -c $pool) -eq 1 ] || + { error_noexit "$pool not in lfs pool_list"; return 2; } } -run_test 200a "Create new pool ==========================================" -test_200b() { - remote_mgs_nodsh && skip "remote MGS with nodsh" && return - TGT=$(for i in $TGTPOOL_LIST; do printf "$FSNAME-OST%04x_UUID " $i; done) - do_facet mgs $LCTL pool_add $FSNAME.$POOL \ - $FSNAME-OST[$TGTPOOL_FIRST-$TGTPOOL_MAX/$TGTPOOL_STEP] - wait_update $HOSTNAME "lctl get_param -n lov.$FSNAME-*.pools.$POOL | sort -u | tr '\n' ' ' " "$TGT" || - error "Add to pool failed" - local lfscount=$($LFS pool_list $FSNAME.$POOL | grep -c "\-OST") - local addcount=$((($TGTPOOL_MAX - $TGTPOOL_FIRST) / $TGTPOOL_STEP + 1)) - [ $lfscount -eq $addcount ] || - error "lfs pool_list bad ost count $lfscount != $addcount" -} -run_test 200b "Add targets to a pool ====================================" - -test_200c() { - remote_mgs_nodsh && skip "remote MGS with nodsh" && return - mkdir -p $POOL_DIR - $SETSTRIPE -c 2 -p $POOL $POOL_DIR - [ $? = 0 ] || error "Cannot set pool $POOL to $POOL_DIR" - # b-19919 test relative path works well - mkdir -p $POOL_DIR/$POOL_DIR_NAME - cd $POOL_DIR - $SETSTRIPE -c 2 -p $POOL $POOL_DIR_NAME - [ $? = 0 ] || error "Cannot set pool $POOL to $POOL_DIR/$POOL_DIR_NAME" - $SETSTRIPE -c 2 -p $POOL ./$POOL_DIR_NAME - [ $? = 0 ] || error "Cannot set pool $POOL to $POOL_DIR/./$POOL_DIR_NAME" - $SETSTRIPE -c 2 -p $POOL ../$POOL_DIR_NAME - [ $? = 0 ] || error "Cannot set pool $POOL to $POOL_DIR/../$POOL_DIR_NAME" - $SETSTRIPE -c 2 -p $POOL ../$POOL_DIR_NAME/$POOL_DIR_NAME - [ $? = 0 ] || error "Cannot set pool $POOL to $POOL_DIR/../$POOL_DIR_NAME/$POOL_DIR_NAME" - rm -rf $POOL_DIR_NAME; cd - -} -run_test 200c "Set pool on a directory =================================" - -test_200d() { - remote_mgs_nodsh && skip "remote MGS with nodsh" && return - res=$($GETSTRIPE --pool $POOL_DIR) - [ $res = $POOL ] || error "Pool on $POOL_DIR is $res, not $POOL" +pool_add_targets() { + echo "Adding targets to pool" + local pool=$1 + local first=$2 + local last=$3 + local step=${4:-1} + + local list=$(seq $first $step $last) + + local t=$(for i in $list; do printf "$FSNAME-OST%04x_UUID " $i; done) + do_facet mgs $LCTL pool_add \ + $FSNAME.$pool $FSNAME-OST[$first-$last/$step] + wait_update $HOSTNAME "lctl get_param -n lov.$FSNAME-*.pools.$pool \ + | sort -u | tr '\n' ' ' " "$t" || { + error_noexit "Add to pool failed" + return 1 + } + local lfscount=$($LFS pool_list $FSNAME.$pool | grep -c "\-OST") + local addcount=$(((last - first) / step + 1)) + [ $lfscount -eq $addcount ] || { + error_noexit "lfs pool_list bad ost count" \ + "$lfscount != $addcount" + return 2 + } } -run_test 200d "Check pool on a directory ===============================" -test_200e() { - remote_mgs_nodsh && skip "remote MGS with nodsh" && return - failed=0 - for i in $(seq -w 1 $(($TGT_COUNT * 3))) +pool_set_dir() { + local pool=$1 + local tdir=$2 + echo "Setting pool on directory $tdir" + + $SETSTRIPE -c 2 -p $pool $tdir && return 0 + + error_noexit "Cannot set pool $pool to $tdir" + return 1 +} + +pool_check_dir() { + local pool=$1 + local tdir=$2 + echo "Checking pool on directory $tdir" + + local res=$($GETSTRIPE --pool $tdir | sed "s/\s*$//") + [ "$res" = "$pool" ] && return 0 + + error_noexit "Pool on '$tdir' is '$res', not '$pool'" + return 1 +} + +pool_dir_rel_path() { + echo "Testing relative path works well" + local pool=$1 + local tdir=$2 + local root=$3 + + mkdir -p $root/$tdir/$tdir + cd $root/$tdir + pool_set_dir $pool $tdir || return 1 + pool_set_dir $pool ./$tdir || return 2 + pool_set_dir $pool ../$tdir || return 3 + pool_set_dir $pool ../$tdir/$tdir || return 4 + rm -rf $tdir; cd - > /dev/null +} + +pool_alloc_files() { + echo "Checking files allocation from directory pool" + local pool=$1 + local tdir=$2 + local count=$3 + local tlist="$4" + + local failed=0 + for i in $(seq -w 1 $count) do - file=$POOL_DIR/file-$i + local file=$tdir/file-$i touch $file - check_file_in_pool $file - if [[ $? != 0 ]] - then - failed=$(($failed + 1)) - fi + check_file_in_pool $file $pool "$tlist" || \ + failed=$((failed + 1)) done - [ "$failed" = 0 ] || error "$failed files not allocated in $POOL" + [ "$failed" = 0 ] && return 0 + + error_noexit "$failed files not allocated in $pool" + return 1 } -run_test 200e "Check files allocation from directory pool ==============" -test_200f() { - remote_mgs_nodsh && skip "remote MGS with nodsh" && return - mkdir -p $POOL_FILE - failed=0 - for i in $(seq -w 1 $(($TGT_COUNT * 3))) +pool_create_files() { + echo "Creating files in pool" + local pool=$1 + local tdir=$2 + local count=$3 + local tlist="$4" + + mkdir -p $tdir + local failed=0 + for i in $(seq -w 1 $count) do - file=$POOL_FILE/spoo-$i - $SETSTRIPE -p $POOL $file - check_file_in_pool $file - if [[ $? != 0 ]] - then - failed=$(($failed + 1)) - fi + local file=$tdir/spoo-$i + $SETSTRIPE -p $pool $file + check_file_in_pool $file $pool "$tlist" || \ + failed=$((failed + 1)) done - [ "$failed" = 0 ] || error "$failed files not allocated in $POOL" + [ "$failed" = 0 ] && return 0 + + error_noexit "$failed files not allocated in $pool" + return 1 } -run_test 200f "Create files in a pool ===================================" -test_200g() { - remote_mgs_nodsh && skip "remote MGS with nodsh" && return - TGT=$($LCTL get_param -n lov.$FSNAME-clilov-*.pools.$POOL | tr '\n' ' ') - res=$($LFS df --pool $FSNAME.$POOL | awk '{print $1}' | grep "$FSNAME-OST" | tr '\n' ' ') - [ "$res" = "$TGT" ] || error "Pools OSTs '$TGT' is not '$res' that lfs df reports" +pool_lfs_df() { + echo "Checking 'lfs df' output" + local pool=$1 + + local t=$($LCTL get_param -n lov.$FSNAME-clilov-*.pools.$pool | + tr '\n' ' ') + local res=$($LFS df --pool $FSNAME.$pool | + awk '{print $1}' | + grep "$FSNAME-OST" | + tr '\n' ' ') + [ "$res" = "$t" ] && return 0 + + error_noexit "Pools OSTs '$t' is not '$res' that lfs df reports" + return 1 } -run_test 200g "lfs df a pool ============================================" -test_200h() { # b=24039 - mkdir -p $POOL_DIR || error "unable to create $POOL_DIR" +pool_file_rel_path() { + echo "Creating files in a pool with relative pathname" + local pool=$1 + local tdir=$2 - local file="/..$POOL_DIR/$tfile-1" - $SETSTRIPE -p $POOL $file || error "unable to create $file" + mkdir -p $tdir || + { error_noexit "unable to create $tdir"; return 1 ; } + local file="/..$tdir/$tfile-1" + $SETSTRIPE -p $pool $file || + { error_noexit "unable to create $file" ; return 2 ; } - cd $POOL_DIR - $SETSTRIPE -p $POOL $tfile-2 || \ - error "unable to create $tfile-2 in $POOL_DIR" + cd $tdir + $SETSTRIPE -p $pool $tfile-2 || { + error_noexit "unable to create $tfile-2 in $tdir" + return 3 + } } -run_test 200h "Create files in a pool with relative pathname ============" -test_201a() { - remote_mgs_nodsh && skip "remote MGS with nodsh" && return - TGT=$($LCTL get_param -n lov.$FSNAME-*.pools.$POOL | head -1) - do_facet mgs $LCTL pool_remove $FSNAME.$POOL $TGT - wait_update $HOSTNAME "lctl get_param -n lov.$FSNAME-*.pools.$POOL | grep $TGT" "" || - error "$TGT not removed from $FSNAME.$POOL" +pool_remove_first_target() { + echo "Removing first target from a pool" + local pool=$1 + + local pname="lov.$FSNAME-*.pools.$pool" + local t=$($LCTL get_param -n $pname | head -1) + do_facet mgs $LCTL pool_remove $FSNAME.$pool $t + wait_update $HOSTNAME "lctl get_param -n $pname | grep $t" "" || { + error_noexit "$t not removed from $FSNAME.$pool" + return 1 + } } -run_test 201a "Remove a target from a pool =============================" -test_201b() { - remote_mgs_nodsh && skip "remote MGS with nodsh" && return - for TGT in $($LCTL get_param -n lov.$FSNAME-*.pools.$POOL | sort -u) +pool_remove_all_targets() { + echo "Removing all targets from pool" + local pool=$1 + local file=$2 + local pname="lov.$FSNAME-*.pools.$pool" + for t in $($LCTL get_param -n $pname | sort -u) do - do_facet mgs $LCTL pool_remove $FSNAME.$POOL $TGT - done - wait_update $HOSTNAME "lctl get_param -n lov.$FSNAME-*.pools.$POOL" "" || - error "Pool $FSNAME.$POOL cannot be drained" - # striping on an empty/nonexistant pool should fall back to "pool of everything" - touch ${POOL_DIR}/$tfile || error "failed to use fallback striping for empty pool" + do_facet mgs $LCTL pool_remove $FSNAME.$pool $t + done + wait_update $HOSTNAME "lctl get_param -n $pname" "" || { + error_noexit "Pool $FSNAME.$pool cannot be drained" + return 1 + } + # striping on an empty/nonexistant pool should fall back + # to "pool of everything" + touch $file || { + error_noexit "failed to use fallback striping for empty pool" + return 2 + } # setstripe on an empty pool should fail - $SETSTRIPE -p $POOL ${POOL_FILE}/$tfile 2>/dev/null && \ - error "expected failure when creating file with empty pool" + $SETSTRIPE -p $pool $file 2>/dev/null && { + error_noexit "expected failure when creating file" \ + "with empty pool" + return 3 + } return 0 } -run_test 201b "Remove all targets from a pool ==========================" -test_201c() { - remote_mgs_nodsh && skip "remote MGS with nodsh" && return - do_facet mgs $LCTL pool_destroy $FSNAME.$POOL +pool_remove() { + echo "Destroying pool" + local pool=$1 + local file=$2 + + do_facet mgs $LCTL pool_destroy $FSNAME.$pool sleep 2 - # striping on an empty/nonexistant pool should fall back to "pool of everything" - touch ${POOL_DIR}/$tfile || error "failed to use fallback striping for missing pool" + # striping on an empty/nonexistant pool should fall back + # to "pool of everything" + touch $file || { + error_noexit "failed to use fallback striping for missing pool" + return 1 + } # setstripe on an empty pool should fail - $SETSTRIPE -p $POOL ${POOL_FILE}/$tfile 2>/dev/null && \ - error "expected failure when creating file with missing pool" + $SETSTRIPE -p $pool $file 2>/dev/null && { + error_noexit "expected failure when creating file" \ + "with missing pool" + return 2 + } # get param should return err once pool is gone - if wait_update $HOSTNAME "lctl get_param -n lov.$FSNAME-*.pools.$POOL 2>/dev/null || - echo foo" "foo"; then - remove_pool_from_list $FSNAME.$POOL + if wait_update $HOSTNAME "lctl get_param -n \ + lov.$FSNAME-*.pools.$pool 2>/dev/null || echo foo" "foo" + then + remove_pool_from_list $FSNAME.$pool return 0 fi - error "Pool $FSNAME.$POOL is not destroyed" + error_noexit "Pool $FSNAME.$pool is not destroyed" + return 3 } -run_test 201c "Remove a pool ============================================" -cleanup_pools $FSNAME +test_200() { + remote_mgs_nodsh && skip "remote MGS with nodsh" && return + + local POOL=${POOL:-cea1} + local POOL_ROOT=${POOL_ROOT:-$DIR/d200.pools} + local POOL_DIR_NAME=${POOL_DIR_NAME:-dir_tst} + # Pool OST targets + local first_ost=1 + local last_ost=$(($OSTCOUNT - 1)) + local ost_step=2 + local ost_list=$(seq $first_ost $ost_step $last_ost) + local ost_range="$first_ost $last_ost $ost_step" + local test_path=$POOL_ROOT/$POOL_DIR_NAME + local file_dir=$POOL_ROOT/file_tst + + local rc=0 + while : ; do + # former test_200a test_200b + pool_add $POOL || { rc=$? ; break; } + pool_add_targets $POOL $ost_range || { rc=$? ; break; } + # former test_200c test_200d + mkdir -p $test_path + pool_set_dir $POOL $test_path || { rc=$? ; break; } + pool_check_dir $POOL $test_path || { rc=$? ; break; } + pool_dir_rel_path $POOL $POOL_DIR_NAME $POOL_ROOT \ + || { rc=$? ; break; } + # former test_200e test_200f + local files=$((OSTCOUNT*3)) + pool_alloc_files $POOL $test_path $files "$ost_list" \ + || { rc=$? ; break; } + pool_create_files $POOL $file_dir $files "$ost_list" \ + || { rc=$? ; break; } + # former test_200g test_200h + pool_lfs_df $POOL || { rc=$? ; break; } + pool_file_rel_path $POOL $test_path || { rc=$? ; break; } + + # former test_201a test_201b test_201c + pool_remove_first_target $POOL || { rc=$? ; break; } + + local f=$test_path/$tfile + pool_remove_all_targets $POOL $f || { rc=$? ; break; } + pool_remove $POOL $f || { rc=$? ; break; } + break + done + + cleanup_pools + return $rc +} +run_test 200 "OST pools" # usage: default_attr default_attr() { -- 1.8.3.1