Whamcloud - gitweb
LU-8549 test: optimize restore_and_check_size() in sanity-hsm
[fs/lustre-release.git] / lustre / tests / sanity-hsm.sh
index aba7228..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)}
@@ -752,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
 
@@ -2160,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"
@@ -2424,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)
@@ -2541,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"