Whamcloud - gitweb
LU-8549 test: optimize restore_and_check_size() in sanity-hsm
[fs/lustre-release.git] / lustre / tests / sanity-hsm.sh
index fd2f711..7d0bdf3 100755 (executable)
@@ -11,8 +11,8 @@ SRCDIR=$(dirname $0)
 export PATH=$PWD/$SRCDIR:$SRCDIR:$PWD/$SRCDIR/utils:$PATH:/sbin:/usr/sbin
 
 ONLY=${ONLY:-"$*"}
-# bug number for skipped test:    LU-3815
-ALWAYS_EXCEPT="$SANITY_HSM_EXCEPT 34 35 36"
+# bug number for skipped test:
+ALWAYS_EXCEPT="$SANITY_HSM_EXCEPT"
 # UPDATE THE COMMENT ABOVE WITH BUG NUMBERS WHEN CHANGING ALWAYS_EXCEPT!
 
 LUSTRE=${LUSTRE:-$(cd $(dirname $0)/..; echo $PWD)}
@@ -681,66 +681,19 @@ check_enough_free_space() {
        return 0
 }
 
-make_large_for_striping() {
+make_custom_file_for_progress() {
        local file2=${1/$DIR/$DIR2}
-       local sz=$($LCTL get_param -n lov.*-clilov-*.stripesize | head -n1)
+       local fsize=${2:-"39"}
+       local blksz=$($LCTL get_param -n lov.*-clilov-*.stripesize | head -n1)
+       blksz=${3:-$blksz}
 
-       cleanup_large_files
-
-       check_enough_free_space 5 $sz
-       [ $? != 0 ] && return $?
-
-       dd if=/dev/urandom of=$file2 count=5 bs=$sz conv=fsync ||
-               file_creation_failure dd $file2 $?
-
-       path2fid $1 || error "cannot get fid on $1"
-}
-
-make_large_for_progress() {
-       local file2=${1/$DIR/$DIR2}
-
-       cleanup_large_files
-
-       check_enough_free_space 39 1000000
-       [ $? != 0 ] && return $?
-
-       # big file is large enough, so copy time is > 30s
-       # so copytool make 1 progress
-       # size is not a multiple of 1M to avoid stripe
-       # aligment
-       dd if=/dev/urandom of=$file2 count=39 bs=1000000 conv=fsync ||
-               file_creation_failure dd $file2 $?
-
-       path2fid $1 || error "cannot get fid on $1"
-}
-
-make_large_for_progress_aligned() {
-       local file2=${1/$DIR/$DIR2}
+       [[ $fsize -gt  0 ]] || error "Invalid file size"
+       [[ $blksz -gt 0 ]] || error "Invalid stripe size"
 
        cleanup_large_files
-
-       check_enough_free_space 33 1048576
+       check_enough_free_space $fsize $blksz
        [ $? != 0 ] && return $?
-
-       # big file is large enough, so copy time is > 30s
-       # so copytool make 1 progress
-       # size is a multiple of 1M to have stripe
-       # aligment
-       dd if=/dev/urandom of=$file2 count=33 bs=1M conv=fsync ||
-               file_creation_failure dd $file2 $?
-       path2fid $1 || error "cannot get fid on $1"
-}
-
-make_large_for_cancel() {
-       local file2=${1/$DIR/$DIR2}
-
-       cleanup_large_files
-
-       check_enough_free_space 103 1048576
-       [ $? != 0 ] && return $?
-
-       # Copy timeout is 100s. 105MB => 105s
-       dd if=/dev/urandom of=$file2 count=103 bs=1M conv=fsync ||
+       dd if=/dev/zero of=$file2 count=$fsize bs=$blksz conv=fsync ||
                file_creation_failure dd $file2 $?
        path2fid $1 || error "cannot get fid on $1"
 }
@@ -799,6 +752,11 @@ wait_for_grace_delay() {
        sleep $val
 }
 
+wait_for_loop_period() {
+       local val=$(get_hsm_param loop_period)
+       sleep $val
+}
+
 parse_json_event() {
        local raw_event=$1
 
@@ -1305,7 +1263,7 @@ test_12c() {
        local f=$DIR/$tdir/$tfile
        $LFS setstripe -c 2 $f
        local fid
-       fid=$(make_large_for_striping $f)
+       fid=$(make_custom_file_for_progress $f 5)
        [ $? != 0 ] && skip "not enough free space" && return
 
        local FILE_CRC=$(md5sum $f)
@@ -2207,7 +2165,7 @@ test_24d() {
        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'"
+       dd if=$file2 of=/dev/null bs=1M || error "cannot read '$file2'"
 
        $LFS hsm_release $file2 &&
                error "release should fail on read-only mount"
@@ -2320,7 +2278,7 @@ test_26() {
        mkdir -p $DIR/$tdir
        local f=$DIR/$tdir/$tfile
        local fid
-       fid=$(make_large_for_progress $f)
+       fid=$(make_custom_file_for_progress $f 39 1000000)
        [ $? != 0 ] && skip "not enough free space" && return
 
        $LFS hsm_archive --archive $HSM_ARCHIVE_NUMBER $f
@@ -2360,7 +2318,7 @@ test_27b() {
        mkdir -p $DIR/$tdir
        local f=$DIR/$tdir/$tfile
        local fid
-       fid=$(make_large_for_progress $f)
+       fid=$(make_custom_file_for_progress $f 39 1000000)
        [ $? != 0 ] && skip "not enough free space" && return
 
        $LFS hsm_archive --archive $HSM_ARCHIVE_NUMBER $f
@@ -2382,7 +2340,7 @@ test_28() {
        mkdir -p $DIR/$tdir
        local f=$DIR/$tdir/$tfile
        local fid
-       fid=$(make_large_for_progress $f)
+       fid=$(make_custom_file_for_progress $f 39 1000000)
        [ $? != 0 ] && skip "not enough free space" && return
 
        $LFS hsm_archive --archive $HSM_ARCHIVE_NUMBER $f
@@ -2471,6 +2429,77 @@ test_29c() {
 }
 run_test 29c "Archive/delete/remove by FID, using a file list."
 
+test_29d() {
+       # test needs more than one CT
+       needclients 3 || return 0
+
+       local n
+       local file
+       local fid
+
+       copytool_cleanup $(comma_list $(agts_nodes))
+
+       # start all of the copytools
+       for n in $(seq $AGTCOUNT); do
+               copytool_setup agt$n $MOUNT2 $n
+       done
+
+       trap "copytool_cleanup $(comma_list $(agts_nodes))" EXIT
+       # archive files
+       mkdir -p $DIR/$tdir
+       file=$DIR/$tdir/$tfile
+       fid=$(make_small $file)
+
+       $LFS hsm_archive $file
+       wait_request_state $fid ARCHIVE SUCCEED
+       check_hsm_flags $file "0x00000009"
+
+       rm -f $file
+
+       $LFS hsm_remove -a 0 $fid
+
+       # give time for CDT to handle remove request and create broadcasted
+       sleep 2
+
+       # remove request has been broadcasted ?
+       local cnt=$(get_request_count $fid REMOVE)
+       # broadcasted requests + original
+       [[ $cnt -eq $((AGTCOUNT + 1)) ]] ||
+               error "remove not broadcasted to all CTs"
+
+       # give time for CDT and CTs to handle broadcasted
+       wait_for_loop_period
+
+       # each agent serves one different archive_id, so broadcasted
+       # hsm_remove request should only succeed once and fail at all others
+       local res
+       local scnt=0
+       local fcnt=0
+       for n in $(seq $AGTCOUNT); do
+               res=$(do_facet $SINGLEMDS "$LCTL get_param -n \
+                              $HSM_PARAM.actions | awk \
+                              '/'$fid'.*action=REMOVE archive#='$n'/ \
+                              {print \\\$13}' | cut -f2 -d=")
+               if [[ "$res" == "SUCCEED" ]]; then
+                       scnt=$((scnt + 1))
+               elif [[ "$res" == "FAILED" ]]; then
+                       fcnt=$((fcnt + 1))
+               fi
+       done
+
+       [[ $scnt -ne 1 ]] &&
+               error "one and only CT should have removed successfully"
+
+       [[ $AGTCOUNT -ne $((scnt + fcnt)) ]] &&
+               error "all but one CT should have failed to remove"
+
+       trap - EXIT
+       copytool_cleanup $(comma_list $(agts_nodes))
+
+}
+run_test 29d "hsm_remove by FID with archive_id 0 for unlinked file cause "\
+            "request to be sent once for each registered archive_id"
+
 test_30a() {
        # restore at exec cannot work on agent node (because of Linux kernel
        # protection of executables)
@@ -2588,19 +2617,18 @@ restore_and_check_size() {
        while [[ "$st" != "0x00000009" && $cpt -le 10 ]]
        do
                n=$(stat -c "%s" $f)
-               # we echo in both cases to show stat is not
-               # hang
+               # we echo in both cases to show stat is not hang
                if [[ $n != $s ]]; then
                        echo "size seen is $n != $s"
                        err=1
                else
                        echo "size seen is right: $n == $s"
                fi
-               st=$(get_hsm_flags $f)
                sleep 10
                cpt=$((cpt + 1))
+               st=$(get_hsm_flags $f)
        done
-       if [[ $cpt -lt 10 ]]; then
+       if [[ "$st" = "0x00000009" ]]; then
                echo " "done
        else
                echo " restore is too long"
@@ -2639,7 +2667,7 @@ test_31b() {
 
        local f=$DIR/$tdir/$tfile
        local fid
-       fid=$(make_large_for_progress $f)
+       fid=$(make_custom_file_for_progress $f 39 1000000)
        [ $? != 0 ] && skip "not enough free space" && return
 
        $LFS hsm_archive --archive $HSM_ARCHIVE_NUMBER $f
@@ -2663,7 +2691,7 @@ test_31c() {
 
        local f=$DIR/$tdir/$tfile
        local fid
-       fid=$(make_large_for_progress_aligned $f)
+       fid=$(make_custom_file_for_progress $f 33 1048576)
        [ $? != 0 ] && skip "not enough free space" && return
 
        $LFS hsm_archive --archive $HSM_ARCHIVE_NUMBER $f
@@ -2687,7 +2715,7 @@ test_33() {
 
        local f=$DIR/$tdir/$tfile
        local fid
-       fid=$(make_large_for_progress $f)
+       fid=$(make_custom_file_for_progress $f 39 1000000)
        [ $? != 0 ] && skip "not enough free space" && return
 
        $LFS hsm_archive --archive $HSM_ARCHIVE_NUMBER $f
@@ -2754,7 +2782,7 @@ test_34() {
 
        local f=$DIR/$tdir/$tfile
        local fid
-       fid=$(make_large_for_progress $f)
+       fid=$(make_custom_file_for_progress $f 39 1000000)
        [ $? != 0 ] && skip "not enough free space" && return
 
        $LFS hsm_archive --archive $HSM_ARCHIVE_NUMBER $f
@@ -2790,7 +2818,7 @@ test_35() {
        local f=$DIR/$tdir/$tfile
        local f1=$DIR/$tdir/$tfile-1
        local fid
-       fid=$(make_large_for_progress $f)
+       fid=$(make_custom_file_for_progress $f 39 1000000)
        [ $? != 0 ] && skip "not enough free space" && return
 
        local fid1=$(copy_file /etc/passwd $f1)
@@ -2829,7 +2857,7 @@ test_36() {
 
        local f=$DIR/$tdir/$tfile
        local fid
-       fid=$(make_large_for_progress $f)
+       fid=$(make_custom_file_for_progress $f 39 1000000)
        [ $? != 0 ] && skip "not enough free space" && return
 
        $LFS hsm_archive --archive $HSM_ARCHIVE_NUMBER $f
@@ -2993,7 +3021,7 @@ test_54() {
 
        mkdir -p $DIR/$tdir
        local f=$DIR/$tdir/$tfile
-       local fid=$(make_large_for_progress $f)
+       local fid=$(make_custom_file_for_progress $f 39 1000000)
 
        $LFS hsm_archive --archive $HSM_ARCHIVE_NUMBER $f ||
                error "could not archive file"
@@ -3021,7 +3049,7 @@ test_55() {
 
        mkdir -p $DIR/$tdir
        local f=$DIR/$tdir/$tfile
-       local fid=$(make_large_for_progress $f)
+       local fid=$(make_custom_file_for_progress $f 39 1000000)
 
        $LFS hsm_archive --archive $HSM_ARCHIVE_NUMBER $f ||
                error "could not archive file"
@@ -3050,7 +3078,7 @@ test_56() {
        mkdir -p $DIR/$tdir
        local f=$DIR/$tdir/$tfile
        local fid
-       fid=$(make_large_for_progress $f)
+       fid=$(make_custom_file_for_progress $f 39 1000000)
        [ $? != 0 ] && skip "not enough free space" && return
 
        $LFS hsm_archive --archive $HSM_ARCHIVE_NUMBER $f ||
@@ -3191,7 +3219,7 @@ test_60() {
        mkdir -p $DIR/$tdir
        local f=$DIR/$tdir/$tfile
        local fid
-       fid=$(make_large_for_progress $f)
+       fid=$(make_custom_file_for_progress $f 10)
        [ $? != 0 ] && skip "not enough free space" && return
 
        local mdtidx=0
@@ -3246,6 +3274,10 @@ test_60() {
                error "Expected progress update after at least $interval seconds"
        fi
 
+       echo "Wait for on going archive hsm action to complete"
+       wait_update $agent "grep -o copied $copytool_log" "copied" 10 ||
+               echo "File archiving not completed even after 10 secs"
+
        cdt_clear_no_retry
        copytool_cleanup
 }
@@ -3310,7 +3342,7 @@ test_71() {
        mkdir -p $DIR/$tdir
        local f=$DIR/$tdir/$tfile
        local fid
-       fid=$(make_large_for_progress $f)
+       fid=$(make_custom_file_for_progress $f 39 1000000)
        [ $? != 0 ] && skip "not enough free space" && return
 
        $LFS hsm_archive --archive $HSM_ARCHIVE_NUMBER $f ||
@@ -3588,7 +3620,7 @@ test_104() {
        mkdir -p $DIR/$tdir
        local f=$DIR/$tdir/$tfile
        local fid
-       fid=$(make_large_for_progress $f)
+       fid=$(make_custom_file_for_progress $f 39 1000000)
        [ $? != 0 ] && skip "not enough free space" && return
 
        # if cdt is on, it can serve too quickly the request
@@ -3856,7 +3888,7 @@ test_200() {
        mkdir -p $DIR/$tdir
        local f=$DIR/$tdir/$tfile
        local fid
-       fid=$(make_large_for_cancel $f)
+       fid=$(make_custom_file_for_progress $f 103 1048576)
        [ $? != 0 ] && skip "not enough free space" && return
 
        # test with cdt on is made in test_221
@@ -3904,7 +3936,7 @@ test_202() {
        mkdir -p $DIR/$tdir
        local f=$DIR/$tdir/$tfile
        local fid
-       fid=$(make_large_for_progress $f)
+       fid=$(make_custom_file_for_progress $f 39 1000000)
        [ $? != 0 ] && skip "not enough free space" && return
 
        $LFS hsm_archive --archive $HSM_ARCHIVE_NUMBER $f
@@ -3954,7 +3986,7 @@ test_221() {
 
        local f=$DIR/$tdir/$tfile
        local fid
-       fid=$(make_large_for_cancel $f)
+       fid=$(make_custom_file_for_progress $f 103 1048576)
        [ $? != 0 ] && skip "not enough free space" && return
 
        changelog_setup
@@ -4063,7 +4095,7 @@ test_223b() {
 
        local f=$DIR/$tdir/$tfile
        local fid
-       fid=$(make_large_for_progress $f)
+       fid=$(make_custom_file_for_progress $f 39 1000000)
        [ $? != 0 ] && skip "not enough free space" && return
 
        changelog_setup
@@ -4125,7 +4157,7 @@ test_225() {
        mkdir -p $DIR/$tdir
        local f=$DIR/$tdir/$tfile
        local fid
-       fid=$(make_large_for_progress $f)
+       fid=$(make_custom_file_for_progress $f 39 1000000)
        [ $? != 0 ] && skip "not enough free space" && return
 
        changelog_setup
@@ -4330,7 +4362,7 @@ test_251() {
        mkdir -p $DIR/$tdir
        local f=$DIR/$tdir/$tfile
        local fid
-       fid=$(make_large_for_cancel $f)
+       fid=$(make_custom_file_for_progress $f 103 1048576)
        [ $? != 0 ] && skip "not enough free space" && return
 
        cdt_disable