X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=blobdiff_plain;f=lustre%2Ftests%2Fsanity-hsm.sh;h=04bcd65d838639d8c656a2026a93c14c8514922d;hp=7aa54d504401f3d9aa60f709657bce2a175b1205;hb=ee3fa324a331f1aff1c42e900170944756f5a725;hpb=39871df164bcd09a2e0d8b60c74dd2bb0c1151be diff --git a/lustre/tests/sanity-hsm.sh b/lustre/tests/sanity-hsm.sh index 7aa54d5..04bcd65 100644 --- a/lustre/tests/sanity-hsm.sh +++ b/lustre/tests/sanity-hsm.sh @@ -11,12 +11,11 @@ SRCDIR=$(dirname $0) export PATH=$PWD/$SRCDIR:$SRCDIR:$PWD/$SRCDIR/utils:$PATH:/sbin:/usr/sbin ONLY=${ONLY:-"$*"} -# bug number for skipped test: +# bug number for skipped test: 3815 3939 +ALWAYS_EXCEPT="$SANITY_HSM_EXCEPT 34 35 36 40" +# bug number for skipped test:4178 4176 +ALWAYS_EXCEPT="$ALWAYS_EXCEPT 200 221 223b 31a" # UPDATE THE COMMENT ABOVE WITH BUG NUMBERS WHEN CHANGING ALWAYS_EXCEPT! -# skip test cases failed before landing - Jinshan - -ALWAYS_EXCEPT="$SANITY_HSM_EXCEPT 12a 12b 12n 13 30a 31a 34 35 36" -ALWAYS_EXCEPT="$ALWAYS_EXCEPT 110a 200 201 221 222a 223a 223b 225" LUSTRE=${LUSTRE:-$(cd $(dirname $0)/..; echo $PWD)} @@ -114,6 +113,7 @@ copytool_device() { cleanup() { copytool_cleanup changelog_cleanup + cdt_set_sanity_policy } search_and_kill_copytool() { @@ -178,9 +178,9 @@ copytool_suspend() { copytool_remove_backend() { local fid=$1 - local be=$(find $HSM_ARCHIVE -name $fid) + local be=$(do_facet $SINGLEAGT find $HSM_ARCHIVE -name $fid) echo "Remove from backend: $fid = $be" - rm -f $be + do_facet $SINGLEAGT rm -f $be } import_file() { @@ -192,11 +192,17 @@ import_file() { make_archive() { local file=$HSM_ARCHIVE/$1 - mkdir -p $(dirname $file) - dd if=/dev/urandom of=$file count=32 bs=1000000 || + do_facet $SINGLEAGT mkdir -p $(dirname $file) + do_facet $SINGLEAGT dd if=/dev/urandom of=$file count=32 bs=1000000 || error "cannot create $file" } +copy2archive() { + local file=$HSM_ARCHIVE/$2 + do_facet $SINGLEAGT mkdir -p $(dirname $file) + do_facet $SINGLEAGT cp -p $1 $file || error "cannot copy $1 to $file" +} + changelog_setup() { CL_USER=$(do_facet $SINGLEMDS $LCTL --device $MDT0\ changelog_register -n) @@ -230,7 +236,11 @@ get_hsm_param() { set_hsm_param() { local param=$1 local value=$2 - do_facet $SINGLEMDS $LCTL set_param -n $HSM_PARAM.$param=$value + local opt=$3 + if [[ "$value" != "" ]]; then + value="=$value" + fi + do_facet $SINGLEMDS $LCTL set_param $opt -n $HSM_PARAM.$param$value return $? } @@ -243,38 +253,41 @@ set_test_state() { } cdt_set_sanity_policy() { - # clear all - do_facet $SINGLEMDS $LCTL set_param $HSM_PARAM.policy=-nra - do_facet $SINGLEMDS $LCTL set_param $HSM_PARAM.policy=-nbr - do_facet $SINGLEMDS $LCTL set_param $HSM_PARAM.policy=-gc + if [[ "$CDT_POLICY_HAD_CHANGED" ]] + then + # clear all + do_facet $SINGLEMDS $LCTL set_param $HSM_PARAM.policy=+NRA + do_facet $SINGLEMDS $LCTL set_param $HSM_PARAM.policy=-NBR + CDT_POLICY_HAD_CHANGED= + fi } cdt_set_no_retry() { - do_facet $SINGLEMDS $LCTL set_param $HSM_PARAM.policy=+nra + do_facet $SINGLEMDS $LCTL set_param $HSM_PARAM.policy=+NRA + CDT_POLICY_HAD_CHANGED=true } cdt_clear_no_retry() { - do_facet $SINGLEMDS $LCTL set_param $HSM_PARAM.policy=-nra + do_facet $SINGLEMDS $LCTL set_param $HSM_PARAM.policy=-NRA + CDT_POLICY_HAD_CHANGED=true } -cdt_set_no_blocking_restore() { - do_facet $SINGLEMDS $LCTL set_param $HSM_PARAM.policy=+nbr +cdt_set_non_blocking_restore() { + do_facet $SINGLEMDS $LCTL set_param $HSM_PARAM.policy=+NBR + CDT_POLICY_HAD_CHANGED=true } -cdt_clear_no_blocking_restore() { - do_facet $SINGLEMDS $LCTL set_param $HSM_PARAM.policy=-nbr +cdt_clear_non_blocking_restore() { + do_facet $SINGLEMDS $LCTL set_param $HSM_PARAM.policy=-NBR + CDT_POLICY_HAD_CHANGED=true } cdt_clear_mount_state() { - # /!\ conf_param and set_param syntax differ +> we cannot use - # $MDT_PARAM - do_facet $SINGLEMDS $LCTL conf_param -d $FSNAME-MDT0000.mdt.hsm_control + do_facet $SINGLEMDS $LCTL set_param -d -P $MDT_PARAM.hsm_control } cdt_set_mount_state() { - # /!\ conf_param and set_param syntax differ +> we cannot use - # $MDT_PARAM - do_facet $SINGLEMDS $LCTL conf_param $FSNAME-MDT0000.mdt.hsm_control=$1 + do_facet $SINGLEMDS $LCTL set_param -P $MDT_PARAM.hsm_control=$1 } cdt_check_state() { @@ -307,9 +320,9 @@ cdt_restart() { } needclients() { - local clnt_count=$1 - if [[ $CLIENTCOUNT -lt $clnt_count ]]; then - skip "Need $clnt_count or more clients, have $CLIENTCOUNT" + local client_count=$1 + if [[ $CLIENTCOUNT -lt $client_count ]]; then + skip "Need $client_count or more clients, have $CLIENTCOUNT" return 1 fi return 0 @@ -323,8 +336,7 @@ get_hsm_flags() { local f=$1 local u=$2 - if [[ $u == "user" ]] - then + if [[ $u == "user" ]]; then local st=$($RUNAS $LFS hsm_state $f) else local st=$($LFS hsm_state $f) @@ -366,15 +378,13 @@ check_hsm_flags_user() { copy_file() { local f= - if [[ -d $2 ]] - then + if [[ -d $2 ]]; then f=$2/$(basename $1) else f=$2 fi - if [[ "$3" != 1 ]] - then + if [[ "$3" != 1 ]]; then f=${f/$DIR/$DIR2} fi rm -f $f @@ -390,7 +400,8 @@ make_small() { } cleanup_large_files() { - local ratio=$(df $MOUNT |awk '{print $5}' |sed 's/%//g' |grep -v Use) + local ratio=$(df -P $MOUNT | tail -1 | awk '{print $5}' | + sed 's/%//g') [ $ratio -gt 50 ] && find $MOUNT -size +10M -exec rm -f {} \; } @@ -455,7 +466,7 @@ wait_request_state() { local request=$2 local state=$3 - local cmd="$LCTL get_param -n $HSM_PARAM.agent_actions" + local cmd="$LCTL get_param -n $HSM_PARAM.actions" cmd+=" | awk '/'$fid'.*action='$request'/ {print \\\$13}' | cut -f2 -d=" wait_result $SINGLEMDS "$cmd" $state 100 || @@ -466,7 +477,7 @@ get_request_state() { local fid=$1 local request=$2 - do_facet $SINGLEMDS "$LCTL get_param -n $HSM_PARAM.agent_actions |"\ + do_facet $SINGLEMDS "$LCTL get_param -n $HSM_PARAM.actions |"\ "awk '/'$fid'.*action='$request'/ {print \\\$13}' | cut -f2 -d=" } @@ -474,14 +485,14 @@ get_request_count() { local fid=$1 local request=$2 - do_facet $SINGLEMDS "$LCTL get_param -n $HSM_PARAM.agent_actions |"\ + do_facet $SINGLEMDS "$LCTL get_param -n $HSM_PARAM.actions |"\ "awk -vn=0 '/'$fid'.*action='$request'/ {n++}; END {print n}'" } wait_all_done() { local timeout=$1 - local cmd="$LCTL get_param -n $HSM_PARAM.agent_actions" + local cmd="$LCTL get_param -n $HSM_PARAM.actions" cmd+=" | egrep 'WAITING|STARTED'" wait_result $SINGLEMDS "$cmd" "" $timeout || @@ -512,6 +523,9 @@ cdt_check_state enabled echo "Start copytool" copytool_setup +echo "Set sanity-hsm HSM policy" +cdt_set_sanity_policy + # finished requests are quickly removed from list set_hsm_param grace_delay 10 @@ -719,10 +733,10 @@ test_10a() { error "hsm_archive failed" wait_request_state $fid ARCHIVE SUCCEED - local AFILE=$(ls $HSM_ARCHIVE/*/*/*/*/*/*/$fid) || + local AFILE=$(do_facet $SINGLEAGT ls $HSM_ARCHIVE'/*/*/*/*/*/*/'$fid) || error "fid $fid not in archive $HSM_ARCHIVE" echo "Verifying content" - diff $f $AFILE || error "archived file differs" + do_facet $SINGLEAGT diff $f $AFILE || error "archived file differs" echo "Verifying hsm state " check_hsm_flags $f "0x00000009" @@ -740,7 +754,7 @@ test_10b() { # test needs a running copytool copytool_setup - mkdir -p $DIR/$tdir $HSM_ARCHIVE/$tdir + mkdir -p $DIR/$tdir local f=$DIR/$tdir/$tfile local fid=$(copy_file /etc/hosts $f) $LFS hsm_archive $f || error "archive request failed" @@ -759,7 +773,7 @@ test_10c() { # test needs a running copytool copytool_setup - mkdir -p $DIR/$tdir $HSM_ARCHIVE/$tdir + mkdir -p $DIR/$tdir local f=$DIR/$tdir/$tfile local fid=$(copy_file /etc/hosts $f) $LFS hsm_set --noarchive $f @@ -780,7 +794,7 @@ test_10d() { wait_request_state $fid ARCHIVE SUCCEED local ar=$(get_hsm_archive_id $f) - local dflt=$(get_hsm_param archive_id) + local dflt=$(get_hsm_param default_archive_id) [[ $ar == $dflt ]] || error "archived file is not on default archive: $ar != $dflt" @@ -789,8 +803,8 @@ test_10d() { run_test 10d "Archive a file on the default archive id" test_11() { - mkdir -p $DIR/$tdir $HSM_ARCHIVE/$tdir - cp /etc/hosts $HSM_ARCHIVE/$tdir/$tfile + mkdir -p $DIR/$tdir + copy2archive /etc/hosts $tdir/$tfile local f=$DIR/$tdir/$tfile import_file $tdir/$tfile $f @@ -798,7 +812,7 @@ test_11() { check_hsm_flags $f "0x0000000d" local LSZ=$(stat -c "%s" $f) - local ASZ=$(stat -c "%s" $HSM_ARCHIVE/$tdir/$tfile) + local ASZ=$(do_facet $SINGLEAGT stat -c "%s" $HSM_ARCHIVE/$tdir/$tfile) echo "Verifying imported size $LSZ=$ASZ" [[ $LSZ -eq $ASZ ]] || error "Incorrect size $LSZ != $ASZ" @@ -809,7 +823,7 @@ test_11() { local fid=$(path2fid $f) echo "Verifying new fid $fid in archive" - local AFILE=$(ls $HSM_ARCHIVE/*/*/*/*/*/*/$fid) || + local AFILE=$(do_facet $SINGLEAGT ls $HSM_ARCHIVE'/*/*/*/*/*/*/'$fid) || error "fid $fid not in archive $HSM_ARCHIVE" } run_test 11 "Import a file" @@ -818,8 +832,9 @@ test_12a() { # test needs a running copytool copytool_setup - mkdir -p $DIR/$tdir $HSM_ARCHIVE/$tdir - cp /etc/hosts $HSM_ARCHIVE/$tdir/$tfile + mkdir -p $DIR/$tdir + copy2archive /etc/hosts $tdir/$tfile + local f=$DIR/$tdir/$tfile import_file $tdir/$tfile $f local f=$DIR2/$tdir/$tfile @@ -833,7 +848,7 @@ test_12a() { echo "Verifying file state: " check_hsm_flags $f "0x00000009" - diff -q $HSM_ARCHIVE/$tdir/$tfile $f + do_facet $SINGLEAGT diff -q $HSM_ARCHIVE/$tdir/$tfile $f [[ $? -eq 0 ]] || error "Restored file differs" @@ -845,8 +860,9 @@ test_12b() { # test needs a running copytool copytool_setup - mkdir -p $DIR/$tdir $HSM_ARCHIVE/$tdir - cp /etc/hosts $HSM_ARCHIVE/$tdir/$tfile + mkdir -p $DIR/$tdir + copy2archive /etc/hosts $tdir/$tfile + local f=$DIR/$tdir/$tfile import_file $tdir/$tfile $f echo "Verifying released state: " @@ -857,7 +873,7 @@ test_12b() { echo "Verifying file state after restore: " check_hsm_flags $f "0x00000009" - diff -q $HSM_ARCHIVE/$tdir/$tfile $f + do_facet $SINGLEAGT diff -q $HSM_ARCHIVE/$tdir/$tfile $f [[ $? -eq 0 ]] || error "Restored file differs" @@ -893,7 +909,8 @@ test_12d() { # test needs a running copytool copytool_setup - mkdir -p $DIR/$tdir $HSM_ARCHIVE/$tdir + mkdir -p $DIR/$tdir + local f=$DIR/$tdir/$tfile local fid=$(copy_file /etc/hosts $f) $LFS hsm_restore $f || error "restore of non archived file failed" @@ -1034,12 +1051,14 @@ test_12n() { # test needs a running copytool copytool_setup - mkdir -p $DIR/$tdir $HSM_ARCHIVE/$tdir - cp /etc/hosts $HSM_ARCHIVE/$tdir/$tfile + mkdir -p $DIR/$tdir + copy2archive /etc/hosts $tdir/$tfile + local f=$DIR/$tdir/$tfile import_file $tdir/$tfile $f - cmp /etc/hosts $f || error "Restored file differs" + do_facet $SINGLEAGT cmp /etc/hosts $f || + error "Restored file differs" $LFS hsm_release $f || error "release of $f failed" @@ -1058,24 +1077,23 @@ test_13() { # populate directory to be imported for d in $(seq 1 10); do local CURR_DIR="$HSM_ARCHIVE/$ARC_SUBDIR/dir.$d" - mkdir -p "$CURR_DIR" + do_facet $SINGLEAGT mkdir -p "$CURR_DIR" for f in $(seq 1 10); do CURR_FILE="$CURR_DIR/$tfile.$f" # write file-specific data - echo "d=$d, f=$f, dir=$CURR_DIR, file=$CURR_FILE"\ - > $CURR_FILE + do_facet $SINGLEAGT \ + "echo d=$d, f=$f, dir=$CURR_DIR, "\ + "file=$CURR_FILE > $CURR_FILE" done done # import to Lustre import_file "$ARC_SUBDIR" $DIR/$tdir # diff lustre content and origin (triggers file restoration) # there must be 10x10 identical files, and no difference - local cnt_ok=$(diff -rs $HSM_ARCHIVE/$ARC_SUBDIR \ - $DIR/$tdir/$ARC_SUBDIR | - grep identical | wc -l) - local cnt_diff=$(diff -r $HSM_ARCHIVE/$ARC_SUBDIR \ - $DIR/$tdir/$ARC_SUBDIR | - wc -l) + local cnt_ok=$(do_facet $SINGLEAGT diff -rs $HSM_ARCHIVE/$ARC_SUBDIR \ + $DIR/$tdir/$ARC_SUBDIR | grep identical | wc -l) + local cnt_diff=$(do_facet $SINGLEAGT diff -r $HSM_ARCHIVE/$ARC_SUBDIR \ + $DIR/$tdir/$ARC_SUBDIR | wc -l) [ $cnt_diff -eq 0 ] || error "$cnt_diff imported files differ from read data" @@ -1245,7 +1263,7 @@ test_21() { $LFS hsm_archive $f || error "could not archive file" wait_request_state $fid ARCHIVE SUCCEED - [ $(stat -c "%b" $f) -ne "0" ] || error "wrong block number" + [ $(stat -c "%b" $f) -ne "1" ] || error "wrong block number" local sz=$(stat -c "%s" $f) [ $sz -ne "0" ] || error "file size should not be zero" @@ -1253,7 +1271,7 @@ test_21() { $LFS hsm_release $f || error "could not release file" check_hsm_flags $f "0x0000000d" - [ $(stat -c "%b" $f) -eq "0" ] || error "wrong block number" + [ $(stat -c "%b" $f) -eq "1" ] || error "wrong block number" [ $(stat -c "%s" $f) -eq $sz ] || error "wrong file size" # Check we can release an file without stripe info @@ -1467,8 +1485,8 @@ test_24b() { $LFS hsm_archive $file wait_request_state $fid ARCHIVE SUCCEED - $LFS hsm_release $file || - check_hsm_flags $file "0x0000000d" + $LFS hsm_release $file + check_hsm_flags $file "0x0000000d" $LFS hsm_restore $file wait_request_state $fid RESTORE SUCCEED @@ -1477,8 +1495,8 @@ test_24b() { $RUNAS $LFS hsm_state $file || error "user '$RUNAS_ID' cannot get HSM state of '$file'" - $LFS hsm_release $file || - check_hsm_flags $file "0x0000000d" + $LFS hsm_release $file + check_hsm_flags $file "0x0000000d" # Check that ordinary user can accessed released file. sum1=$($RUNAS md5sum $file) || @@ -1491,12 +1509,141 @@ test_24b() { } run_test 24b "root can archive, release, and restore user files" +cleanup_test_24c() { + trap 0 + set_hsm_param user_request_mask RESTORE + set_hsm_param group_request_mask RESTORE + set_hsm_param other_request_mask RESTORE +} + +test_24c() { + local file=$DIR/$tdir/$tfile + local action=archive + local user_save + local group_save + local other_save + + # test needs a running copytool + copytool_setup + + mkdir -p $DIR/$tdir + + # Save the default masks and check that cleanup_24c will + # restore the request masks correctly. + user_save=$(get_hsm_param user_request_mask) + group_save=$(get_hsm_param group_request_mask) + other_save=$(get_hsm_param other_request_mask) + + [ "$user_save" == RESTORE ] || + error "user_request_mask is '$user_save' expected 'RESTORE'" + [ "$group_save" == RESTORE ] || + error "group_request_mask is '$group_save' expected 'RESTORE'" + [ "$other_save" == RESTORE ] || + error "other_request_mask is '$other_save' expected 'RESTORE'" + + trap cleanup_test_24c EXIT + + # User. + rm -f $file + make_small $file + chown $RUNAS_ID:nobody $file || + error "cannot chown '$file' to '$RUNAS_ID:nobody'" + + set_hsm_param user_request_mask "" + $RUNAS $LFS hsm_$action $file && + error "$action by user should fail" + + set_hsm_param user_request_mask $action + $RUNAS $LFS hsm_$action $file || + error "$action by user should succeed" + + # Group. + rm -f $file + make_small $file + chown nobody:$RUNAS_GID $file || + error "cannot chown '$file' to 'nobody:$RUNAS_GID'" + + set_hsm_param group_request_mask "" + $RUNAS $LFS hsm_$action $file && + error "$action by group should fail" + + set_hsm_param group_request_mask $action + $RUNAS $LFS hsm_$action $file || + error "$action by group should succeed" + + # Other. + rm -f $file + make_small $file + chown nobody:nobody $file || + error "cannot chown '$file' to 'nobody:nobody'" + + set_hsm_param other_request_mask "" + $RUNAS $LFS hsm_$action $file && + error "$action by other should fail" + + set_hsm_param other_request_mask $action + $RUNAS $LFS hsm_$action $file || + error "$action by other should succeed" + + copytool_cleanup + cleanup_test_24c +} +run_test 24c "check that user,group,other request masks work" + +cleanup_test_24d() { + trap 0 + mount -o remount,rw $MOUNT2 +} + +test_24d() { + local file1=$DIR/$tdir/$tfile + local file2=$DIR2/$tdir/$tfile + local fid1 + local fid2 + + copytool_setup + + mkdir -p $DIR/$tdir + rm -f $file1 + fid1=$(make_small $file1) + + trap cleanup_test_24d EXIT + + mount -o remount,ro $MOUNT2 + + fid2=$(path2fid $file2) + [ "$fid1" == "$fid2" ] || + error "FID mismatch '$fid1' != '$fid2'" + + $LFS hsm_archive $file2 && + error "archive should fail on read-only mount" + check_hsm_flags $file1 "0x00000000" + + $LFS hsm_archive $file1 + wait_request_state $fid1 ARCHIVE SUCCEED + + $LFS hsm_release $file1 + $LFS hsm_restore $file2 + wait_request_state $fid1 RESTORE SUCCEED + + $LFS hsm_release $file1 || error "cannot release '$file1'" + dd if=$file2 of=/dev/null bs=1M || "cannot read '$file2'" + + $LFS hsm_release $file2 && + error "release should fail on read-only mount" + + copytool_cleanup + cleanup_test_24d +} +run_test 24d "check that read-only mounts are respected" + test_25a() { # test needs a running copytool copytool_setup - mkdir -p $DIR/$tdir $HSM_ARCHIVE/$tdir - cp /etc/hosts $HSM_ARCHIVE/$tdir/$tfile + mkdir -p $DIR/$tdir + copy2archive /etc/hosts $tdir/$tfile + local f=$DIR/$tdir/$tfile import_file $tdir/$tfile $f @@ -1624,8 +1771,9 @@ test_30a() { # test needs a running copytool copytool_setup - mkdir -p $DIR/$tdir $HSM_ARCHIVE/$tdir - cp -p /bin/true $HSM_ARCHIVE/$tdir/$tfile + mkdir -p $DIR/$tdir + copy2archive /bin/true $tdir/$tfile + local f=$DIR/$tdir/true import_file $tdir/$tfile $f @@ -1679,6 +1827,41 @@ test_30b() { } run_test 30b "Restore at exec (release case)" +test_30c() { + needclients 2 || return 0 + + # test needs a running copytool + copytool_setup + + mkdir -p $DIR/$tdir + local f=$DIR/$tdir/SLEEP + local fid=$(copy_file /bin/sleep $f) + chmod 755 $f + $LFS hsm_archive --archive $HSM_ARCHIVE_NUMBER $f + wait_request_state $fid ARCHIVE SUCCEED + $LFS hsm_release $f + check_hsm_flags $f "0x0000000d" + # set no retry action mode + cdt_set_no_retry + do_node $CLIENT2 "$f 10" & + local pid=$! + sleep 3 + echo 'Hi!' > $f + [[ $? == 0 ]] && error "Update during exec of released file must fail" + wait $pid + [[ $? == 0 ]] || error "Execution failed during run" + cmp /bin/sleep $f + [[ $? == 0 ]] || error "Binary overwritten during exec" + + # cleanup + # remove no try action mode + cdt_clear_no_retry + check_hsm_flags $f "0x00000009" + + copytool_cleanup +} +run_test 30c "Update during exec of released file must fail" + restore_and_check_size() { local f=$1 local fid=$2 @@ -1693,8 +1876,7 @@ restore_and_check_size() { n=$(stat -c "%s" $f) # we echo in both cases to show stat is not # hang - if [[ $n != $s ]] - then + if [[ $n != $s ]]; then echo "size seen is $n != $s" err=1 else @@ -1704,8 +1886,7 @@ restore_and_check_size() { sleep 10 cpt=$((cpt + 1)) done - if [[ $cpt -lt 10 ]] - then + if [[ $cpt -lt 10 ]]; then echo " restore is too long" else echo " "done @@ -2228,8 +2409,7 @@ double_verify_reset_hsm_param() { # restore value set_hsm_param $p $save - if [[ $rc == 0 ]] - then + if [[ $rc == 0 ]]; then error "we must not be able to set $HSM_PARAM.$p to 0" fi } @@ -2237,9 +2417,9 @@ double_verify_reset_hsm_param() { test_100() { double_verify_reset_hsm_param loop_period double_verify_reset_hsm_param grace_delay - double_verify_reset_hsm_param request_timeout + double_verify_reset_hsm_param active_request_timeout double_verify_reset_hsm_param max_requests - double_verify_reset_hsm_param archive_id + double_verify_reset_hsm_param default_archive_id } run_test 100 "Set coordinator /proc tunables" @@ -2267,7 +2447,7 @@ test_103() { echo "Current requests" local res=$(do_facet $SINGLEMDS "$LCTL get_param -n\ - $HSM_PARAM.agent_actions |\ + $HSM_PARAM.actions |\ grep -v CANCELED | grep -v SUCCEED | grep -v FAILED") [[ -z "$res" ]] || error "Some request have not been canceled" @@ -2289,7 +2469,7 @@ test_104() { cdt_disable $LFS hsm_archive --archive $HSM_ARCHIVE_NUMBER --data $DATA $f local data1=$(do_facet $SINGLEMDS "$LCTL get_param -n\ - $HSM_PARAM.agent_actions |\ + $HSM_PARAM.actions |\ grep $fid | cut -f16 -d=") cdt_enable @@ -2310,12 +2490,12 @@ test_105() { $LFS hsm_archive $DIR/$tdir/$i done local reqcnt1=$(do_facet $SINGLEMDS "$LCTL get_param -n\ - $HSM_PARAM.agent_actions |\ + $HSM_PARAM.actions |\ grep WAITING | wc -l") cdt_restart cdt_disable local reqcnt2=$(do_facet $SINGLEMDS "$LCTL get_param -n\ - $HSM_PARAM.agent_actions |\ + $HSM_PARAM.actions |\ grep WAITING | wc -l") cdt_enable cdt_purge @@ -2330,7 +2510,7 @@ test_106() { copytool_setup local uuid=$(do_rpc_nodes $(facet_active_host $SINGLEAGT) \ - get_client_uuid | cut -d' ' -f2) + get_client_uuid $MOUNT | cut -d' ' -f2) local agent=$(do_facet $SINGLEMDS $LCTL get_param -n $HSM_PARAM.agents | grep $uuid) copytool_cleanup @@ -2371,23 +2551,60 @@ test_107() { } run_test 107 "Copytool re-register after MDS restart" +policy_set_and_test() +{ + local change="$1" + local target="$2" + do_facet $SINGLEMDS $LCTL set_param "$HSM_PARAM.policy=\\\"$change\\\"" + local policy=$(do_facet $SINGLEMDS $LCTL get_param -n $HSM_PARAM.policy) + [[ "$policy" == "$target" ]] || + error "Wrong policy after '$change': '$policy' != '$target'" +} + +test_109() { + # to force default policy setting if error + CDT_POLICY_HAD_CHANGED=true + + local policy=$(do_facet $SINGLEMDS $LCTL get_param -n $HSM_PARAM.policy) + local default="NonBlockingRestore [NoRetryAction]" + [[ "$policy" == "$default" ]] || + error "default policy has changed,"\ + " '$policy' != '$default' update the test" + policy_set_and_test "+NBR" "[NonBlockingRestore] [NoRetryAction]" + policy_set_and_test "+NRA" "[NonBlockingRestore] [NoRetryAction]" + policy_set_and_test "-NBR" "NonBlockingRestore [NoRetryAction]" + policy_set_and_test "-NRA" "NonBlockingRestore NoRetryAction" + policy_set_and_test "NRA NBR" "[NonBlockingRestore] [NoRetryAction]" + # useless bacause we know but safer for futur changes to use real value + local policy=$(do_facet $SINGLEMDS $LCTL get_param -n $HSM_PARAM.policy) + echo "Next set_param must failed" + policy_set_and_test "wrong" "$policy" + + # return to default + echo "Back to default policy" + cdt_set_sanity_policy +} +run_test 109 "Policy display/change" + test_110a() { # test needs a running copytool copytool_setup - mkdir -p $DIR/$tdir $HSM_ARCHIVE/$tdir - cp /etc/passwd $HSM_ARCHIVE/$tdir/$tfile + mkdir -p $DIR/$tdir + + copy2archive /etc/passwd $tdir/$tfile + local f=$DIR/$tdir/$tfile import_file $tdir/$tfile $f local fid=$(path2fid $f) - cdt_set_no_blocking_restore + cdt_set_non_blocking_restore md5sum $f local st=$? # cleanup wait_request_state $fid RESTORE SUCCEED - cdt_clear_no_blocking_restore + cdt_clear_non_blocking_restore # Test result [[ $st == 1 ]] || @@ -2409,13 +2626,13 @@ test_110b() { wait_request_state $fid ARCHIVE SUCCEED $LFS hsm_release $f - cdt_set_no_blocking_restore + cdt_set_non_blocking_restore md5sum $f local st=$? # cleanup wait_request_state $fid RESTORE SUCCEED - cdt_clear_no_blocking_restore + cdt_clear_non_blocking_restore # Test result [[ $st == 1 ]] || @@ -2430,9 +2647,11 @@ test_111a() { # test needs a running copytool copytool_setup - mkdir -p $DIR/$tdir $HSM_ARCHIVE/$tdir + mkdir -p $DIR/$tdir + copy2archive /etc/passwd $tdir/$tfile + local f=$DIR/$tdir/$tfile - cp /etc/passwd $HSM_ARCHIVE/$tdir/$tfile + import_file $tdir/$tfile $f local fid=$(path2fid $f) @@ -2623,9 +2842,10 @@ test_222a() { # test needs a running copytool copytool_setup - mkdir -p $DIR/$tdir $HSM_ARCHIVE/$tdir + mkdir -p $DIR/$tdir + copy2archive /etc/passwd $tdir/$tfile + local f=$DIR/$tdir/$tfile - cp /etc/passwd $HSM_ARCHIVE/$tdir/$tfile import_file $tdir/$tfile $f local fid=$(path2fid $f) @@ -2889,6 +3109,41 @@ test_227() { } run_test 227 "changelog when explicit setting of HSM flags" +test_228() { + # test needs a running copytool + copytool_setup + + dd if=/dev/urandom of=$DIR/$tfile bs=1M count=1 conv=sync || + error "creating $DIR/$tfile" + $LFS hsm_archive --archive $HSM_ARCHIVE_NUMBER $DIR/$tfile + wait_request_state $(path2fid $DIR/$tfile) ARCHIVE SUCCEED + + $LFS hsm_release $DIR/$tfile + check_hsm_flags $DIR/$tfile "0x0000000d" + + filefrag $DIR/$tfile | grep " 1 extent found" || + error "filefrag on released file must return only one extent" + + # only newer versions of cp detect sparse files by stat/FIEMAP + # (LU-2580) + cp --sparse=auto $DIR/$tfile $DIR/$tfile.2 || + error "copying $DIR/$tfile" + cmp $DIR/$tfile $DIR/$tfile.2 || error "comparing copied $DIR/$tfile" + + $LFS hsm_release $DIR/$tfile + check_hsm_flags $DIR/$tfile "0x0000000d" + + mkdir $DIR/$tdir + + tar cf - --sparse $DIR/$tfile | tar xvf - -C $DIR/$tdir || + error "tar failed" + cmp $DIR/$tfile $DIR/$tdir/$DIR/$tfile || + error "comparing untarred $DIR/$tfile" + + copytool_cleanup +} +run_test 228 "On released file, return extend to FIEMAP. For [cp,tar] --sparse" + test_250() { # test needs a running copytool copytool_setup @@ -2913,12 +3168,12 @@ test_250() { while [[ $cnt != 0 || $wt != 0 ]]; do sleep 1 cnt=$(do_facet $SINGLEMDS "$LCTL get_param -n\ - $HSM_PARAM.agent_actions |\ + $HSM_PARAM.actions |\ grep STARTED | grep -v CANCEL | wc -l") [[ $cnt -le $maxrequest ]] || error "$cnt > $maxrequest too many started requests" wt=$(do_facet $SINGLEMDS "$LCTL get_param\ - $HSM_PARAM.agent_actions |\ + $HSM_PARAM.actions |\ grep WAITING | wc -l") echo "max=$maxrequest started=$cnt waiting=$wt" done @@ -2937,8 +3192,8 @@ test_251() { cdt_disable # to have a short test - local old_to=$(get_hsm_param request_timeout) - set_hsm_param request_timeout 4 + local old_to=$(get_hsm_param active_request_timeout) + set_hsm_param active_request_timeout 4 # to be sure the cdt will wake up frequently so # it will be able to cancel the "old" request local old_loop=$(get_hsm_param loop_period) @@ -2950,7 +3205,7 @@ test_251() { sleep 5 wait_request_state $fid ARCHIVE CANCELED - set_hsm_param request_timeout $old_to + set_hsm_param active_request_timeout $old_to set_hsm_param loop_period $old_loop copytool_cleanup @@ -2984,6 +3239,43 @@ test_300() { } run_test 300 "On disk coordinator state kept between MDT umount/mount" +test_301() { + local ai=$(get_hsm_param default_archive_id) + local new=$((ai + 1)) + + set_hsm_param default_archive_id $new -P + fail $SINGLEMDS + local res=$(get_hsm_param default_archive_id) + + # clear value + set_hsm_param default_archive_id "" "-P -d" + + [[ $new == $res ]] || error "Value after MDS restart is $res != $new" +} +run_test 301 "HSM tunnable are persistent" + +test_302() { + local ai=$(get_hsm_param default_archive_id) + local new=$((ai + 1)) + + # stop coordinator + cdt_shutdown + + set_hsm_param default_archive_id $new -P + fail $SINGLEMDS + + # check cdt is on + cdt_check_state enabled + + local res=$(get_hsm_param default_archive_id) + + # clear value + set_hsm_param default_archive_id "" "-P -d" + + [[ $new == $res ]] || error "Value after MDS restart is $res != $new" +} +run_test 302 "HSM tunnable are persistent when CDT is off" + copytool_cleanup complete $SECONDS