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"
# 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 24 30a 31a 34 35 36 52 58 59"
-ALWAYS_EXCEPT="$ALWAYS_EXCEPT 110a 200 201 221 222a 223a 223b 225 226"
LUSTRE=${LUSTRE:-$(cd $(dirname $0)/..; echo $PWD)}
MOUNT_2=${MOUNT_2:-"yes"}
FAIL_ON_ERROR=false
-if [ $MDSCOUNT -ge 2 ]; then
+if [[ $MDSCOUNT -ge 2 ]]; then
skip_env "Only run with single MDT for now" && exit
fi
check_and_setup_lustre
-if [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.4.53) ]; then
+if [[ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.4.53) ]]; then
skip_env "Need MDS version at least 2.4.53" && exit
fi
# $RUNAS_ID may get set incorrectly somewhere else
-[ $UID -eq 0 -a $RUNAS_ID -eq 0 ] &&
- error "\$RUNAS_ID set to 0, but \$UID is also 0!"
-
+if [[ $UID -eq 0 && $RUNAS_ID -eq 0 ]]; then
+ skip_env "\$RUNAS_ID set to 0, but \$UID is also 0!" && exit
+fi
check_runas_id $RUNAS_ID $RUNAS_GID $RUNAS
build_test_filter
-# the standard state when starting a test is
-# - no copytool
-# - MOUNT2 done
-# as some test changes the default, we need to re-make it
-cleanup() {
- copytool_cleanup
- if ! is_mounted $MOUNT2
- then
- mount_client $MOUNT2
+#
+# In order to test multiple remote HSM agents, a new facet type named "AGT" and
+# the following associated variables are added:
+#
+# AGTCOUNT: number of agents
+# AGTDEV{N}: target HSM mount point (root path of the backend)
+# agt{N}_HOST: hostname of the agent agt{N}
+# SINGLEAGT: facet of the single agent
+#
+# The number of agents is initialized as the number of remote client nodes.
+# By default, only single copytool is started on a remote client/agent. If there
+# was no remote client, then the copytool will be started on the local client.
+#
+init_agt_vars() {
+ local n
+ local agent
+
+ export AGTCOUNT=${AGTCOUNT:-$((CLIENTCOUNT - 1))}
+ [[ $AGTCOUNT -gt 0 ]] || AGTCOUNT=1
+
+ export SHARED_DIRECTORY=${SHARED_DIRECTORY:-$TMP}
+ if [[ $CLIENTCOUNT -gt 1 ]] &&
+ ! check_shared_dir $SHARED_DIRECTORY $CLIENTS; then
+ skip_env "SHARED_DIRECTORY should be accessible"\
+ "on all client nodes"
+ exit 0
fi
- changelog_cleanup
+
+ for n in $(seq $AGTCOUNT); do
+ eval export AGTDEV$n=\$\{AGTDEV$n:-"$SHARED_DIRECTORY/arc$n"\}
+ agent=CLIENT$((n + 1))
+ if [[ -z "${!agent}" ]]; then
+ [[ $CLIENTCOUNT -eq 1 ]] && agent=CLIENT1 ||
+ agent=CLIENT2
+ fi
+ eval export agt${n}_HOST=\$\{agt${n}_HOST:-${!agent}\}
+ done
+
+ export SINGLEAGT=${SINGLEAGT:-agt1}
+
+ export HSMTOOL=${HSMTOOL:-"lhsmtool_posix"}
+ export HSMTOOL_VERBOSE=${HSMTOOL_VERBOSE:-""}
+ export HSMTOOL_BASE=$(basename "$HSMTOOL" | cut -f1 -d" ")
+ HSM_ARCHIVE=$(copytool_device $SINGLEAGT)
+ HSM_ARCHIVE_NUMBER=2
+
+ MDT_PARAM="mdt.$FSNAME-MDT0000"
+ HSM_PARAM="$MDT_PARAM.hsm"
+
+ # archive is purged at copytool setup
+ HSM_ARCHIVE_PURGE=true
}
-export HSMTOOL=${HSMTOOL:-"lhsmtool_posix"}
-export HSMTOOL_VERBOSE=${HSMTOOL_VERBOSE:-""}
-export HSMTOOL_BASE=$(basename "$HSMTOOL" | cut -f1 -d" ")
-HSM_ARCHIVE=${HSM_ARCHIVE:-$TMP/arc}
-HSM_ARCHIVE_NUMBER=2
+# Get the backend root path for the given agent facet.
+copytool_device() {
+ local facet=$1
+ local dev=AGTDEV$(facet_number $facet)
-MDT_PARAM="mdt.$FSNAME-MDT0000"
-HSM_PARAM="$MDT_PARAM.hsm"
+ echo -n ${!dev}
+}
-# archive is purged at copytool setup
-HSM_ARCHIVE_PURGE=true
+# Stop copytool and unregister an existing changelog user.
+cleanup() {
+ copytool_cleanup
+ changelog_cleanup
+ cdt_set_sanity_policy
+}
search_and_kill_copytool() {
- echo "Killing existing copy tools"
- killall -q $HSMTOOL_BASE || true
+ local agents=${1:-$(facet_active_host $SINGLEAGT)}
+
+ echo "Killing existing copytools on $agents"
+ do_nodesv $agents "killall -q $HSMTOOL_BASE" || true
}
copytool_setup() {
- if pkill -CONT -x $HSMTOOL_BASE; then
- echo "Wakeup copytool"
- return
+ local facet=${1:-$SINGLEAGT}
+ local lustre_mntpnt=${2:-$MOUNT}
+ local arc_id=$3
+ local hsm_root=$(copytool_device $facet)
+ local agent=$(facet_active_host $facet)
+
+ if [[ -z "$arc_id" ]] &&
+ do_facet $facet "pkill -CONT -x $HSMTOOL_BASE"; then
+ echo "Wakeup copytool $facet on $agent"
+ return 0
fi
if $HSM_ARCHIVE_PURGE; then
- echo "Purging archive"
- rm -rf $HSM_ARCHIVE/*
+ echo "Purging archive on $agent"
+ do_facet $facet "rm -rf $hsm_root/*"
fi
- echo "Starting copytool"
- mkdir -p $HSM_ARCHIVE
+ echo "Starting copytool $facet on $agent"
+ do_facet $facet "mkdir -p $hsm_root" || error "mkdir '$hsm_root' failed"
# bandwidth is limited to 1MB/s so the copy time is known and
# independent of hardware
- local CMD="$HSMTOOL $HSMTOOL_VERBOSE --hsm-root $HSM_ARCHIVE"
- CMD=$CMD" --daemon --bandwidth 1 $MOUNT"
- [[ -z "$1" ]] || CMD+=" --archive $1"
-
- echo "$CMD"
- $CMD &
+ local cmd="$HSMTOOL $HSMTOOL_VERBOSE --daemon --hsm-root $hsm_root"
+ [[ -z "$arc_id" ]] || cmd+=" --archive $arc_id"
+ cmd+=" --bandwidth 1 $lustre_mntpnt"
+
+ # Redirect the standard output and error to a log file which
+ # can be uploaded to Maloo.
+ local prefix=$TESTLOG_PREFIX
+ [[ -z "$TESTNAME" ]] || prefix=$prefix.$TESTNAME
+ local copytool_log=$prefix.copytool${arc_id}_log.$agent.log
+
+ do_facet $facet "$cmd < /dev/null > $copytool_log 2>&1" ||
+ error "start copytool $facet on $agent failed"
trap cleanup EXIT
}
copytool_cleanup() {
trap - EXIT
- pkill -INT -x $HSMTOOL_BASE || return 0
+ local agents=${1:-$(facet_active_host $SINGLEAGT)}
+
+ do_nodesv $agents "pkill -INT -x $HSMTOOL_BASE" || return 0
sleep 1
- echo "Copytool is stopped"
+ echo "Copytool is stopped on $agents"
}
copytool_suspend() {
- pkill -STOP -x $HSMTOOL_BASE || return 0
- echo "Copytool is suspended"
+ local agents=${1:-$(facet_active_host $SINGLEAGT)}
+
+ do_nodesv $agents "pkill -STOP -x $HSMTOOL_BASE" || return 0
+ echo "Copytool is suspended on $agents"
}
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() {
- $HSMTOOL --archive $HSM_ARCHIVE_NUMBER --hsm-root $HSM_ARCHIVE \
- --import $1 $2 $MOUNT || error "import of $1 to $2 failed"
+ do_facet $SINGLEAGT \
+ "$HSMTOOL --archive $HSM_ARCHIVE_NUMBER --hsm-root $HSM_ARCHIVE\
+ --import $1 $2 $MOUNT" ||
+ error "import of $1 to $2 failed"
}
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)
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 $?
}
}
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() {
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
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)
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
path2fid $1 || error "cannot get fid on $1"
}
+cleanup_large_files() {
+ local ratio=$(df $MOUNT |awk '{print $5}' |sed 's/%//g' |grep -v Use)
+ [ $ratio -gt 50 ] && find $MOUNT -size +10M -exec rm -f {} \;
+}
+
make_large_for_striping() {
local file2=${1/$DIR/$DIR2}
local sz=$($LCTL get_param -n lov.*-clilov-*.stripesize | head -1)
+
+ cleanup_large_files
+
dd if=/dev/urandom of=$file2 count=5 bs=$sz conv=fsync ||
error "cannot create $file2"
path2fid $1 || error "cannot get fid on $1"
make_large_for_progress() {
local file2=${1/$DIR/$DIR2}
+
+ cleanup_large_files
+
# 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
make_large_for_progress_aligned() {
local file2=${1/$DIR/$DIR2}
+
+ cleanup_large_files
+
# big file is large enough, so copy time is > 30s
# so copytool make 1 progress
# size is a multiple of 1M to have stripe
make_large_for_cancel() {
local file2=${1/$DIR/$DIR2}
+
+ cleanup_large_files
+
# Copy timeout is 100s. 105MB => 105s
dd if=/dev/urandom of=$file2 count=103 bs=1M conv=fsync ||
error "cannot create $file2"
wait_update --verbose $(facet_active_host $facet) "$@"
}
-wait_request_state()
-{
+wait_request_state() {
local fid=$1
local request=$2
local state=$3
- wait_result $SINGLEMDS "$LCTL get_param -n $HSM_PARAM.agent_actions |\
- grep $fid | grep action=$request |\
- cut -f 13 -d ' ' | cut -f 2 -d =" $state 100 ||
+
+ 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 ||
error "request on $fid is not $state"
}
-get_request_state()
-{
+get_request_state() {
local fid=$1
local request=$2
- do_facet $SINGLEMDS "$LCTL get_param -n $HSM_PARAM.agent_actions |\
- grep $fid | grep action=$request |\
- cut -f 13 -d ' ' | cut -f 2 -d ="
+
+ do_facet $SINGLEMDS "$LCTL get_param -n $HSM_PARAM.actions |"\
+ "awk '/'$fid'.*action='$request'/ {print \\\$13}' | cut -f2 -d="
}
-get_request_count()
-{
+get_request_count() {
local fid=$1
local request=$2
- do_facet $SINGLEMDS "$LCTL get_param -n $HSM_PARAM.agent_actions |\
- grep $fid | grep action=$request | wc -l"
+
+ do_facet $SINGLEMDS "$LCTL get_param -n $HSM_PARAM.actions |"\
+ "awk -vn=0 '/'$fid'.*action='$request'/ {n++}; END {print n}'"
}
-wait_all_done()
-{
+wait_all_done() {
local timeout=$1
- wait_result $SINGLEMDS "$LCTL get_param -n $HSM_PARAM.agent_actions |\
- egrep 'WAITING|STARTED' " "" $timeout ||
- error "requests did not complete"
+
+ local cmd="$LCTL get_param -n $HSM_PARAM.actions"
+ cmd+=" | egrep 'WAITING|STARTED'"
+
+ wait_result $SINGLEMDS "$cmd" "" $timeout ||
+ error "requests did not complete"
}
-wait_for_grace_delay()
-{
+wait_for_grace_delay() {
local val=$(get_hsm_param grace_delay)
sleep $val
}
-my_uuid() {
- $LCTL get_param -n llite.$FSNAME-*.uuid
-}
-
MDT0=$($LCTL get_param -n mdc.*.mds_server_uuid |
awk '{gsub(/_UUID/,""); print $1}' | head -1)
+# initiate variables
+init_agt_vars
+
# cleanup from previous bad setup
search_and_kill_copytool
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
local f=$DIR/$tdir/$tfile
local fid=$(copy_file /etc/passwd $f)
# we do not use the default one to be sure
- local new_an=$((HSM_ARCHIVE_NUMBER+ 1))
+ local new_an=$((HSM_ARCHIVE_NUMBER + 1))
copytool_cleanup
- copytool_setup $new_an
+ copytool_setup $SINGLEAGT $MOUNT $new_an
$LFS hsm_archive --archive $new_an $f
wait_request_state $fid ARCHIVE SUCCEED
}
run_test 9 "Use of explict archive number, with dedicated copytool"
+test_9a() {
+ 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
+ done
+
+ trap "copytool_cleanup $(comma_list $(agts_nodes))" EXIT
+ # archive files
+ mkdir -p $DIR/$tdir
+ for n in $(seq $AGTCOUNT); do
+ file=$DIR/$tdir/$tfile.$n
+ fid=$(make_small $file)
+
+ $LFS hsm_archive $file || error "could not archive file $file"
+ wait_request_state $fid ARCHIVE SUCCEED
+ check_hsm_flags $file "0x00000009"
+ done
+
+ trap - EXIT
+ copytool_cleanup $(comma_list $(agts_nodes))
+}
+run_test 9a "Multiple remote agents"
+
test_10a() {
# test needs a running copytool
copytool_setup
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"
# 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"
# 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
}
run_test 10c "Check forbidden archive"
+test_10d() {
+ # test needs a running copytool
+ copytool_setup
+
+ mkdir -p $DIR/$tdir
+ local f=$DIR/$tdir/$tfile
+ local fid=$(copy_file /etc/hosts $f)
+ $LFS hsm_archive $f || error "cannot archive $f"
+ wait_request_state $fid ARCHIVE SUCCEED
+
+ local ar=$(get_hsm_archive_id $f)
+ local dflt=$(get_hsm_param default_archive_id)
+ [[ $ar == $dflt ]] ||
+ error "archived file is not on default archive: $ar != $dflt"
+
+ copytool_cleanup
+}
+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
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"
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"
# 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
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"
# 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: "
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"
# 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"
run_test 12g "Restore a released file implicitly"
test_12h() {
- need2clients || return 0
+ needclients 2 || return 0
# test needs a running copytool
copytool_setup
# 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"
# 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"
# rebind the archive to the newly created file
echo "rebind $fid to $fid2"
- $HSMTOOL --archive $HSM_ARCHIVE_NUMBER --hsm-root="$HSM_ARCHIVE"\
- --rebind $fid $fid2 $DIR ||
- error "could not rebind file"
+
+ do_facet $SINGLEAGT \
+ "$HSMTOOL --archive $HSM_ARCHIVE_NUMBER --hsm-root $HSM_ARCHIVE\
+ --rebind $fid $fid2 $DIR" || error "could not rebind file"
# restore file and compare md5sum
local sum2=$(md5sum $f | awk '{print $1}')
mkdir -p $DIR/$tdir
local f=$DIR/$tdir/$tfile
local count=5
- local tmpfile=$TMP/tmp.$$
+ local tmpfile=$SHARED_DIRECTORY/tmp.$$
local fids=()
local sums=()
[[ $nl == $count ]] || error "$nl files in list, $count expected"
echo "rebind list of files"
- $HSMTOOL --archive $HSM_ARCHIVE_NUMBER --hsm-root="$HSM_ARCHIVE"\
- --rebind $tmpfile $DIR ||
- error "could not rebind file list"
+ do_facet $SINGLEAGT \
+ "$HSMTOOL --archive $HSM_ARCHIVE_NUMBER --hsm-root $HSM_ARCHIVE\
+ --rebind $tmpfile $DIR" || error "could not rebind file list"
# restore files and compare md5sum
for i in $(seq 1 $count); do
$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"
$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
}
run_test 23 "Release does not change a/mtime (utime)"
-test_24() {
+test_24a() {
+ local file=$DIR/$tdir/$tfile
+ local fid
+ local atime0
+ local atime1
+ local mtime0
+ local mtime1
+ local ctime0
+ local ctime1
+
# test needs a running copytool
copytool_setup
mkdir -p $DIR/$tdir
-
- local f=$DIR/$tdir/test_mtime
+ rm -f $file
+ fid=$(make_small $file)
# Create a file and check its states
- local fid=$(make_small $f)
- check_hsm_flags $f "0x00000000"
+ check_hsm_flags $file "0x00000000"
- # make mtime is different
+ # Ensure atime is less than mtime and ctime.
sleep 1
- echo "append" >> $f
- local MTIME=$(stat -c "%Y" $f)
- local ATIME=$(stat -c "%X" $f)
+ echo >> $file
- $LFS hsm_archive $f || error "could not archive file"
+ atime0=$(stat -c "%X" $file)
+ mtime0=$(stat -c "%Y" $file)
+ ctime0=$(stat -c "%Z" $file)
+
+ [ $atime0 -lt $mtime0 ] ||
+ error "atime $atime0 is not less than mtime $mtime0"
+
+ [ $atime0 -lt $ctime0 ] ||
+ error "atime $atime0 is not less than ctime $ctime0"
+
+ # Archive should not change any timestamps.
+ $LFS hsm_archive $file || error "cannot archive '$file'"
wait_request_state $fid ARCHIVE SUCCEED
- # Release and check states
- $LFS hsm_release $f || error "could not release file"
- check_hsm_flags $f "0x0000000d"
+ atime1=$(stat -c "%X" $file)
+ mtime1=$(stat -c "%Y" $file)
+ ctime1=$(stat -c "%Z" $file)
+
+ [ $atime0 -eq $atime1 ] ||
+ error "archive changed atime from $atime0 to $atime1"
+
+ [ $mtime0 -eq $mtime1 ] ||
+ error "archive changed mtime from $mtime0 to $mtime1"
+
+ [ $ctime0 -eq $ctime1 ] ||
+ error "archive changed ctime from $ctime0 to $ctime1"
+
+ # Release should not change any timestamps.
+ $LFS hsm_release $file || error "cannot release '$file'"
+ check_hsm_flags $file "0x0000000d"
+
+ atime1=$(stat -c "%X" $file)
+ mtime1=$(stat -c "%Y" $file)
+ ctime1=$(stat -c "%Z" $file)
+
+ [ $atime0 -eq $atime1 ] ||
+ error "release changed atime from $atime0 to $atime1"
+
+ [ $mtime0 -eq $mtime1 ] ||
+ error "release changed mtime from $mtime0 to $mtime1"
+
+ [ $ctime0 -eq $ctime1 ] ||
+ error "release changed ctime from $ctime0 to $ctime1"
+
+ # Restore should not change atime or mtime and should not
+ # decrease ctime.
+ $LFS hsm_restore $file
+ wait_request_state $fid RESTORE SUCCEED
+
+ atime1=$(stat -c "%X" $file)
+ mtime1=$(stat -c "%Y" $file)
+ ctime1=$(stat -c "%Z" $file)
+
+ [ $atime0 -eq $atime1 ] ||
+ error "restore changed atime from $atime0 to $atime1"
+
+ [ $mtime0 -eq $mtime1 ] ||
+ error "restore changed mtime from $mtime0 to $mtime1"
+
+ [ $ctime0 -le $ctime1 ] ||
+ error "restore changed ctime from $ctime0 to $ctime1"
+
+ copytool_cleanup
+
+ # Once more, after unmount and mount.
+ umount_client $MOUNT || error "cannot unmount '$MOUNT'"
+ mount_client $MOUNT || error "cannot mount '$MOUNT'"
+
+ atime1=$(stat -c "%X" $file)
+ mtime1=$(stat -c "%Y" $file)
+ ctime1=$(stat -c "%Z" $file)
+
+ [ $atime0 -eq $atime1 ] ||
+ error "remount changed atime from $atime0 to $atime1"
+
+ [ $mtime0 -eq $mtime1 ] ||
+ error "remount changed mtime from $mtime0 to $mtime1"
+
+ [ $ctime0 -le $ctime1 ] ||
+ error "remount changed ctime from $ctime0 to $ctime1"
+}
+run_test 24a "Archive, release, and restore does not change a/mtime (i/o)"
+
+test_24b() {
+ local file=$DIR/$tdir/$tfile
+ local fid
+ local sum0
+ local sum1
+ # LU-3811
+
+ # Test needs a running copytool.
+ copytool_setup
+ mkdir -p $DIR/$tdir
+
+ # Check that root can do HSM actions on a ordinary user's file.
+ rm -f $file
+ fid=$(make_small $file)
+ sum0=$(md5sum $file)
+
+ chown $RUNAS_ID:$RUNAS_GID $file ||
+ error "cannot chown '$file' to '$RUNAS_ID'"
+
+ chmod ugo-w $DIR/$tdir ||
+ error "cannot chmod '$DIR/$tdir'"
+
+ $LFS hsm_archive $file
+ wait_request_state $fid ARCHIVE SUCCEED
+
+ $LFS hsm_release $file
+ check_hsm_flags $file "0x0000000d"
+
+ $LFS hsm_restore $file
+ wait_request_state $fid RESTORE SUCCEED
+
+ # Check that ordinary user can get HSM state.
+ $RUNAS $LFS hsm_state $file ||
+ error "user '$RUNAS_ID' cannot get HSM state of '$file'"
+
+ $LFS hsm_release $file
+ check_hsm_flags $file "0x0000000d"
+
+ # Check that ordinary user can accessed released file.
+ sum1=$($RUNAS md5sum $file) ||
+ error "user '$RUNAS_ID' cannot read '$file'"
+
+ [ "$sum0" == "$sum1" ] ||
+ error "md5sum mismatch for '$file'"
+
+ copytool_cleanup
+}
+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
- [ "$(stat -c "%Y" $f)" -eq "$MTIME" ] ||
- error "mtime should be $MTIME"
+ 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'"
- [ "$(stat -c "%X" $f)" -eq "$ATIME" ] ||
- error "atime should be $ATIME"
+ $LFS hsm_release $file2 &&
+ error "release should fail on read-only mount"
copytool_cleanup
+ cleanup_test_24d
}
-run_test 24 "Release does not change a/mtime (i/o)"
+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
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
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
}
run_test 30b "Restore at exec (release case)"
-restore_and_check_size()
-{
+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
local s=$(stat -c "%s" $f)
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
sleep 10
cpt=$((cpt + 1))
done
- if [[ $cpt -lt 10 ]]
- then
+ if [[ $cpt -lt 10 ]]; then
echo " restore is too long"
else
echo " "done
# 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)
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 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)
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_57() {
# Need one client for I/O, one for request
- need2clients || return 0
+ needclients 2 || return 0
# test needs a running copytool
copytool_setup
}
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"
$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
+ local sz=$(stat -c %s /etc/passwd)
- $LFS hsm_release $f || error "could not release file"
+ echo "truncate up from $sz to $((sz*2))"
+ truncate_released_file /etc/passwd $((sz*2))
- $TRUNCATE $f $sz || error "truncate failed"
- sync
+ echo "truncate down from $sz to $((sz/2))"
+ truncate_released_file /etc/passwd $((sz/2))
- 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"
+ 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
}
run_test 90 "Archive/restore a file list"
-double_verify_reset_ham_param() {
+double_verify_reset_hsm_param() {
local p=$1
echo "Testing $HSM_PARAM.$p"
local val=$(get_hsm_param $p)
# 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
}
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
+ double_verify_reset_hsm_param loop_period
+ double_verify_reset_hsm_param grace_delay
+ double_verify_reset_hsm_param active_request_timeout
+ double_verify_reset_hsm_param max_requests
+ double_verify_reset_hsm_param default_archive_id
}
run_test 100 "Set coordinator /proc tunables"
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"
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
$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
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 uuid=$(do_rpc_nodes $(facet_active_host $SINGLEAGT) \
+ get_client_uuid $MOUNT | cut -d' ' -f2)
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"
}
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 ]] ||
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 ]] ||
# 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)
local target=0x7d
[[ $flags == $target ]] || error "Changelog flag is $flags not $target"
- changelog_cleanup
- copytool_cleanup
+ cleanup
}
run_test 221 "Changelog for archive canceled"
# 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)
local target=0x80
[[ $flags == $target ]] || error "Changelog flag is $flags not $target"
- changelog_cleanup
- copytool_cleanup
+ cleanup
}
run_test 222a "Changelog for explicit restore"
local target=0x80
[[ $flags == $target ]] || error "Changelog flag is $flags not $target"
- changelog_cleanup
- copytool_cleanup
+ cleanup
}
run_test 222b "Changelog for implicit restore"
[[ $flags == $target ]] ||
error "Changelog flag is $flags not $target"
- changelog_cleanup
- copytool_cleanup
+ cleanup
}
run_test 223a "Changelog for restore canceled (import case)"
[[ $flags == $target ]] ||
error "Changelog flag is $flags not $target"
- changelog_cleanup
- copytool_cleanup
+ cleanup
}
run_test 223b "Changelog for restore canceled (release case)"
[[ $flags == $target ]] ||
error "Changelog flag is $flags not $target"
- changelog_cleanup
- copytool_cleanup
+ cleanup
}
run_test 224 "Changelog for remove"
[[ $flags == $target ]] ||
error "Changelog flag is $flags not $target"
- changelog_cleanup
- copytool_cleanup
+ cleanup
}
run_test 225 "Changelog for remove canceled"
[[ $flags == $target ]] ||
error "Changelog flag is $flags not $target"
- changelog_cleanup
- copytool_cleanup
+ cleanup
}
run_test 226 "changelog for last rm/mv with exiting archive"
wait_request_state $fid ARCHIVE SUCCEED
check_flags_changes $f $fid lost 3 1
- changelog_cleanup
- copytool_cleanup
+ cleanup
}
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
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
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)
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
}
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