X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Ftests%2Fsanity-hsm.sh;h=b6be09993be791960ef08b755c21d1b00257454e;hb=13787b1d87b10c693db274c4d2b718e75e88c12f;hp=971a38a0491d71b40b206fe6b6455bc1c03f29b2;hpb=69756f524a1b488f64512c6b20a6d4a94652c208;p=fs%2Flustre-release.git diff --git a/lustre/tests/sanity-hsm.sh b/lustre/tests/sanity-hsm.sh index 971a38a..b6be099 100644 --- a/lustre/tests/sanity-hsm.sh +++ b/lustre/tests/sanity-hsm.sh @@ -15,8 +15,8 @@ ONLY=${ONLY:-"$*"} # 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 58 59" -ALWAYS_EXCEPT="$ALWAYS_EXCEPT 110a 200 201 221 222a 223a 223b 225" +ALWAYS_EXCEPT="$SANITY_HSM_EXCEPT 31a 34 35 36" +ALWAYS_EXCEPT="$ALWAYS_EXCEPT 200 201 221 223a 223b 225" LUSTRE=${LUSTRE:-$(cd $(dirname $0)/..; echo $PWD)} @@ -114,6 +114,7 @@ copytool_device() { cleanup() { copytool_cleanup changelog_cleanup + cdt_set_sanity_policy } search_and_kill_copytool() { @@ -180,7 +181,7 @@ copytool_remove_backend() { local fid=$1 local be=$(find $HSM_ARCHIVE -name $fid) echo "Remove from backend: $fid = $be" - rm -f $be + do_facet $SINGLEAGT rm -f $be } import_file() { @@ -192,11 +193,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 +237,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 +254,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() { @@ -306,9 +320,10 @@ cdt_restart() { cdt_set_sanity_policy } -need2clients() { - if [[ $CLIENTCOUNT -lt 2 ]]; then - skip "Need two or more clients, have $CLIENTCOUNT" +needclients() { + local client_count=$1 + if [[ $CLIENTCOUNT -lt $client_count ]]; then + skip "Need $client_count or more clients, have $CLIENTCOUNT" return 1 fi return 0 @@ -322,8 +337,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) @@ -365,15 +379,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 @@ -511,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 @@ -677,8 +692,7 @@ test_9() { run_test 9 "Use of explict archive number, with dedicated copytool" test_9a() { - [[ $CLIENTCOUNT -ge 3 ]] || - { skip "Need three or more clients"; return 0; } + needclients 3 || return 0 local n local file @@ -700,7 +714,7 @@ test_9a() { $LFS hsm_archive $file || error "could not archive file $file" wait_request_state $fid ARCHIVE SUCCEED - check_hsm_flags $file "0x00000001" + check_hsm_flags $file "0x00000009" done trap - EXIT @@ -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 @@ -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" @@ -985,7 +1002,7 @@ test_12g() { run_test 12g "Restore a released file implicitly" test_12h() { - need2clients || return 0 + needclients 2 || return 0 # test needs a running copytool copytool_setup @@ -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 @@ -1619,13 +1766,14 @@ run_test 28 "Concurrent archive/file remove" test_30a() { # restore at exec cannot work on agent node (because of Linux kernel # protection of executables) - need2clients || return 0 + needclients 2 || return 0 # 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 @@ -1650,7 +1798,7 @@ run_test 30a "Restore at exec (import case)" test_30b() { # restore at exec cannot work on agent node (because of Linux kernel # protection of executables) - need2clients || return 0 + needclients 2 || return 0 # test needs a running copytool copytool_setup @@ -1693,8 +1841,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 +1851,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 @@ -2098,7 +2244,7 @@ run_test 56 "Setattr during an archive is ok" test_57() { # Need one client for I/O, one for request - need2clients || return 0 + needclients 2 || return 0 # test needs a running copytool copytool_setup @@ -2127,13 +2273,15 @@ test_57() { } run_test 57 "Archive a file with dirty cache on another node" -test_58() { - # test needs a running copytool - copytool_setup +truncate_released_file() { + local src_file=$1 + local trunc_to=$2 - mkdir -p $DIR/$tdir + local sz=$(stat -c %s $src_file) local f=$DIR/$tdir/$tfile - local fid=$(make_small $f) + local fid=$(copy_file $1 $f) + local ref=$f-ref + cp $f $f-ref $LFS hsm_archive --archive $HSM_ARCHIVE_NUMBER $f || error "could not archive file" @@ -2141,63 +2289,46 @@ test_58() { $LFS hsm_release $f || error "could not release file" - $TRUNCATE $f 0 || error "truncate failed" + $TRUNCATE $f $trunc_to || error "truncate failed" sync - local sz=$(stat -c %s $f) - [[ $sz == 0 ]] || error "size after truncate is $sz != 0" + local sz1=$(stat -c %s $f) + [[ $sz1 == $trunc_to ]] || + error "size after trunc: $sz1 expect $trunc_to, original $sz" $LFS hsm_state $f - check_hsm_flags $f "0x0000000b" local state=$(get_request_state $fid RESTORE) - [[ "$state" == "" ]] || - error "truncate 0 trigs a restore, state = $state" + [[ "$state" == "SUCCEED" ]] || + error "truncate $sz does not trig restore, state = $state" - copytool_cleanup + $TRUNCATE $ref $trunc_to + cmp $ref $f || error "file data wrong after truncate" + + rm -f $f $f-ref } -run_test 58 "Truncate 0 on a released file must not trigger restore" -test_59() { +test_58() { # test needs a running copytool copytool_setup mkdir -p $DIR/$tdir - local f=$DIR/$tdir/$tfile - local fid=$(copy_file /etc/passwd $f) - local ref=$f-ref - cp $f $ref - local sz=$(stat -c %s $ref) - sz=$((sz / 2)) - $TRUNCATE $ref $sz - - $LFS hsm_archive --archive $HSM_ARCHIVE_NUMBER $f || - error "could not archive file" - wait_request_state $fid ARCHIVE SUCCEED - - $LFS hsm_release $f || error "could not release file" - - $TRUNCATE $f $sz || error "truncate failed" - sync - local sz1=$(stat -c %s $f) - [[ $sz1 == $sz ]] || error "size after truncate is $sz1 != $sz" + local sz=$(stat -c %s /etc/passwd) - $LFS hsm_state $f - - check_hsm_flags $f "0x0000000b" + echo "truncate up from $sz to $((sz*2))" + truncate_released_file /etc/passwd $((sz*2)) - local state=$(get_request_state $fid RESTORE) - [[ "$state" == "SUCCEED" ]] || - error "truncate $sz does not trig a successfull restore,"\ - " state = $state" + echo "truncate down from $sz to $((sz/2))" + truncate_released_file /etc/passwd $((sz/2)) - cmp $ref $f || error "file data wrong after truncate" + echo "truncate to 0" + truncate_released_file /etc/passwd 0 copytool_cleanup } -run_test 59 "Truncate != 0 on a released file" +run_test 58 "Truncate a released file will trigger restore" test_90() { file_count=57 @@ -2243,8 +2374,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 } @@ -2254,7 +2384,7 @@ test_100() { double_verify_reset_hsm_param grace_delay double_verify_reset_hsm_param 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" @@ -2345,7 +2475,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 @@ -2386,23 +2516,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 ]] || @@ -2424,13 +2591,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 ]] || @@ -2445,9 +2612,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) @@ -2638,9 +2807,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) @@ -2904,6 +3074,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 @@ -2999,6 +3204,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