+test_25a() {
+ # test needs a running copytool
+ copytool_setup
+
+ mkdir -p $DIR/$tdir $HSM_ARCHIVE/$tdir
+ cp /etc/hosts $HSM_ARCHIVE/$tdir/$tfile
+ local f=$DIR/$tdir/$tfile
+
+ import_file $tdir/$tfile $f
+
+ $LFS hsm_set --lost $f
+
+ md5sum $f
+ local st=$?
+
+ [[ $st == 1 ]] || error "lost file access should failed (returns $st)"
+
+ copytool_cleanup
+}
+run_test 25a "Restore lost file (HS_LOST flag) from import"\
+ " (Operation not permitted)"
+
+test_25b() {
+ # test needs a running copytool
+ copytool_setup
+
+ mkdir -p $DIR/$tdir
+
+ local f=$DIR/$tdir/$tfile
+ local fid=$(copy_file /etc/passwd $f)
+
+ $LFS hsm_archive --archive $HSM_ARCHIVE_NUMBER $f
+ wait_request_state $fid ARCHIVE SUCCEED
+
+ $LFS hsm_release $f
+ $LFS hsm_set --lost $f
+ md5sum $f
+ st=$?
+
+ [[ $st == 1 ]] || error "lost file access should failed (returns $st)"
+
+ copytool_cleanup
+}
+run_test 25b "Restore lost file (HS_LOST flag) after release"\
+ " (Operation not permitted)"
+
+test_26() {
+ # test needs a running copytool
+ copytool_setup
+
+ mkdir -p $DIR/$tdir
+ local f=$DIR/$tdir/$tfile
+ local fid=$(make_large_for_progress $f)
+ $LFS hsm_archive --archive $HSM_ARCHIVE_NUMBER $f
+ wait_request_state $fid ARCHIVE SUCCEED
+
+ $LFS hsm_remove $f
+ wait_request_state $fid REMOVE SUCCEED
+
+ check_hsm_flags $f "0x00000000"
+
+ copytool_cleanup
+}
+run_test 26 "Remove the archive of a valid file"
+
+test_27a() {
+ # test needs a running copytool
+ copytool_setup
+
+ mkdir -p $DIR/$tdir
+ make_archive $tdir/$tfile
+ local f=$DIR/$tdir/$tfile
+ import_file $tdir/$tfile $f
+ local fid=$(path2fid $f)
+
+ $LFS hsm_remove $f
+
+ [[ $? != 0 ]] || error "Remove of a released file should fail"
+
+ copytool_cleanup
+}
+run_test 27a "Remove the archive of an imported file (Operation not permitted)"
+
+test_27b() {
+ # test needs a running copytool
+ copytool_setup
+
+ mkdir -p $DIR/$tdir
+ local f=$DIR/$tdir/$tfile
+ local fid=$(make_large_for_progress $f)
+ $LFS hsm_archive --archive $HSM_ARCHIVE_NUMBER $f
+ wait_request_state $fid ARCHIVE SUCCEED
+ $LFS hsm_release $f
+
+ $LFS hsm_remove $f
+
+ [[ $? != 0 ]] || error "Remove of a released file should fail"
+
+ copytool_cleanup
+}
+run_test 27b "Remove the archive of a relased file (Operation not permitted)"
+
+test_28() {
+ # test needs a running copytool
+ copytool_setup
+
+ mkdir -p $DIR/$tdir
+ local f=$DIR/$tdir/$tfile
+ local fid=$(make_large_for_progress $f)
+ $LFS hsm_archive --archive $HSM_ARCHIVE_NUMBER $f
+ wait_request_state $fid ARCHIVE SUCCEED
+
+ cdt_disable
+ $LFS hsm_remove $f
+
+ rm -f $f
+
+ cdt_enable
+
+ wait_request_state $fid REMOVE SUCCEED
+
+ copytool_cleanup
+}
+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
+
+ # test needs a running copytool
+ copytool_setup
+
+ mkdir -p $DIR/$tdir $HSM_ARCHIVE/$tdir
+ cp -p /bin/true $HSM_ARCHIVE/$tdir/$tfile
+ local f=$DIR/$tdir/true
+ import_file $tdir/$tfile $f
+
+ local fid=$(path2fid $f)
+
+ # set no retry action mode
+ cdt_set_no_retry
+ do_node $CLIENT2 $f
+ local st=$?
+
+ # cleanup
+ # remove no try action mode
+ cdt_clear_no_retry
+ $LFS hsm_state $f
+
+ [[ $st == 0 ]] || error "Failed to exec a released file"
+
+ copytool_cleanup
+}
+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
+
+ # test needs a running copytool
+ copytool_setup
+
+ mkdir -p $DIR/$tdir
+ local f=$DIR/$tdir/true
+ local fid=$(copy_file /bin/true $f)
+ chmod 755 $f
+ $LFS hsm_archive --archive $HSM_ARCHIVE_NUMBER $f
+ wait_request_state $fid ARCHIVE SUCCEED
+ $LFS hsm_release $f
+ $LFS hsm_state $f
+ # set no retry action mode
+ cdt_set_no_retry
+ do_node $CLIENT2 $f
+ local st=$?
+
+ # cleanup
+ # remove no try action mode
+ cdt_clear_no_retry
+ $LFS hsm_state $f
+
+ [[ $st == 0 ]] || error "Failed to exec a released file"
+
+ copytool_cleanup
+}
+run_test 30b "Restore at exec (release case)"
+
+restore_and_check_size()
+{
+ local f=$1
+ local fid=$2
+ local s=$(stat -c "%s" $f)
+ local n=$s
+ local st=$(get_hsm_flags $f)
+ local err=0
+ local cpt=0
+ $LFS hsm_restore $f
+ while [[ "$st" != "0x00000009" && $cpt -le 10 ]]
+ do
+ n=$(stat -c "%s" $f)
+ # 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))
+ done
+ if [[ $cpt -lt 10 ]]
+ then
+ echo " restore is too long"
+ else
+ echo " "done
+ fi
+ wait_request_state $fid RESTORE SUCCEED
+ return $err
+}
+
+test_31a() {
+ # test needs a running copytool
+ copytool_setup
+
+ mkdir -p $DIR/$tdir
+
+ make_archive $tdir/$tfile
+ local f=$DIR/$tdir/$tfile
+ import_file $tdir/$tfile $f
+ local fid=$($LFS path2fid $f)
+ HSM_ARCHIVE_PURGE=false copytool_setup
+
+ restore_and_check_size $f $fid
+ local err=$?
+
+ [[ $err -eq 0 ]] || error "File size changed during restore"
+
+ copytool_cleanup
+}
+run_test 31a "Import a large file and check size during restore"
+
+
+test_31b() {
+ # test needs a running copytool
+ copytool_setup
+
+ mkdir -p $DIR/$tdir
+
+ local f=$DIR/$tdir/$tfile
+ local fid=$(make_large_for_progress $f)
+ $LFS hsm_archive --archive $HSM_ARCHIVE_NUMBER $f
+ wait_request_state $fid ARCHIVE SUCCEED
+ $LFS hsm_release $f
+
+ restore_and_check_size $f $fid
+ local err=$?
+
+ [[ $err -eq 0 ]] || error "File size changed during restore"
+
+ copytool_cleanup
+}
+run_test 31b "Restore a large unaligned file and check size during restore"
+
+test_31c() {
+ # test needs a running copytool
+ copytool_setup
+
+ mkdir -p $DIR/$tdir
+
+ local f=$DIR/$tdir/$tfile
+ local fid=$(make_large_for_progress_aligned $f)
+ $LFS hsm_archive --archive $HSM_ARCHIVE_NUMBER $f
+ wait_request_state $fid ARCHIVE SUCCEED
+ $LFS hsm_release $f
+
+ restore_and_check_size $f $fid
+ local err=$?
+
+ [[ $err -eq 0 ]] || error "File size changed during restore"
+
+ copytool_cleanup
+}
+run_test 31c "Restore a large aligned file and check size during restore"
+
+test_33() {
+ # test needs a running copytool
+ copytool_setup
+
+ mkdir -p $DIR/$tdir
+
+ local f=$DIR/$tdir/$tfile
+ local fid=$(make_large_for_progress $f)
+ $LFS hsm_archive --archive $HSM_ARCHIVE_NUMBER $f
+ wait_request_state $fid ARCHIVE SUCCEED
+ $LFS hsm_release $f
+
+ md5sum $f >/dev/null &
+ local pid=$!
+ wait_request_state $fid RESTORE STARTED
+
+ kill -15 $pid
+ sleep 1
+
+ # Check restore trigger process was killed
+ local killed=$(ps -o pid,comm hp $pid >/dev/null)
+
+ $LFS hsm_cancel $f
+
+ wait_request_state $fid RESTORE CANCELED
+ wait_request_state $fid CANCEL SUCCEED
+
+ [ -z $killed ] ||
+ error "Cannot kill process waiting for restore ($killed)"
+
+ copytool_cleanup
+}
+run_test 33 "Kill a restore waiting process"
+
+test_34() {
+ # test needs a running copytool
+ copytool_setup
+
+ mkdir -p $DIR/$tdir
+
+ local f=$DIR/$tdir/$tfile
+ local fid=$(make_large_for_progress $f)
+ $LFS hsm_archive --archive $HSM_ARCHIVE_NUMBER $f
+ wait_request_state $fid ARCHIVE SUCCEED
+ $LFS hsm_release $f
+
+ md5sum $f >/dev/null &
+ local pid=$!
+ wait_request_state $fid RESTORE STARTED
+
+ rm $f || error "rm $f failed"
+ # rm must not block during restore
+ wait_request_state $fid RESTORE STARTED
+
+ wait_request_state $fid RESTORE SUCCEED
+ # check md5sum pgm finished
+ local there=$(ps -o pid,comm hp $pid >/dev/null)
+ [[ -z $there ]] || error "Restore initiator does not exit"
+
+ local rc=$(wait $pid)
+ [[ $rc -eq 0 ]] || error "Restore initiator failed with $rc"
+
+ copytool_cleanup
+}
+run_test 34 "Remove file during restore"
+
+test_35() {
+ # test needs a running copytool
+ copytool_setup
+
+ mkdir -p $DIR/$tdir
+
+ local f=$DIR/$tdir/$tfile
+ local f1=$DIR/$tdir/$tfile-1
+ local fid=$(make_large_for_progress $f)
+ local fid1=$(copy_file /etc/passwd $f1)
+ $LFS hsm_archive --archive $HSM_ARCHIVE_NUMBER $f
+ wait_request_state $fid ARCHIVE SUCCEED
+ $LFS hsm_release $f
+
+ md5sum $f >/dev/null &
+ local pid=$!
+ wait_request_state $fid RESTORE STARTED
+
+ mv $f1 $f || error "mv $f1 $f failed"
+ # mv must not block during restore
+ wait_request_state $fid RESTORE STARTED
+
+ wait_request_state $fid RESTORE SUCCEED
+ # check md5sum pgm finished
+ local there=$(ps -o pid,comm hp $pid >/dev/null)
+ [[ -z $there ]] || error "Restore initiator does not exit"
+
+ local rc=$(wait $pid)
+ [[ $rc -eq 0 ]] || error "Restore initiator failed with $rc"
+
+ fid2=$(path2fid $f)
+ [[ $fid2 == $fid1 ]] || error "Wrong fid after mv $fid2 != $fid1"
+
+ copytool_cleanup
+}
+run_test 35 "Overwrite file during restore"
+
+test_36() {
+ # test needs a running copytool
+ copytool_setup
+
+ mkdir -p $DIR/$tdir
+
+ local f=$DIR/$tdir/$tfile
+ local fid=$(make_large_for_progress $f)
+ $LFS hsm_archive --archive $HSM_ARCHIVE_NUMBER $f
+ wait_request_state $fid ARCHIVE SUCCEED
+ $LFS hsm_release $f
+
+ md5sum $f >/dev/null &
+ local pid=$!
+ wait_request_state $fid RESTORE STARTED
+
+ mv $f $f.new
+ # rm must not block during restore
+ wait_request_state $fid RESTORE STARTED
+
+ wait_request_state $fid RESTORE SUCCEED
+ # check md5sum pgm finished
+ local there=$(ps -o pid,comm hp $pid >/dev/null)
+ [[ -z $there ]] ||
+ error "Restore initiator does not exit"
+
+ local rc=$(wait $pid)
+ [[ $rc -eq 0 ]] ||
+ error "Restore initiator failed with $rc"
+
+ copytool_cleanup
+}
+run_test 36 "Move file during restore"
+
+multi_archive() {
+ local prefix=$1
+ local count=$2
+ local n=""
+
+ for n in $(seq 1 $count); do
+ $LFS hsm_archive --archive $HSM_ARCHIVE_NUMBER $prefix.$n
+ done
+ echo "$count archive requests submitted"
+}
+
+test_40() {
+ local stream_count=4
+ local file_count=100
+ mkdir -p $DIR/$tdir
+ local f=$DIR/$tdir/$tfile
+ local i=""
+ local p=""
+ local fid=""
+
+ for i in $(seq 1 $file_count); do
+ for p in $(seq 1 $stream_count); do
+ fid=$(copy_file /etc/hosts $f.$p.$i)
+ done
+ done
+ copytool_setup
+ # to be sure wait_all_done will not be mislead by previous tests
+ cdt_purge
+ wait_for_grace_delay
+ typeset -a pids
+ # start archive streams in background (archive files in parallel)
+ for p in $(seq 1 $stream_count); do
+ multi_archive $f.$p $file_count &
+ pids[$p]=$!
+ done
+ echo -n "Wait for all requests being enqueued..."
+ wait ${pids[*]}
+ echo OK
+ wait_all_done 100
+ copytool_cleanup
+}
+run_test 40 "Parallel archive requests"
+
+test_52() {
+ # test needs a running copytool
+ copytool_setup
+
+ # Test behave badly if 2 mount points are present
+ umount_client $MOUNT2
+
+ mkdir -p $DIR/$tdir
+ local f=$DIR/$tdir/$tfile
+ local fid=$(copy_file /etc/motd $f 1)
+
+ $LFS hsm_archive $f || error "could not archive file"
+ wait_request_state $fid ARCHIVE SUCCEED
+ check_hsm_flags $f "0x00000009"
+
+ multiop_bg_pause $f O_c || error "multiop failed"
+ local MULTIPID=$!
+
+ mds_evict_client
+ client_up || client_up || true
+
+ kill -USR1 $MULTIPID
+ wait $MULTIPID || error "multiop close failed"
+
+ check_hsm_flags $f "0x0000000b"
+
+ # Restore test environment
+ mount_client $MOUNT2
+
+ copytool_cleanup
+}
+run_test 52 "Opened for write file on an evicted client should be set dirty"
+
+test_53() {
+ # test needs a running copytool
+ copytool_setup
+
+ # Checks are wrong with 2 mount points
+ umount_client $MOUNT2
+
+ mkdir -p $DIR/$tdir
+ local f=$DIR/$tdir/$tfile
+ local fid=$(copy_file /etc/motd $f 1)
+
+ $LFS hsm_archive --archive $HSM_ARCHIVE_NUMBER $f ||
+ error "could not archive file"
+ wait_request_state $fid ARCHIVE SUCCEED
+ check_hsm_flags $f "0x00000009"
+
+ multiop_bg_pause $f o_c || error "multiop failed"
+ MULTIPID=$!
+
+ mds_evict_client
+ client_up || client_up || true
+
+ kill -USR1 $MULTIPID
+ wait $MULTIPID || error "multiop close failed"
+
+ check_hsm_flags $f "0x00000009"
+
+ mount_client $MOUNT2
+
+ copytool_cleanup
+}
+run_test 53 "Opened for read file on an evicted client should not be set dirty"
+
+test_54() {
+ # test needs a running copytool
+ copytool_setup
+
+ mkdir -p $DIR/$tdir
+ local f=$DIR/$tdir/$tfile
+ local fid=$(make_small $f)
+
+ $LFS hsm_archive --archive $HSM_ARCHIVE_NUMBER $f ||
+ error "could not archive file"
+ wait_request_state $fid ARCHIVE STARTED
+
+ check_hsm_flags $f "0x00000001"
+
+ # Avoid coordinator resending this request as soon it has failed.
+ cdt_set_no_retry
+
+ echo "foo" >> $f
+ sync
+ wait_request_state $fid ARCHIVE FAILED
+
+ check_hsm_flags $f "0x00000003"
+
+ cdt_clear_no_retry
+ copytool_cleanup
+}
+run_test 54 "Write during an archive cancels it"
+
+test_55() {
+ # test needs a running copytool
+ copytool_setup
+
+ mkdir -p $DIR/$tdir
+ local f=$DIR/$tdir/$tfile
+ local fid=$(make_small $f)
+
+ $LFS hsm_archive --archive $HSM_ARCHIVE_NUMBER $f ||
+ error "could not archive file"
+ wait_request_state $fid ARCHIVE STARTED
+
+ check_hsm_flags $f "0x00000001"
+
+ # Avoid coordinator resending this request as soon it has failed.
+ cdt_set_no_retry
+
+ $TRUNCATE $f 1024 || error "truncate failed"
+ sync
+ wait_request_state $fid ARCHIVE FAILED
+
+ check_hsm_flags $f "0x00000003"
+
+ cdt_clear_no_retry
+ copytool_cleanup
+}
+run_test 55 "Truncate during an archive cancels it"
+
+test_56() {
+ # test needs a running copytool
+ copytool_setup
+
+ mkdir -p $DIR/$tdir
+ local f=$DIR/$tdir/$tfile
+ local fid=$(make_large_for_progress $f)
+
+ $LFS hsm_archive --archive $HSM_ARCHIVE_NUMBER $f ||
+ error "could not archive file"
+ wait_request_state $fid ARCHIVE STARTED
+
+ check_hsm_flags $f "0x00000001"
+
+ # Change metadata and sync to be sure we are not changing only
+ # in memory.
+ chmod 644 $f
+ chgrp sys $f
+ sync
+ wait_request_state $fid ARCHIVE SUCCEED
+
+ check_hsm_flags $f "0x00000009"
+
+ copytool_cleanup
+}
+run_test 56 "Setattr during an archive is ok"
+
+test_57() {
+ # Need one client for I/O, one for request
+ need2clients || return 0
+
+ # test needs a running copytool
+ copytool_setup
+
+ mkdir -p $DIR/$tdir
+ local f=$DIR/$tdir/test_archive_remote
+ # Create a file on a remote node
+ do_node $CLIENT2 "dd if=/dev/urandom of=$f bs=1M "\
+ "count=2 conv=fsync"
+
+ # And archive it
+ do_node $CLIENT2 "$LFS hsm_archive -a $HSM_ARCHIVE_NUMBER $f" ||
+ error "hsm_archive failed"
+ local fid=$(path2fid $f)
+ wait_request_state $fid ARCHIVE SUCCEED
+
+ # Release and implicit restore it
+ do_node $CLIENT2 "$LFS hsm_release $f" ||
+ error "hsm_release failed"
+ do_node $CLIENT2 "md5sum $f" ||
+ error "hsm_restore failed"
+
+ wait_request_state $fid RESTORE SUCCEED
+
+ copytool_cleanup
+}
+run_test 57 "Archive a file with dirty cache on another node"
+
+test_58() {
+ # test needs a running copytool
+ copytool_setup
+
+ mkdir -p $DIR/$tdir
+ local f=$DIR/$tdir/$tfile
+ local fid=$(make_small $f)
+
+ $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 0 || error "truncate failed"
+ sync
+
+ local sz=$(stat -c %s $f)
+ [[ $sz == 0 ]] || error "size after truncate is $sz != 0"
+
+ $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"
+
+ copytool_cleanup
+}
+run_test 58 "Truncate 0 on a released file must not trigger restore"
+
+test_59() {
+ # 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"
+
+ $LFS hsm_state $f
+
+ check_hsm_flags $f "0x0000000b"
+
+ local state=$(get_request_state $fid RESTORE)
+ [[ "$state" == "SUCCEED" ]] ||
+ error "truncate $sz does not trig a successfull restore,"\
+ " state = $state"
+
+ cmp $ref $f || error "file data wrong after truncate"
+
+ copytool_cleanup
+}
+run_test 59 "Truncate != 0 on a released file"
+
+test_90() {
+ file_count=57
+ mkdir -p $DIR/$tdir
+ local f=$DIR/$tdir/$tfile
+ local FILELIST=/tmp/filelist.txt
+ local i=""
+
+ rm -f $FILELIST
+ for i in $(seq 1 $file_count); do
+ fid=$(copy_file /etc/hosts $f.$i)
+ echo $f.$i >> $FILELIST
+ done
+ copytool_setup
+ # to be sure wait_all_done will not be mislead by previous tests
+ cdt_purge
+ wait_for_grace_delay
+ $LFS hsm_archive --filelist $FILELIST ||
+ error "cannot archive a file list"
+ wait_all_done 100
+ $LFS hsm_release --filelist $FILELIST ||
+ error "cannot release a file list"
+ $LFS hsm_restore --filelist $FILELIST ||
+ error "cannot restore a file list"
+ wait_all_done 100
+ copytool_cleanup
+}
+run_test 90 "Archive/restore a file list"
+
+double_verify_reset_ham_param() {
+ local p=$1
+ echo "Testing $HSM_PARAM.$p"
+ local val=$(get_hsm_param $p)
+ local save=$val
+ local val2=$(($val * 2))
+ set_hsm_param $p $val2
+ val=$(get_hsm_param $p)
+ [[ $val == $val2 ]] ||
+ error "$HSM_PARAM.$p: $val != $val2 should be (2 * $save)"
+ echo "Set $p to 0 must failed"
+ set_hsm_param $p 0
+ local rc=$?
+ # restore value
+ set_hsm_param $p $save
+
+ if [[ $rc == 0 ]]
+ then
+ error "we must not be able to set $HSM_PARAM.$p to 0"
+ fi
+}
+
+test_100() {
+ double_verify_reset_ham_param loop_period
+ double_verify_reset_ham_param grace_delay
+ double_verify_reset_ham_param request_timeout
+ double_verify_reset_ham_param max_requests
+}
+run_test 100 "Set coordinator /proc tunables"
+
+test_102() {
+ cdt_disable
+ cdt_enable
+ cdt_restart
+}
+run_test 102 "Verify coordinator control"
+
+test_103() {
+ # test needs a running copytool
+ copytool_setup
+
+ local i=""
+ local fid=""
+
+ mkdir -p $DIR/$tdir
+ for i in $(seq 1 20); do
+ fid=$(copy_file /etc/passwd $DIR/$tdir/$i)
+ done
+ $LFS hsm_archive --archive $HSM_ARCHIVE_NUMBER $DIR/$tdir/*
+
+ cdt_purge
+
+ echo "Current requests"
+ local res=$(do_facet $SINGLEMDS "$LCTL get_param -n\
+ $HSM_PARAM.agent_actions |\
+ grep -v CANCELED | grep -v SUCCEED | grep -v FAILED")
+
+ [[ -z "$res" ]] || error "Some request have not been canceled"
+
+ copytool_cleanup
+}
+run_test 103 "Purge all requests"
+
+DATA=CEA
+DATAHEX='[434541]'
+test_104() {
+ # test needs a running copytool
+ copytool_setup
+
+ mkdir -p $DIR/$tdir
+ local f=$DIR/$tdir/$tfile
+ local fid=$(make_large_for_progress $f)
+ # if cdt is on, it can serve too quickly the request
+ 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 |\
+ grep $fid | cut -f16 -d=")
+ cdt_enable
+
+ [[ "$data1" == "$DATAHEX" ]] ||
+ error "Data field in records is ($data1) and not ($DATAHEX)"
+
+ copytool_cleanup
+}
+run_test 104 "Copy tool data field"
+
+test_105() {
+ mkdir -p $DIR/$tdir
+ local i=""
+
+ cdt_disable
+ for i in $(seq -w 1 10); do
+ cp /etc/passwd $DIR/$tdir/$i
+ $LFS hsm_archive $DIR/$tdir/$i
+ done
+ local reqcnt1=$(do_facet $SINGLEMDS "$LCTL get_param -n\
+ $HSM_PARAM.agent_actions |\
+ grep WAITING | wc -l")
+ cdt_restart
+ cdt_disable
+ local reqcnt2=$(do_facet $SINGLEMDS "$LCTL get_param -n\
+ $HSM_PARAM.agent_actions |\
+ grep WAITING | wc -l")
+ cdt_enable
+ cdt_purge
+ [[ "$reqcnt1" == "$reqcnt2" ]] ||
+ error "Requests count after shutdown $reqcnt2 != "\
+ "before shutdown $reqcnt1"
+}
+run_test 105 "Restart of coordinator"
+
+test_106() {
+ # Test behave badly if 2 mount points are present
+ umount_client $MOUNT2
+
+ # test needs a running copytool
+ copytool_setup
+
+ local uuid=$(my_uuid)
+ local agent=$(do_facet $SINGLEMDS $LCTL get_param -n $HSM_PARAM.agents |
+ grep $uuid)
+ copytool_cleanup
+ [[ ! -z "$agent" ]] || error "My uuid $uuid not found in agent list"
+ local agent=$(do_facet $SINGLEMDS $LCTL get_param -n $HSM_PARAM.agents |
+ grep $uuid)
+ [[ -z "$agent" ]] ||
+ error "My uuid $uuid still found in agent list,"\
+ " after copytool shutdown"
+ copytool_setup
+ local agent=$(do_facet $SINGLEMDS $LCTL get_param -n $HSM_PARAM.agents |
+ grep $uuid)
+ copytool_cleanup
+ [[ ! -z "$agent" ]] ||
+ error "My uuid $uuid not found in agent list after"\
+ " copytool restart"
+
+ # Restore test environment
+ mount_client $MOUNT2
+}
+run_test 106 "Copytool register/unregister"
+
+test_107() {
+ # test needs a running copytool
+ copytool_setup
+ # create and archive file
+ mkdir -p $DIR/$tdir
+ local f1=$DIR/$tdir/$tfile
+ local fid=$(copy_file /etc/passwd $f1)
+ $LFS hsm_archive --archive $HSM_ARCHIVE_NUMBER $f1
+ wait_request_state $fid ARCHIVE SUCCEED
+ # shutdown and restart MDS
+ fail $SINGLEMDS
+ # check the copytool still gets messages from MDT
+ local f2=$DIR/$tdir/2
+ local fid=$(copy_file /etc/passwd $f2)
+ $LFS hsm_archive --archive $HSM_ARCHIVE_NUMBER $f2
+ # main check of this sanity: this request MUST succeed
+ wait_request_state $fid ARCHIVE SUCCEED
+ copytool_cleanup
+}
+run_test 107 "Copytool re-register after MDS restart"
+
+test_110a() {
+ # test needs a running copytool
+ copytool_setup
+
+ mkdir -p $DIR/$tdir $HSM_ARCHIVE/$tdir
+ cp /etc/passwd $HSM_ARCHIVE/$tdir/$tfile
+ local f=$DIR/$tdir/$tfile
+ import_file $tdir/$tfile $f
+ local fid=$(path2fid $f)
+
+ cdt_set_no_blocking_restore
+ md5sum $f
+ local st=$?
+
+ # cleanup
+ wait_request_state $fid RESTORE SUCCEED
+ cdt_clear_no_blocking_restore
+
+ # Test result
+ [[ $st == 1 ]] ||
+ error "md5sum returns $st != 1, "\
+ "should also perror ENODATA (No data available)"
+
+ copytool_cleanup
+}
+run_test 110a "Non blocking restore policy (import case)"
+
+test_110b() {
+ # test needs a running copytool
+ copytool_setup
+
+ mkdir -p $DIR/$tdir
+ local f=$DIR/$tdir/$tfile
+ local fid=$(copy_file /etc/passwd $f)
+ $LFS hsm_archive --archive $HSM_ARCHIVE_NUMBER $f
+ wait_request_state $fid ARCHIVE SUCCEED
+ $LFS hsm_release $f
+
+ cdt_set_no_blocking_restore
+ md5sum $f
+ local st=$?
+
+ # cleanup
+ wait_request_state $fid RESTORE SUCCEED
+ cdt_clear_no_blocking_restore
+
+ # Test result
+ [[ $st == 1 ]] ||
+ error "md5sum returns $st != 1, "\
+ "should also perror ENODATA (No data available)"
+
+ copytool_cleanup
+}
+run_test 110b "Non blocking restore policy (release case)"
+
+test_111a() {
+ # test needs a running copytool
+ copytool_setup
+
+ mkdir -p $DIR/$tdir $HSM_ARCHIVE/$tdir
+ local f=$DIR/$tdir/$tfile
+ cp /etc/passwd $HSM_ARCHIVE/$tdir/$tfile
+ import_file $tdir/$tfile $f
+ local fid=$(path2fid $f)
+
+ cdt_set_no_retry
+
+ copytool_remove_backend $fid
+
+ $LFS hsm_restore $f
+ wait_request_state $fid RESTORE FAILED
+ local st=$?
+
+ # cleanup
+ cdt_clear_no_retry
+
+ # Test result
+ [[ $st == 0 ]] || error "Restore does not failed"
+
+ copytool_cleanup
+}
+run_test 111a "No retry policy (import case), restore will error"\
+ " (No such file or directory)"
+
+test_111b() {
+ # test needs a running copytool
+ copytool_setup
+
+ mkdir -p $DIR/$tdir
+ local f=$DIR/$tdir/$tfile
+ local fid=$(copy_file /etc/passwd $f)
+ cdt_set_no_retry
+ $LFS hsm_archive --archive $HSM_ARCHIVE_NUMBER $f
+ wait_request_state $fid ARCHIVE SUCCEED
+ $LFS hsm_release $f
+
+ copytool_remove_backend $fid
+
+ $LFS hsm_restore $f
+ wait_request_state $fid RESTORE FAILED
+ local st=$?
+
+ # cleanup
+ cdt_clear_no_retry
+
+ # Test result
+ [[ $st == 0 ]] || error "Restore does not failed"
+
+ copytool_cleanup
+}
+run_test 111b "No retry policy (release case), restore will error"\
+ " (No such file or directory)"
+
+test_112() {
+ # test needs a running copytool
+ copytool_setup
+
+ mkdir -p $DIR/$tdir
+ local f=$DIR/$tdir/$tfile
+ local fid=$(copy_file /etc/passwd $f)
+ cdt_disable
+ $LFS hsm_archive --archive $HSM_ARCHIVE_NUMBER $f
+ local l=$($LFS hsm_action $f)
+ echo $l
+ local res=$(echo $l | cut -f 2- -d" " | grep ARCHIVE)
+
+ # cleanup
+ cdt_enable
+ wait_request_state $fid ARCHIVE SUCCEED
+
+ # Test result
+ [[ ! -z "$res" ]] || error "action is $l which is not an ARCHIVE"
+
+ copytool_cleanup
+}
+run_test 112 "State of recorded request"
+
+test_200() {
+ # test needs a running copytool
+ copytool_setup
+
+ mkdir -p $DIR/$tdir
+ local f=$DIR/$tdir/$tfile
+ local fid=$(make_large_for_cancel $f)
+ # test with cdt on is made in test_221
+ cdt_disable
+ $LFS hsm_archive --archive $HSM_ARCHIVE_NUMBER $f
+ $LFS hsm_cancel $f
+ cdt_enable
+ wait_request_state $fid ARCHIVE CANCELED
+ wait_request_state $fid CANCEL SUCCEED
+
+ copytool_cleanup
+}
+run_test 200 "Register/Cancel archive"
+
+test_201() {
+ # test needs a running copytool
+ copytool_setup
+
+ mkdir -p $DIR/$tdir
+ local f=$DIR/$tdir/$tfile
+ make_archive $tdir/$tfile
+ import_file $tdir/$tfile $f
+ local fid=$(path2fid $f)
+
+ # test with cdt on is made in test_222
+ cdt_disable
+ $LFS hsm_restore $f
+ $LFS hsm_cancel $f
+ cdt_enable
+ wait_request_state $fid RESTORE CANCELED
+ wait_request_state $fid CANCEL SUCCEED
+
+ copytool_cleanup
+}
+run_test 201 "Register/Cancel restore"
+
+test_202() {
+ # test needs a running copytool
+ copytool_setup
+
+ mkdir -p $DIR/$tdir
+ local f=$DIR/$tdir/$tfile
+ local fid=$(make_large_for_progress $f)
+ $LFS hsm_archive --archive $HSM_ARCHIVE_NUMBER $f
+ wait_request_state $fid ARCHIVE SUCCEED
+
+ cdt_disable
+ $LFS hsm_remove $f
+ $LFS hsm_cancel $f
+ cdt_enable
+ wait_request_state $fid REMOVE CANCELED
+
+ copytool_cleanup
+}
+run_test 202 "Register/Cancel remove"
+
+test_220() {
+ # test needs a running copytool
+ copytool_setup
+
+ mkdir -p $DIR/$tdir
+
+ local f=$DIR/$tdir/$tfile
+ local fid=$(copy_file /etc/passwd $f)
+
+ changelog_setup
+
+ $LFS hsm_archive --archive $HSM_ARCHIVE_NUMBER $f
+ wait_request_state $fid ARCHIVE SUCCEED
+
+ local flags=$(changelog_get_flags $MDT0 HSM $fid | tail -1)
+ changelog_cleanup
+
+ local target=0x0
+ [[ $flags == $target ]] || error "Changelog flag is $flags not $target"
+
+ copytool_cleanup
+}
+run_test 220 "Changelog for archive"
+
+test_221() {
+ # test needs a running copytool
+ copytool_setup
+
+ mkdir -p $DIR/$tdir
+
+ local f=$DIR/$tdir/$tfile
+ local fid=$(make_large_for_cancel $f)
+
+ changelog_setup
+
+ $LFS hsm_archive --archive $HSM_ARCHIVE_NUMBER $f
+ wait_request_state $fid ARCHIVE STARTED
+ $LFS hsm_cancel $f
+ wait_request_state $fid ARCHIVE CANCELED
+ wait_request_state $fid CANCEL SUCCEED
+
+ local flags=$(changelog_get_flags $MDT0 HSM $fid | tail -1)
+
+ local target=0x7d
+ [[ $flags == $target ]] || error "Changelog flag is $flags not $target"
+
+ changelog_cleanup
+ copytool_cleanup
+}
+run_test 221 "Changelog for archive canceled"
+
+test_222a() {
+ # test needs a running copytool
+ copytool_setup
+
+ mkdir -p $DIR/$tdir $HSM_ARCHIVE/$tdir
+ local f=$DIR/$tdir/$tfile
+ cp /etc/passwd $HSM_ARCHIVE/$tdir/$tfile
+ import_file $tdir/$tfile $f
+ local fid=$(path2fid $f)
+
+ changelog_setup
+
+ $LFS hsm_restore $f
+ wait_request_state $fid RESTORE SUCCEED
+
+ local flags=$(changelog_get_flags $MDT0 HSM $fid | tail -1)
+
+ local target=0x80
+ [[ $flags == $target ]] || error "Changelog flag is $flags not $target"
+
+ changelog_cleanup
+ copytool_cleanup
+}
+run_test 222a "Changelog for explicit restore"
+
+test_222b() {
+ # test needs a running copytool
+ copytool_setup
+
+ mkdir -p $DIR/$tdir
+ local f=$DIR/$tdir/$tfile
+ local fid=$(copy_file /etc/passwd $f)
+
+ changelog_setup
+ $LFS hsm_archive --archive $HSM_ARCHIVE_NUMBER $f
+ wait_request_state $fid ARCHIVE SUCCEED
+ $LFS hsm_release $f
+
+ md5sum $f
+
+ wait_request_state $fid RESTORE SUCCEED
+
+ local flags=$(changelog_get_flags $MDT0 HSM $fid | tail -1)
+
+ local target=0x80
+ [[ $flags == $target ]] || error "Changelog flag is $flags not $target"
+
+ changelog_cleanup
+ copytool_cleanup
+}
+run_test 222b "Changelog for implicit restore"
+
+test_223a() {
+ # test needs a running copytool
+ copytool_setup
+
+ mkdir -p $DIR/$tdir
+
+ local f=$DIR/$tdir/$tfile
+ make_archive $tdir/$tfile
+
+ changelog_setup
+
+ import_file $tdir/$tfile $f
+ local fid=$(path2fid $f)
+
+ $LFS hsm_restore $f
+ wait_request_state $fid RESTORE STARTED
+ $LFS hsm_cancel $f
+ wait_request_state $fid RESTORE CANCELED
+ wait_request_state $fid CANCEL SUCCEED
+
+ local flags=$(changelog_get_flags $MDT0 HSM $fid | tail -1)
+
+ local target=0xfd
+ [[ $flags == $target ]] ||
+ error "Changelog flag is $flags not $target"
+
+ changelog_cleanup
+ copytool_cleanup
+}
+run_test 223a "Changelog for restore canceled (import case)"
+
+test_223b() {
+ # test needs a running copytool
+ copytool_setup
+
+ mkdir -p $DIR/$tdir
+
+ local f=$DIR/$tdir/$tfile
+ local fid=$(make_large_for_progress $f)
+
+ changelog_setup
+ $LFS hsm_archive --archive $HSM_ARCHIVE_NUMBER $f
+ wait_request_state $fid ARCHIVE SUCCEED
+ $LFS hsm_release $f
+ $LFS hsm_restore $f
+ wait_request_state $fid RESTORE STARTED
+ $LFS hsm_cancel $f
+ wait_request_state $fid RESTORE CANCELED
+ wait_request_state $fid CANCEL SUCCEED
+
+ local flags=$(changelog_get_flags $MDT0 HSM $fid | tail -1)
+
+ local target=0xfd
+ [[ $flags == $target ]] ||
+ error "Changelog flag is $flags not $target"
+
+ changelog_cleanup
+ copytool_cleanup
+}
+run_test 223b "Changelog for restore canceled (release case)"
+
+test_224() {
+ # test needs a running copytool
+ copytool_setup
+
+ mkdir -p $DIR/$tdir
+
+ local f=$DIR/$tdir/$tfile
+ local fid=$(copy_file /etc/passwd $f)
+
+ changelog_setup
+ $LFS hsm_archive --archive $HSM_ARCHIVE_NUMBER $f
+ wait_request_state $fid ARCHIVE SUCCEED
+
+ $LFS hsm_remove $f
+ wait_request_state $fid REMOVE SUCCEED
+
+ local flags=$(changelog_get_flags $MDT0 HSM $fid | tail -1)
+
+ local target=0x200
+ [[ $flags == $target ]] ||
+ error "Changelog flag is $flags not $target"
+
+ changelog_cleanup
+ copytool_cleanup
+}
+run_test 224 "Changelog for remove"
+
+test_225() {
+ # test needs a running copytool
+ copytool_setup
+
+ # test is not usable because remove request is too fast
+ # so it is always finished before cancel can be done ...
+ echo "Test disabled"
+ copytool_cleanup
+ return 0
+
+ mkdir -p $DIR/$tdir
+ local f=$DIR/$tdir/$tfile
+ local fid=$(make_large_for_progress $f)
+
+ changelog_setup
+ $LFS hsm_archive --archive $HSM_ARCHIVE_NUMBER $f
+ wait_request_state $fid ARCHIVE SUCCEED
+
+ # if cdt is on, it can serve too quickly the request
+ cdt_disable
+ $LFS hsm_remove $f
+ $LFS hsm_cancel $f
+ cdt_enable
+ wait_request_state $fid REMOVE CANCELED
+ wait_request_state $fid CANCEL SUCCEED
+
+ flags=$(changelog_get_flags $MDT0 RENME $fid2)
+ local flags=$($LFS changelog $MDT0 | grep HSM | grep $fid | tail -1 |
+ awk '{print $5}')
+
+ local target=0x27d
+ [[ $flags == $target ]] ||
+ error "Changelog flag is $flags not $target"
+
+ changelog_cleanup
+ copytool_cleanup
+}
+run_test 225 "Changelog for remove canceled"
+
+test_226() {
+ # test needs a running copytool
+ copytool_setup
+
+ mkdir -p $DIR/$tdir
+
+ local f1=$DIR/$tdir/$tfile-1
+ local f2=$DIR/$tdir/$tfile-2
+ local f3=$DIR/$tdir/$tfile-3
+ local fid1=$(copy_file /etc/passwd $f1)
+ local fid2=$(copy_file /etc/passwd $f2)
+ copy_file /etc/passwd $f3
+
+ changelog_setup
+ $LFS hsm_archive --archive $HSM_ARCHIVE_NUMBER $f1
+ wait_request_state $fid1 ARCHIVE SUCCEED
+
+ $LFS hsm_archive $f2
+ wait_request_state $fid2 ARCHIVE SUCCEED
+
+ rm $f1 || error "rm $f1 failed"
+
+ local flags=$(changelog_get_flags $MDT0 UNLNK $fid1)
+
+ local target=0x3
+ [[ $flags == $target ]] ||
+ error "Changelog flag is $flags not $target"
+
+ mv $f3 $f2 || error "mv $f3 $f2 failed"
+
+ flags=$(changelog_get_flags $MDT0 RENME $fid2)
+
+ target=0x3
+ [[ $flags == $target ]] ||
+ error "Changelog flag is $flags not $target"
+
+ changelog_cleanup
+ copytool_cleanup
+}
+run_test 226 "changelog for last rm/mv with exiting archive"
+
+check_flags_changes() {
+ local f=$1
+ local fid=$2
+ local hsm_flag=$3
+ local fst=$4
+ local cnt=$5
+
+ local target=0x280
+ $LFS hsm_set --$hsm_flag $f ||
+ error "Cannot set $hsm_flag on $f"
+ local flags=($(changelog_get_flags $MDT0 HSM $fid))
+ local seen=${#flags[*]}
+ cnt=$((fst + cnt))
+ [[ $seen == $cnt ]] ||
+ error "set $hsm_flag: Changelog events $seen != $cnt"
+ [[ ${flags[$((cnt - 1))]} == $target ]] ||
+ error "set $hsm_flag: Changelog flags are "\
+ "${flags[$((cnt - 1))]} not $target"
+
+ $LFS hsm_clear --$hsm_flag $f ||
+ error "Cannot clear $hsm_flag on $f"
+ flags=($(changelog_get_flags $MDT0 HSM $fid))
+ seen=${#flags[*]}
+ cnt=$(($cnt + 1))
+ [[ $cnt == $seen ]] ||
+ error "clear $hsm_flag: Changelog events $seen != $cnt"
+
+ [[ ${flags[$((cnt - 1))]} == $target ]] ||
+ error "clear $hsm_flag: Changelog flag is "\
+ "${flags[$((cnt - 1))]} not $target"
+}
+
+test_227() {
+ # test needs a running copytool
+ copytool_setup
+ changelog_setup
+
+ mkdir -p $DIR/$tdir
+ typeset -a flags
+
+ for i in norelease noarchive exists archived
+ do
+ local f=$DIR/$tdir/$tfile-$i
+ local fid=$(copy_file /etc/passwd $f)
+ check_flags_changes $f $fid $i 0 1
+ done
+
+ f=$DIR/$tdir/$tfile---lost
+ fid=$(copy_file /etc/passwd $f)
+ $LFS hsm_archive --archive $HSM_ARCHIVE_NUMBER $f
+ wait_request_state $fid ARCHIVE SUCCEED
+ check_flags_changes $f $fid lost 3 1
+
+ changelog_cleanup
+ copytool_cleanup
+}
+run_test 227 "changelog when explicit setting of HSM flags"
+
+test_250() {
+ # test needs a running copytool
+ copytool_setup
+
+ mkdir -p $DIR/$tdir
+ local maxrequest=$(get_hsm_param max_requests)
+ local rqcnt=$(($maxrequest * 3))
+ local i=""
+
+ cdt_disable
+ for i in $(seq -w 1 $rqcnt); do
+ rm -f $DIR/$tdir/$i
+ dd if=/dev/urandom of=$DIR/$tdir/$i bs=1M count=10 conv=fsync
+ done
+ # we do it in 2 steps, so all requests arrive at the same time
+ for i in $(seq -w 1 $rqcnt); do
+ $LFS hsm_archive --archive $HSM_ARCHIVE_NUMBER $DIR/$tdir/$i
+ done
+ cdt_enable
+ local cnt=$rqcnt
+ local wt=$rqcnt
+ while [[ $cnt != 0 || $wt != 0 ]]; do
+ sleep 1
+ cnt=$(do_facet $SINGLEMDS "$LCTL get_param -n\
+ $HSM_PARAM.agent_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 |\
+ grep WAITING | wc -l")
+ echo "max=$maxrequest started=$cnt waiting=$wt"
+ done
+
+ copytool_cleanup
+}
+run_test 250 "Coordinator max request"
+
+test_251() {
+ # test needs a running copytool
+ copytool_setup
+
+ mkdir -p $DIR/$tdir
+ local f=$DIR/$tdir/$tfile
+ local fid=$(make_large_for_cancel $f)
+
+ cdt_disable
+ # to have a short test
+ local old_to=$(get_hsm_param request_timeout)
+ set_hsm_param 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)
+ set_hsm_param loop_period 2
+ cdt_enable
+
+ $LFS hsm_archive --archive $HSM_ARCHIVE_NUMBER $f
+ wait_request_state $fid ARCHIVE STARTED
+ sleep 5
+ wait_request_state $fid ARCHIVE CANCELED
+
+ set_hsm_param request_timeout $old_to
+ set_hsm_param loop_period $old_loop
+
+ copytool_cleanup
+}
+run_test 251 "Coordinator request timeout"
+
+test_300() {
+ # the only way to test ondisk conf is to restart MDS ...
+ echo "Stop coordinator and remove coordinator state at mount"
+ # stop coordinator
+ cdt_shutdown
+ # clean on disk conf set by default
+ cdt_clear_mount_state
+ cdt_check_state stopped
+
+ # check cdt still off after umount/remount
+ fail $SINGLEMDS
+ cdt_check_state stopped
+
+ echo "Set coordinator start at mount, and start coordinator"
+ cdt_set_mount_state enabled
+
+ # check cdt is on
+ cdt_check_state enabled
+
+ # check cdt still on after umount/remount
+ fail $SINGLEMDS
+ cdt_check_state enabled
+
+ # we are back to original state (cdt started at mount)
+}
+run_test 300 "On disk coordinator state kept between MDT umount/mount"
+
+copytool_cleanup
+
+complete $SECONDS
+check_and_cleanup_lustre
+exit_status