X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;ds=sidebyside;f=lustre%2Ftests%2Fsanity-hsm.sh;h=0d43e33b53bad60642f49474dbec24222624c619;hb=26cc6c4228ae19a8dd522042060852f50bbb621a;hp=971a38a0491d71b40b206fe6b6455bc1c03f29b2;hpb=69756f524a1b488f64512c6b20a6d4a94652c208;p=fs%2Flustre-release.git diff --git a/lustre/tests/sanity-hsm.sh b/lustre/tests/sanity-hsm.sh index 971a38a..0d43e33 100644 --- a/lustre/tests/sanity-hsm.sh +++ b/lustre/tests/sanity-hsm.sh @@ -11,12 +11,11 @@ SRCDIR=$(dirname $0) 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" +# bug number for skipped test:4178 4176 +ALWAYS_EXCEPT="$ALWAYS_EXCEPT 200 221 223b 31a" # UPDATE THE COMMENT ABOVE WITH BUG NUMBERS WHEN CHANGING ALWAYS_EXCEPT! -# skip test cases failed before landing - Jinshan - -ALWAYS_EXCEPT="$SANITY_HSM_EXCEPT 12a 12b 12n 13 30a 31a 34 35 36 58 59" -ALWAYS_EXCEPT="$ALWAYS_EXCEPT 110a 200 201 221 222a 223a 223b 225" LUSTRE=${LUSTRE:-$(cd $(dirname $0)/..; echo $PWD)} @@ -31,9 +30,13 @@ MCREATE=${MCREATE:-mcreate} MOUNT_2=${MOUNT_2:-"yes"} FAIL_ON_ERROR=false -if [[ $MDSCOUNT -ge 2 ]]; then - skip_env "Only run with single MDT for now" && exit -fi +# script only handles up to 10 MDTs (because of MDT_PREFIX) +[ $MDSCOUNT -gt 9 ] && + error "script cannot handle more than 9 MDTs, please fix" && exit + +[ $(facet_fstype $SINGLEMDS) = "zfs" ] && +# bug number for skipped test: LU-3700 + ALWAYS_EXCEPT="$ALWAYS_EXCEPT 51b" check_and_setup_lustre @@ -95,8 +98,9 @@ init_agt_vars() { HSM_ARCHIVE=$(copytool_device $SINGLEAGT) HSM_ARCHIVE_NUMBER=2 - MDT_PARAM="mdt.$FSNAME-MDT0000" - HSM_PARAM="$MDT_PARAM.hsm" + # The test only support up to 10 MDTs + MDT_PREFIX="mdt.$FSNAME-MDT000" + HSM_PARAM="${MDT_PREFIX}0.hsm" # archive is purged at copytool setup HSM_ARCHIVE_PURGE=true @@ -114,6 +118,23 @@ copytool_device() { cleanup() { copytool_cleanup changelog_cleanup + cdt_set_sanity_policy +} + +get_mdt_devices() { + local mdtno + # get MDT device for each mdc + for mdtno in $(seq 1 $MDSCOUNT); do + local idx=$(($mdtno - 1)) + MDT[$idx]=$($LCTL get_param -n \ + mdc.$FSNAME-MDT000${idx}-mdc-*.mds_server_uuid | + awk '{gsub(/_UUID/,""); print $1}' | head -1) + done +} + +search_copytools() { + local agents=${1:-$(facet_active_host $SINGLEAGT)} + do_nodesv $agents "pgrep -x $HSMTOOL_BASE" } search_and_kill_copytool() { @@ -163,10 +184,34 @@ copytool_setup() { copytool_cleanup() { trap - EXIT local agents=${1:-$(facet_active_host $SINGLEAGT)} + local mdtno + local idx + local oldstate + local mdt_hsmctrl do_nodesv $agents "pkill -INT -x $HSMTOOL_BASE" || return 0 sleep 1 echo "Copytool is stopped on $agents" + + # clean all CDTs orphans requests from previous tests + # that would otherwise need to timeout to clear. + for mdtno in $(seq 1 $MDSCOUNT); do + idx=$(($mdtno - 1)) + mdt_hsmctrl="mdt.$FSNAME-MDT000${idx}.hsm_control" + oldstate=$(do_facet mds${mdtno} "$LCTL get_param -n " \ + "$mdt_hsmctrl") + # skip already stop[ed,ing] CDTs + echo $oldstate | grep stop && continue + + do_facet mds${mdtno} "$LCTL set_param $mdt_hsmctrl=shutdown" + wait_result mds${mdtno} "$LCTL get_param -n $mdt_hsmctrl" \ + "stopped" 20 || + error "mds${mdtno} cdt state is not stopped" + do_facet mds${mdtno} "$LCTL set_param $mdt_hsmctrl=$oldstate" + wait_result mds${mdtno} "$LCTL get_param -n $mdt_hsmctrl" \ + "$oldstate" 20 || + error "mds${mdtno} cdt state is not $oldstate" + done } copytool_suspend() { @@ -178,9 +223,9 @@ copytool_suspend() { copytool_remove_backend() { local fid=$1 - local be=$(find $HSM_ARCHIVE -name $fid) + local be=$(do_facet $SINGLEAGT find $HSM_ARCHIVE -name $fid) echo "Remove from backend: $fid = $be" - rm -f $be + do_facet $SINGLEAGT rm -f $be } import_file() { @@ -192,25 +237,77 @@ import_file() { make_archive() { local file=$HSM_ARCHIVE/$1 - mkdir -p $(dirname $file) - dd if=/dev/urandom of=$file count=32 bs=1000000 || + do_facet $SINGLEAGT mkdir -p $(dirname $file) + do_facet $SINGLEAGT dd if=/dev/urandom of=$file count=32 bs=1000000 || error "cannot create $file" } +copy2archive() { + local file=$HSM_ARCHIVE/$2 + do_facet $SINGLEAGT mkdir -p $(dirname $file) + do_facet $SINGLEAGT cp -p $1 $file || error "cannot copy $1 to $file" +} + +mdts_set_param() { + local arg=$1 + local key=$2 + local value=$3 + local mdtno + local rc=0 + if [[ "$value" != "" ]]; then + value="=$value" + fi + for mdtno in $(seq 1 $MDSCOUNT); do + local idx=$(($mdtno - 1)) + local facet=mds${mdtno} + # if $arg include -P option, run 1 set_param per MDT on the MGS + # else, run set_param on each MDT + [[ $arg = *"-P"* ]] && facet=mgs + do_facet $facet $LCTL set_param $arg mdt.${MDT[$idx]}.$key$value + [[ $? != 0 ]] && rc=1 + done + return $rc +} + +mdts_check_param() { + local key="$1" + local target="$2" + local timeout="$3" + local mdtno + for mdtno in $(seq 1 $MDSCOUNT); do + local idx=$(($mdtno - 1)) + wait_result mds${mdtno} \ + "$LCTL get_param -n $MDT_PREFIX${idx}.$key" "$target" \ + $timeout || + error "$key state is not '$target' on mds${mdtno}" + done +} + changelog_setup() { - CL_USER=$(do_facet $SINGLEMDS $LCTL --device $MDT0\ - changelog_register -n) - do_facet $SINGLEMDS lctl set_param mdd.$MDT0.changelog_mask="+hsm" - $LFS changelog_clear $MDT0 $CL_USER 0 + CL_USERS=() + local mdtno + for mdtno in $(seq 1 $MDSCOUNT); do + local idx=$(($mdtno - 1)) + local cl_user=$(do_facet mds${mdtno} $LCTL \ + --device ${MDT[$idx]} \ + changelog_register -n) + CL_USERS+=($cl_user) + do_facet mds${mdtno} lctl set_param \ + mdd.${MDT[$idx]}.changelog_mask="+hsm" + $LFS changelog_clear ${MDT[$idx]} $cl_user 0 + done } changelog_cleanup() { -# $LFS changelog $MDT0 - [[ -n "$CL_USER" ]] || return 0 - - $LFS changelog_clear $MDT0 $CL_USER 0 - do_facet $SINGLEMDS lctl --device $MDT0 changelog_deregister $CL_USER - CL_USER= + local mdtno + for mdtno in $(seq 1 $MDSCOUNT); do + local idx=$(($mdtno - 1)) + [[ -z ${CL_USERS[$idx]} ]] && continue + $LFS changelog_clear ${MDT[$idx]} ${CL_USERS[$idx]} 0 + do_facet mds${mdtno} lctl --device ${MDT[$idx]} \ + changelog_deregister ${CL_USERS[$idx]} + done + CL_USERS=() } changelog_get_flags() { @@ -230,58 +327,58 @@ get_hsm_param() { set_hsm_param() { local param=$1 local value=$2 - do_facet $SINGLEMDS $LCTL set_param -n $HSM_PARAM.$param=$value + local opt=$3 + mdts_set_param "$opt -n" "hsm.$param" "$value" return $? } set_test_state() { local cmd=$1 local target=$2 - do_facet $SINGLEMDS $LCTL set_param $MDT_PARAM.hsm_control=$cmd - wait_result $SINGLEMDS "$LCTL get_param -n $MDT_PARAM.hsm_control"\ - $target 10 || error "cdt state is not $target" + mdts_set_param "" hsm_control "$cmd" + mdts_check_param hsm_control "$target" 10 } 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 + mdts_set_param "" hsm.policy "+NRA" + mdts_set_param "" hsm.policy "-NBR" + CDT_POLICY_HAD_CHANGED= + fi } cdt_set_no_retry() { - do_facet $SINGLEMDS $LCTL set_param $HSM_PARAM.policy=+nra + mdts_set_param "" hsm.policy "+NRA" + CDT_POLICY_HAD_CHANGED=true } cdt_clear_no_retry() { - do_facet $SINGLEMDS $LCTL set_param $HSM_PARAM.policy=-nra + mdts_set_param "" hsm.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() { + mdts_set_param "" hsm.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() { + mdts_set_param "" hsm.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 + mdts_set_param "-P -d" 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 + mdts_set_param "-P" hsm_control "$1" } cdt_check_state() { - local target=$1 - wait_result $SINGLEMDS\ - "$LCTL get_param -n $MDT_PARAM.hsm_control" "$target" 20 || - error "cdt state is not $target" + mdts_check_param hsm_control "$1" 20 } cdt_disable() { @@ -306,9 +403,10 @@ cdt_restart() { cdt_set_sanity_policy } -need2clients() { - if [[ $CLIENTCOUNT -lt 2 ]]; then - skip "Need two or more clients, have $CLIENTCOUNT" +needclients() { + local client_count=$1 + if [[ $CLIENTCOUNT -lt $client_count ]]; then + skip "Need $client_count or more clients, have $CLIENTCOUNT" return 1 fi return 0 @@ -322,8 +420,7 @@ get_hsm_flags() { local f=$1 local u=$2 - if [[ $u == "user" ]] - then + if [[ $u == "user" ]]; then local st=$($RUNAS $LFS hsm_state $f) else local st=$($LFS hsm_state $f) @@ -365,15 +462,13 @@ check_hsm_flags_user() { copy_file() { local f= - if [[ -d $2 ]] - then + if [[ -d $2 ]]; then f=$2/$(basename $1) else f=$2 fi - if [[ "$3" != 1 ]] - then + if [[ "$3" != 1 ]]; then f=${f/$DIR/$DIR2} fi rm -f $f @@ -389,7 +484,8 @@ make_small() { } cleanup_large_files() { - local ratio=$(df $MOUNT |awk '{print $5}' |sed 's/%//g' |grep -v Use) + local ratio=$(df -P $MOUNT | tail -1 | awk '{print $5}' | + sed 's/%//g') [ $ratio -gt 50 ] && find $MOUNT -size +10M -exec rm -f {} \; } @@ -453,19 +549,22 @@ wait_request_state() { local fid=$1 local request=$2 local state=$3 + # 4th arg (mdt index) is optional + local mdtidx=${4:-0} + local mds=mds$(($mdtidx + 1)) - local cmd="$LCTL get_param -n $HSM_PARAM.agent_actions" + local cmd="$LCTL get_param -n ${MDT_PREFIX}${mdtidx}.hsm.actions" cmd+=" | awk '/'$fid'.*action='$request'/ {print \\\$13}' | cut -f2 -d=" - wait_result $SINGLEMDS "$cmd" $state 100 || - error "request on $fid is not $state" + wait_result $mds "$cmd" $state 100 || + error "request on $fid is not $state on $mds" } get_request_state() { local fid=$1 local request=$2 - do_facet $SINGLEMDS "$LCTL get_param -n $HSM_PARAM.agent_actions |"\ + do_facet $SINGLEMDS "$LCTL get_param -n $HSM_PARAM.actions |"\ "awk '/'$fid'.*action='$request'/ {print \\\$13}' | cut -f2 -d=" } @@ -473,14 +572,14 @@ get_request_count() { local fid=$1 local request=$2 - do_facet $SINGLEMDS "$LCTL get_param -n $HSM_PARAM.agent_actions |"\ + do_facet $SINGLEMDS "$LCTL get_param -n $HSM_PARAM.actions |"\ "awk -vn=0 '/'$fid'.*action='$request'/ {n++}; END {print n}'" } wait_all_done() { local timeout=$1 - local cmd="$LCTL get_param -n $HSM_PARAM.agent_actions" + local cmd="$LCTL get_param -n $HSM_PARAM.actions" cmd+=" | egrep 'WAITING|STARTED'" wait_result $SINGLEMDS "$cmd" "" $timeout || @@ -492,8 +591,8 @@ wait_for_grace_delay() { sleep $val } -MDT0=$($LCTL get_param -n mdc.*.mds_server_uuid | - awk '{gsub(/_UUID/,""); print $1}' | head -1) +# populate MDT device array +get_mdt_devices # initiate variables init_agt_vars @@ -511,6 +610,9 @@ cdt_check_state enabled echo "Start copytool" copytool_setup +echo "Set sanity-hsm HSM policy" +cdt_set_sanity_policy + # finished requests are quickly removed from list set_hsm_param grace_delay 10 @@ -677,8 +779,7 @@ test_9() { run_test 9 "Use of explict archive number, with dedicated copytool" test_9a() { - [[ $CLIENTCOUNT -ge 3 ]] || - { skip "Need three or more clients"; return 0; } + needclients 3 || return 0 local n local file @@ -700,7 +801,7 @@ test_9a() { $LFS hsm_archive $file || error "could not archive file $file" wait_request_state $fid ARCHIVE SUCCEED - check_hsm_flags $file "0x00000001" + check_hsm_flags $file "0x00000009" done trap - EXIT @@ -719,10 +820,10 @@ test_10a() { error "hsm_archive failed" wait_request_state $fid ARCHIVE SUCCEED - local AFILE=$(ls $HSM_ARCHIVE/*/*/*/*/*/*/$fid) || + local AFILE=$(do_facet $SINGLEAGT ls $HSM_ARCHIVE'/*/*/*/*/*/*/'$fid) || error "fid $fid not in archive $HSM_ARCHIVE" echo "Verifying content" - diff $f $AFILE || error "archived file differs" + do_facet $SINGLEAGT diff $f $AFILE || error "archived file differs" echo "Verifying hsm state " check_hsm_flags $f "0x00000009" @@ -740,7 +841,7 @@ test_10b() { # test needs a running copytool copytool_setup - mkdir -p $DIR/$tdir $HSM_ARCHIVE/$tdir + mkdir -p $DIR/$tdir local f=$DIR/$tdir/$tfile local fid=$(copy_file /etc/hosts $f) $LFS hsm_archive $f || error "archive request failed" @@ -759,7 +860,7 @@ test_10c() { # test needs a running copytool copytool_setup - mkdir -p $DIR/$tdir $HSM_ARCHIVE/$tdir + mkdir -p $DIR/$tdir local f=$DIR/$tdir/$tfile local fid=$(copy_file /etc/hosts $f) $LFS hsm_set --noarchive $f @@ -780,7 +881,7 @@ test_10d() { wait_request_state $fid ARCHIVE SUCCEED local ar=$(get_hsm_archive_id $f) - local dflt=$(get_hsm_param archive_id) + local dflt=$(get_hsm_param default_archive_id) [[ $ar == $dflt ]] || error "archived file is not on default archive: $ar != $dflt" @@ -789,8 +890,8 @@ test_10d() { run_test 10d "Archive a file on the default archive id" test_11() { - mkdir -p $DIR/$tdir $HSM_ARCHIVE/$tdir - cp /etc/hosts $HSM_ARCHIVE/$tdir/$tfile + mkdir -p $DIR/$tdir + copy2archive /etc/hosts $tdir/$tfile local f=$DIR/$tdir/$tfile import_file $tdir/$tfile $f @@ -798,7 +899,7 @@ test_11() { 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" @@ -809,7 +910,7 @@ test_11() { local fid=$(path2fid $f) echo "Verifying new fid $fid in archive" - local AFILE=$(ls $HSM_ARCHIVE/*/*/*/*/*/*/$fid) || + local AFILE=$(do_facet $SINGLEAGT ls $HSM_ARCHIVE'/*/*/*/*/*/*/'$fid) || error "fid $fid not in archive $HSM_ARCHIVE" } run_test 11 "Import a file" @@ -818,8 +919,9 @@ test_12a() { # test needs a running copytool copytool_setup - mkdir -p $DIR/$tdir $HSM_ARCHIVE/$tdir - cp /etc/hosts $HSM_ARCHIVE/$tdir/$tfile + mkdir -p $DIR/$tdir + copy2archive /etc/hosts $tdir/$tfile + local f=$DIR/$tdir/$tfile import_file $tdir/$tfile $f local f=$DIR2/$tdir/$tfile @@ -833,7 +935,7 @@ test_12a() { echo "Verifying file state: " check_hsm_flags $f "0x00000009" - diff -q $HSM_ARCHIVE/$tdir/$tfile $f + do_facet $SINGLEAGT diff -q $HSM_ARCHIVE/$tdir/$tfile $f [[ $? -eq 0 ]] || error "Restored file differs" @@ -845,8 +947,9 @@ test_12b() { # test needs a running copytool copytool_setup - mkdir -p $DIR/$tdir $HSM_ARCHIVE/$tdir - cp /etc/hosts $HSM_ARCHIVE/$tdir/$tfile + mkdir -p $DIR/$tdir + copy2archive /etc/hosts $tdir/$tfile + local f=$DIR/$tdir/$tfile import_file $tdir/$tfile $f echo "Verifying released state: " @@ -857,7 +960,7 @@ test_12b() { echo "Verifying file state after restore: " check_hsm_flags $f "0x00000009" - diff -q $HSM_ARCHIVE/$tdir/$tfile $f + do_facet $SINGLEAGT diff -q $HSM_ARCHIVE/$tdir/$tfile $f [[ $? -eq 0 ]] || error "Restored file differs" @@ -893,7 +996,8 @@ test_12d() { # test needs a running copytool copytool_setup - mkdir -p $DIR/$tdir $HSM_ARCHIVE/$tdir + mkdir -p $DIR/$tdir + local f=$DIR/$tdir/$tfile local fid=$(copy_file /etc/hosts $f) $LFS hsm_restore $f || error "restore of non archived file failed" @@ -985,7 +1089,7 @@ test_12g() { run_test 12g "Restore a released file implicitly" test_12h() { - need2clients || return 0 + needclients 2 || return 0 # test needs a running copytool copytool_setup @@ -1034,12 +1138,14 @@ test_12n() { # test needs a running copytool copytool_setup - mkdir -p $DIR/$tdir $HSM_ARCHIVE/$tdir - cp /etc/hosts $HSM_ARCHIVE/$tdir/$tfile + mkdir -p $DIR/$tdir + copy2archive /etc/hosts $tdir/$tfile + local f=$DIR/$tdir/$tfile import_file $tdir/$tfile $f - cmp /etc/hosts $f || error "Restored file differs" + do_facet $SINGLEAGT cmp /etc/hosts $f || + error "Restored file differs" $LFS hsm_release $f || error "release of $f failed" @@ -1058,24 +1164,23 @@ test_13() { # populate directory to be imported for d in $(seq 1 10); do local CURR_DIR="$HSM_ARCHIVE/$ARC_SUBDIR/dir.$d" - mkdir -p "$CURR_DIR" + do_facet $SINGLEAGT mkdir -p "$CURR_DIR" for f in $(seq 1 10); do CURR_FILE="$CURR_DIR/$tfile.$f" # write file-specific data - echo "d=$d, f=$f, dir=$CURR_DIR, file=$CURR_FILE"\ - > $CURR_FILE + do_facet $SINGLEAGT \ + "echo d=$d, f=$f, dir=$CURR_DIR, "\ + "file=$CURR_FILE > $CURR_FILE" done done # import to Lustre import_file "$ARC_SUBDIR" $DIR/$tdir # diff lustre content and origin (triggers file restoration) # there must be 10x10 identical files, and no difference - local cnt_ok=$(diff -rs $HSM_ARCHIVE/$ARC_SUBDIR \ - $DIR/$tdir/$ARC_SUBDIR | - grep identical | wc -l) - local cnt_diff=$(diff -r $HSM_ARCHIVE/$ARC_SUBDIR \ - $DIR/$tdir/$ARC_SUBDIR | - wc -l) + local cnt_ok=$(do_facet $SINGLEAGT diff -rs $HSM_ARCHIVE/$ARC_SUBDIR \ + $DIR/$tdir/$ARC_SUBDIR | grep identical | wc -l) + local cnt_diff=$(do_facet $SINGLEAGT diff -r $HSM_ARCHIVE/$ARC_SUBDIR \ + $DIR/$tdir/$ARC_SUBDIR | wc -l) [ $cnt_diff -eq 0 ] || error "$cnt_diff imported files differ from read data" @@ -1242,19 +1347,32 @@ test_21() { local fid=$(make_small $f) check_hsm_flags $f "0x00000000" + local orig_size=$(stat -c "%s" $f) + local orig_blocks=$(stat -c "%b" $f) + + start_full_debug_logging + $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" - local sz=$(stat -c "%s" $f) - [ $sz -ne "0" ] || error "file size should not be zero" + local blocks=$(stat -c "%b" $f) + [ $blocks -eq $orig_blocks ] || + error "$f: wrong block number after archive: " \ + "$blocks != $orig_blocks" + local size=$(stat -c "%s" $f) + [ $size -eq $orig_size ] || + error "$f: wrong size after archive: $size != $orig_size" # Release and check states $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 "%s" $f) -eq $sz ] || error "wrong file size" + blocks=$(stat -c "%b" $f) + [ $blocks -gt 5 ] && + error "$f: too many blocks after release: $blocks > 5" + size=$(stat -c "%s" $f) + [ $size -ne $orig_size ] && + error "$f: wrong size after release: $size != $orig_size" # Check we can release an file without stripe info f=$f.nolov @@ -1272,6 +1390,8 @@ test_21() { $LFS hsm_release $f || fail "second release should succeed" check_hsm_flags $f "0x0000000d" + stop_full_debug_logging + copytool_cleanup } run_test 21 "Simple release tests" @@ -1467,8 +1587,8 @@ test_24b() { $LFS hsm_archive $file wait_request_state $fid ARCHIVE SUCCEED - $LFS hsm_release $file || - check_hsm_flags $file "0x0000000d" + $LFS hsm_release $file + check_hsm_flags $file "0x0000000d" $LFS hsm_restore $file wait_request_state $fid RESTORE SUCCEED @@ -1477,8 +1597,8 @@ test_24b() { $RUNAS $LFS hsm_state $file || error "user '$RUNAS_ID' cannot get HSM state of '$file'" - $LFS hsm_release $file || - check_hsm_flags $file "0x0000000d" + $LFS hsm_release $file + check_hsm_flags $file "0x0000000d" # Check that ordinary user can accessed released file. sum1=$($RUNAS md5sum $file) || @@ -1491,12 +1611,141 @@ test_24b() { } run_test 24b "root can archive, release, and restore user files" +cleanup_test_24c() { + trap 0 + set_hsm_param user_request_mask RESTORE + set_hsm_param group_request_mask RESTORE + set_hsm_param other_request_mask RESTORE +} + +test_24c() { + local file=$DIR/$tdir/$tfile + local action=archive + local user_save + local group_save + local other_save + + # test needs a running copytool + copytool_setup + + mkdir -p $DIR/$tdir + + # Save the default masks and check that cleanup_24c will + # restore the request masks correctly. + user_save=$(get_hsm_param user_request_mask) + group_save=$(get_hsm_param group_request_mask) + other_save=$(get_hsm_param other_request_mask) + + [ "$user_save" == RESTORE ] || + error "user_request_mask is '$user_save' expected 'RESTORE'" + [ "$group_save" == RESTORE ] || + error "group_request_mask is '$group_save' expected 'RESTORE'" + [ "$other_save" == RESTORE ] || + error "other_request_mask is '$other_save' expected 'RESTORE'" + + trap cleanup_test_24c EXIT + + # User. + rm -f $file + make_small $file + chown $RUNAS_ID:nobody $file || + error "cannot chown '$file' to '$RUNAS_ID:nobody'" + + set_hsm_param user_request_mask "" + $RUNAS $LFS hsm_$action $file && + error "$action by user should fail" + + set_hsm_param user_request_mask $action + $RUNAS $LFS hsm_$action $file || + error "$action by user should succeed" + + # Group. + rm -f $file + make_small $file + chown nobody:$RUNAS_GID $file || + error "cannot chown '$file' to 'nobody:$RUNAS_GID'" + + set_hsm_param group_request_mask "" + $RUNAS $LFS hsm_$action $file && + error "$action by group should fail" + + set_hsm_param group_request_mask $action + $RUNAS $LFS hsm_$action $file || + error "$action by group should succeed" + + # Other. + rm -f $file + make_small $file + chown nobody:nobody $file || + error "cannot chown '$file' to 'nobody:nobody'" + + set_hsm_param other_request_mask "" + $RUNAS $LFS hsm_$action $file && + error "$action by other should fail" + + set_hsm_param other_request_mask $action + $RUNAS $LFS hsm_$action $file || + error "$action by other should succeed" + + copytool_cleanup + cleanup_test_24c +} +run_test 24c "check that user,group,other request masks work" + +cleanup_test_24d() { + trap 0 + mount -o remount,rw $MOUNT2 +} + +test_24d() { + local file1=$DIR/$tdir/$tfile + local file2=$DIR2/$tdir/$tfile + local fid1 + local fid2 + + copytool_setup + + mkdir -p $DIR/$tdir + rm -f $file1 + fid1=$(make_small $file1) + + trap cleanup_test_24d EXIT + + mount -o remount,ro $MOUNT2 + + fid2=$(path2fid $file2) + [ "$fid1" == "$fid2" ] || + error "FID mismatch '$fid1' != '$fid2'" + + $LFS hsm_archive $file2 && + error "archive should fail on read-only mount" + check_hsm_flags $file1 "0x00000000" + + $LFS hsm_archive $file1 + wait_request_state $fid1 ARCHIVE SUCCEED + + $LFS hsm_release $file1 + $LFS hsm_restore $file2 + wait_request_state $fid1 RESTORE SUCCEED + + $LFS hsm_release $file1 || error "cannot release '$file1'" + dd if=$file2 of=/dev/null bs=1M || "cannot read '$file2'" + + $LFS hsm_release $file2 && + error "release should fail on read-only mount" + + copytool_cleanup + cleanup_test_24d +} +run_test 24d "check that read-only mounts are respected" + test_25a() { # test needs a running copytool copytool_setup - mkdir -p $DIR/$tdir $HSM_ARCHIVE/$tdir - cp /etc/hosts $HSM_ARCHIVE/$tdir/$tfile + mkdir -p $DIR/$tdir + copy2archive /etc/hosts $tdir/$tfile + local f=$DIR/$tdir/$tfile import_file $tdir/$tfile $f @@ -1619,13 +1868,14 @@ run_test 28 "Concurrent archive/file remove" test_30a() { # restore at exec cannot work on agent node (because of Linux kernel # protection of executables) - need2clients || return 0 + needclients 2 || return 0 # test needs a running copytool copytool_setup - mkdir -p $DIR/$tdir $HSM_ARCHIVE/$tdir - cp -p /bin/true $HSM_ARCHIVE/$tdir/$tfile + mkdir -p $DIR/$tdir + copy2archive /bin/true $tdir/$tfile + local f=$DIR/$tdir/true import_file $tdir/$tfile $f @@ -1650,7 +1900,7 @@ run_test 30a "Restore at exec (import case)" test_30b() { # restore at exec cannot work on agent node (because of Linux kernel # protection of executables) - need2clients || return 0 + needclients 2 || return 0 # test needs a running copytool copytool_setup @@ -1679,6 +1929,41 @@ test_30b() { } run_test 30b "Restore at exec (release case)" +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 @@ -1693,8 +1978,7 @@ restore_and_check_size() { n=$(stat -c "%s" $f) # we echo in both cases to show stat is not # hang - if [[ $n != $s ]] - then + if [[ $n != $s ]]; then echo "size seen is $n != $s" err=1 else @@ -1704,13 +1988,12 @@ restore_and_check_size() { sleep 10 cpt=$((cpt + 1)) done - if [[ $cpt -lt 10 ]] - then - echo " restore is too long" - else + if [[ $cpt -lt 10 ]]; then echo " "done + else + echo " restore is too long" + wait_request_state $fid RESTORE SUCCEED fi - wait_request_state $fid RESTORE SUCCEED return $err } @@ -2098,7 +2381,7 @@ run_test 56 "Setattr during an archive is ok" test_57() { # Need one client for I/O, one for request - need2clients || return 0 + needclients 2 || return 0 # test needs a running copytool copytool_setup @@ -2127,13 +2410,15 @@ test_57() { } run_test 57 "Archive a file with dirty cache on another node" -test_58() { - # test needs a running copytool - copytool_setup +truncate_released_file() { + local src_file=$1 + local trunc_to=$2 - mkdir -p $DIR/$tdir + local sz=$(stat -c %s $src_file) local f=$DIR/$tdir/$tfile - local fid=$(make_small $f) + local fid=$(copy_file $1 $f) + local ref=$f-ref + cp $f $f-ref $LFS hsm_archive --archive $HSM_ARCHIVE_NUMBER $f || error "could not archive file" @@ -2141,63 +2426,46 @@ test_58() { $LFS hsm_release $f || error "could not release file" - $TRUNCATE $f 0 || error "truncate failed" + $TRUNCATE $f $trunc_to || error "truncate failed" sync - local sz=$(stat -c %s $f) - [[ $sz == 0 ]] || error "size after truncate is $sz != 0" + local sz1=$(stat -c %s $f) + [[ $sz1 == $trunc_to ]] || + error "size after trunc: $sz1 expect $trunc_to, original $sz" $LFS hsm_state $f - check_hsm_flags $f "0x0000000b" local state=$(get_request_state $fid RESTORE) - [[ "$state" == "" ]] || - error "truncate 0 trigs a restore, state = $state" + [[ "$state" == "SUCCEED" ]] || + error "truncate $sz does not trig restore, state = $state" - copytool_cleanup + $TRUNCATE $ref $trunc_to + cmp $ref $f || error "file data wrong after truncate" + + rm -f $f $f-ref } -run_test 58 "Truncate 0 on a released file must not trigger restore" -test_59() { +test_58() { # test needs a running copytool copytool_setup mkdir -p $DIR/$tdir - local f=$DIR/$tdir/$tfile - local fid=$(copy_file /etc/passwd $f) - local ref=$f-ref - cp $f $ref - local sz=$(stat -c %s $ref) - sz=$((sz / 2)) - $TRUNCATE $ref $sz - - $LFS hsm_archive --archive $HSM_ARCHIVE_NUMBER $f || - error "could not archive file" - wait_request_state $fid ARCHIVE SUCCEED - - $LFS hsm_release $f || error "could not release file" - $TRUNCATE $f $sz || error "truncate failed" - sync + local sz=$(stat -c %s /etc/passwd) - local sz1=$(stat -c %s $f) - [[ $sz1 == $sz ]] || error "size after truncate is $sz1 != $sz" + echo "truncate up from $sz to $((sz*2))" + truncate_released_file /etc/passwd $((sz*2)) - $LFS hsm_state $f + echo "truncate down from $sz to $((sz/2))" + truncate_released_file /etc/passwd $((sz/2)) - 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 @@ -2243,8 +2511,7 @@ double_verify_reset_hsm_param() { # restore value set_hsm_param $p $save - if [[ $rc == 0 ]] - then + if [[ $rc == 0 ]]; then error "we must not be able to set $HSM_PARAM.$p to 0" fi } @@ -2252,9 +2519,9 @@ double_verify_reset_hsm_param() { test_100() { double_verify_reset_hsm_param loop_period double_verify_reset_hsm_param grace_delay - double_verify_reset_hsm_param request_timeout + double_verify_reset_hsm_param active_request_timeout double_verify_reset_hsm_param max_requests - double_verify_reset_hsm_param archive_id + double_verify_reset_hsm_param default_archive_id } run_test 100 "Set coordinator /proc tunables" @@ -2282,7 +2549,7 @@ test_103() { 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" @@ -2304,7 +2571,7 @@ test_104() { 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 @@ -2325,12 +2592,12 @@ test_105() { $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 @@ -2340,28 +2607,70 @@ test_105() { } run_test 105 "Restart of coordinator" +get_agent_by_uuid_mdt() { + local uuid=$1 + local mdtidx=$2 + local mds=mds$(($mdtidx + 1)) + do_facet $mds "$LCTL get_param -n ${MDT_PREFIX}${mdtidx}.hsm.agents |\ + grep $uuid" +} + +check_agent_registered_by_mdt() { + local uuid=$1 + local mdtidx=$2 + local mds=mds$(($mdtidx + 1)) + local agent=$(get_agent_by_uuid_mdt $uuid $mdtidx) + if [[ ! -z "$agent" ]]; then + echo "found agent $agent on $mds" + else + error "uuid $uuid not found in agent list on $mds" + fi +} + +check_agent_unregistered_by_mdt() { + local uuid=$1 + local mdtidx=$2 + local mds=mds$(($mdtidx + 1)) + local agent=$(get_agent_by_uuid_mdt $uuid $mdtidx) + if [[ -z "$agent" ]]; then + echo "uuid not found in agent list on $mds" + else + error "uuid found in agent list on $mds: $agent" + fi +} + +check_agent_registered() { + local uuid=$1 + local mdsno + for mdsno in $(seq 1 $MDSCOUNT); do + check_agent_registered_by_mdt $uuid $((mdsno - 1)) + done +} + +check_agent_unregistered() { + local uuid=$1 + local mdsno + for mdsno in $(seq 1 $MDSCOUNT); do + check_agent_unregistered_by_mdt $uuid $((mdsno - 1)) + done +} + test_106() { - # test needs a running copytool + local uuid=$(do_rpc_nodes $(facet_active_host $SINGLEAGT) \ + get_client_uuid $MOUNT | cut -d' ' -f2) + copytool_setup + check_agent_registered $uuid + + search_copytools || error "No copytool found" - local uuid=$(do_rpc_nodes $(facet_active_host $SINGLEAGT) \ - get_client_uuid | 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" - 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" + check_agent_unregistered $uuid + copytool_setup - local agent=$(do_facet $SINGLEMDS $LCTL get_param -n $HSM_PARAM.agents | - grep $uuid) + check_agent_registered $uuid + copytool_cleanup - [[ ! -z "$agent" ]] || - error "My uuid $uuid not found in agent list after"\ - " copytool restart" } run_test 106 "Copytool register/unregister" @@ -2386,23 +2695,60 @@ test_107() { } run_test 107 "Copytool re-register after MDS restart" +policy_set_and_test() +{ + local change="$1" + local target="$2" + do_facet $SINGLEMDS $LCTL set_param "$HSM_PARAM.policy=\\\"$change\\\"" + local policy=$(do_facet $SINGLEMDS $LCTL get_param -n $HSM_PARAM.policy) + [[ "$policy" == "$target" ]] || + error "Wrong policy after '$change': '$policy' != '$target'" +} + +test_109() { + # to force default policy setting if error + CDT_POLICY_HAD_CHANGED=true + + local policy=$(do_facet $SINGLEMDS $LCTL get_param -n $HSM_PARAM.policy) + local default="NonBlockingRestore [NoRetryAction]" + [[ "$policy" == "$default" ]] || + error "default policy has changed,"\ + " '$policy' != '$default' update the test" + policy_set_and_test "+NBR" "[NonBlockingRestore] [NoRetryAction]" + policy_set_and_test "+NRA" "[NonBlockingRestore] [NoRetryAction]" + policy_set_and_test "-NBR" "NonBlockingRestore [NoRetryAction]" + policy_set_and_test "-NRA" "NonBlockingRestore NoRetryAction" + policy_set_and_test "NRA NBR" "[NonBlockingRestore] [NoRetryAction]" + # useless bacause we know but safer for futur changes to use real value + local policy=$(do_facet $SINGLEMDS $LCTL get_param -n $HSM_PARAM.policy) + echo "Next set_param must failed" + policy_set_and_test "wrong" "$policy" + + # return to default + echo "Back to default policy" + cdt_set_sanity_policy +} +run_test 109 "Policy display/change" + test_110a() { # test needs a running copytool copytool_setup - mkdir -p $DIR/$tdir $HSM_ARCHIVE/$tdir - cp /etc/passwd $HSM_ARCHIVE/$tdir/$tfile + mkdir -p $DIR/$tdir + + copy2archive /etc/passwd $tdir/$tfile + local f=$DIR/$tdir/$tfile import_file $tdir/$tfile $f local fid=$(path2fid $f) - cdt_set_no_blocking_restore + cdt_set_non_blocking_restore md5sum $f local st=$? # cleanup wait_request_state $fid RESTORE SUCCEED - cdt_clear_no_blocking_restore + cdt_clear_non_blocking_restore # Test result [[ $st == 1 ]] || @@ -2424,13 +2770,13 @@ test_110b() { wait_request_state $fid ARCHIVE SUCCEED $LFS hsm_release $f - cdt_set_no_blocking_restore + cdt_set_non_blocking_restore md5sum $f local st=$? # cleanup wait_request_state $fid RESTORE SUCCEED - cdt_clear_no_blocking_restore + cdt_clear_non_blocking_restore # Test result [[ $st == 1 ]] || @@ -2445,9 +2791,11 @@ test_111a() { # test needs a running copytool copytool_setup - mkdir -p $DIR/$tdir $HSM_ARCHIVE/$tdir + mkdir -p $DIR/$tdir + copy2archive /etc/passwd $tdir/$tfile + local f=$DIR/$tdir/$tfile - cp /etc/passwd $HSM_ARCHIVE/$tdir/$tfile + import_file $tdir/$tfile $f local fid=$(path2fid $f) @@ -2598,7 +2946,7 @@ test_220() { $LFS hsm_archive --archive $HSM_ARCHIVE_NUMBER $f wait_request_state $fid ARCHIVE SUCCEED - local flags=$(changelog_get_flags $MDT0 HSM $fid | tail -1) + local flags=$(changelog_get_flags ${MDT[0]} HSM $fid | tail -1) changelog_cleanup local target=0x0 @@ -2625,7 +2973,7 @@ test_221() { wait_request_state $fid ARCHIVE CANCELED wait_request_state $fid CANCEL SUCCEED - local flags=$(changelog_get_flags $MDT0 HSM $fid | tail -1) + local flags=$(changelog_get_flags ${MDT[0]} HSM $fid | tail -1) local target=0x7d [[ $flags == $target ]] || error "Changelog flag is $flags not $target" @@ -2638,9 +2986,10 @@ test_222a() { # test needs a running copytool copytool_setup - mkdir -p $DIR/$tdir $HSM_ARCHIVE/$tdir + mkdir -p $DIR/$tdir + copy2archive /etc/passwd $tdir/$tfile + local f=$DIR/$tdir/$tfile - cp /etc/passwd $HSM_ARCHIVE/$tdir/$tfile import_file $tdir/$tfile $f local fid=$(path2fid $f) @@ -2649,7 +2998,7 @@ test_222a() { $LFS hsm_restore $f wait_request_state $fid RESTORE SUCCEED - local flags=$(changelog_get_flags $MDT0 HSM $fid | tail -1) + local flags=$(changelog_get_flags ${MDT[0]} HSM $fid | tail -1) local target=0x80 [[ $flags == $target ]] || error "Changelog flag is $flags not $target" @@ -2675,7 +3024,7 @@ test_222b() { wait_request_state $fid RESTORE SUCCEED - local flags=$(changelog_get_flags $MDT0 HSM $fid | tail -1) + local flags=$(changelog_get_flags ${MDT[0]} HSM $fid | tail -1) local target=0x80 [[ $flags == $target ]] || error "Changelog flag is $flags not $target" @@ -2704,7 +3053,7 @@ test_223a() { wait_request_state $fid RESTORE CANCELED wait_request_state $fid CANCEL SUCCEED - local flags=$(changelog_get_flags $MDT0 HSM $fid | tail -1) + local flags=$(changelog_get_flags ${MDT[0]} HSM $fid | tail -1) local target=0xfd [[ $flags == $target ]] || @@ -2733,7 +3082,7 @@ test_223b() { wait_request_state $fid RESTORE CANCELED wait_request_state $fid CANCEL SUCCEED - local flags=$(changelog_get_flags $MDT0 HSM $fid | tail -1) + local flags=$(changelog_get_flags ${MDT[0]} HSM $fid | tail -1) local target=0xfd [[ $flags == $target ]] || @@ -2759,7 +3108,7 @@ test_224() { $LFS hsm_remove $f wait_request_state $fid REMOVE SUCCEED - local flags=$(changelog_get_flags $MDT0 HSM $fid | tail -1) + local flags=$(changelog_get_flags ${MDT[0]} HSM $fid | tail -n 1) local target=0x200 [[ $flags == $target ]] || @@ -2795,9 +3144,9 @@ test_225() { 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}') + flags=$(changelog_get_flags ${MDT[0]} RENME $fid2) + local flags=$($LFS changelog ${MDT[0]} | grep HSM | grep $fid | + tail -n 1 | awk '{print $5}') local target=0x27d [[ $flags == $target ]] || @@ -2829,7 +3178,7 @@ test_226() { rm $f1 || error "rm $f1 failed" - local flags=$(changelog_get_flags $MDT0 UNLNK $fid1) + local flags=$(changelog_get_flags ${MDT[0]} UNLNK $fid1) local target=0x3 [[ $flags == $target ]] || @@ -2837,7 +3186,7 @@ test_226() { mv $f3 $f2 || error "mv $f3 $f2 failed" - flags=$(changelog_get_flags $MDT0 RENME $fid2) + flags=$(changelog_get_flags ${MDT[0]} RENME $fid2) target=0x3 [[ $flags == $target ]] || @@ -2857,7 +3206,7 @@ check_flags_changes() { 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 flags=($(changelog_get_flags ${MDT[0]} HSM $fid)) local seen=${#flags[*]} cnt=$((fst + cnt)) [[ $seen == $cnt ]] || @@ -2868,7 +3217,7 @@ check_flags_changes() { $LFS hsm_clear --$hsm_flag $f || error "Cannot clear $hsm_flag on $f" - flags=($(changelog_get_flags $MDT0 HSM $fid)) + flags=($(changelog_get_flags ${MDT[0]} HSM $fid)) seen=${#flags[*]} cnt=$(($cnt + 1)) [[ $cnt == $seen ]] || @@ -2904,6 +3253,41 @@ test_227() { } run_test 227 "changelog when explicit setting of HSM flags" +test_228() { + # test needs a running copytool + copytool_setup + + dd if=/dev/urandom of=$DIR/$tfile bs=1M count=1 conv=sync || + error "creating $DIR/$tfile" + $LFS hsm_archive --archive $HSM_ARCHIVE_NUMBER $DIR/$tfile + wait_request_state $(path2fid $DIR/$tfile) ARCHIVE SUCCEED + + $LFS hsm_release $DIR/$tfile + check_hsm_flags $DIR/$tfile "0x0000000d" + + filefrag $DIR/$tfile | grep " 1 extent found" || + error "filefrag on released file must return only one extent" + + # only newer versions of cp detect sparse files by stat/FIEMAP + # (LU-2580) + cp --sparse=auto $DIR/$tfile $DIR/$tfile.2 || + error "copying $DIR/$tfile" + cmp $DIR/$tfile $DIR/$tfile.2 || error "comparing copied $DIR/$tfile" + + $LFS hsm_release $DIR/$tfile + check_hsm_flags $DIR/$tfile "0x0000000d" + + mkdir $DIR/$tdir + + tar cf - --sparse $DIR/$tfile | tar xvf - -C $DIR/$tdir || + error "tar failed" + cmp $DIR/$tfile $DIR/$tdir/$DIR/$tfile || + error "comparing untarred $DIR/$tfile" + + copytool_cleanup +} +run_test 228 "On released file, return extend to FIEMAP. For [cp,tar] --sparse" + test_250() { # test needs a running copytool copytool_setup @@ -2928,12 +3312,12 @@ test_250() { 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 @@ -2952,8 +3336,8 @@ test_251() { 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) @@ -2965,7 +3349,7 @@ test_251() { 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 @@ -2999,6 +3383,209 @@ test_300() { } run_test 300 "On disk coordinator state kept between MDT umount/mount" +test_301() { + local ai=$(get_hsm_param default_archive_id) + local new=$((ai + 1)) + + set_hsm_param default_archive_id $new -P + fail $SINGLEMDS + local res=$(get_hsm_param default_archive_id) + + # clear value + set_hsm_param default_archive_id "" "-P -d" + + [[ $new == $res ]] || error "Value after MDS restart is $res != $new" +} +run_test 301 "HSM tunnable are persistent" + +test_302() { + local ai=$(get_hsm_param default_archive_id) + local new=$((ai + 1)) + + # stop coordinator + cdt_shutdown + + set_hsm_param default_archive_id $new -P + + local mdtno + for mdtno in $(seq 1 $MDSCOUNT); do + fail mds${mdtno} + done + + # 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" + +test_400() { + [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return + + copytool_setup + + mkdir -p $DIR/$tdir + + local dir_mdt0=$DIR/$tdir/mdt0 + local dir_mdt1=$DIR/$tdir/mdt1 + + # create 1 dir per MDT + $LFS mkdir -i 0 $dir_mdt0 || error "lfs mkdir" + $LFS mkdir -i 1 $dir_mdt1 || error "lfs mkdir" + + # create 1 file in each MDT + local fid1=$(make_small $dir_mdt0/$tfile) + local fid2=$(make_small $dir_mdt1/$tfile) + + # check that hsm request on mdt0 is sent to the right MDS + $LFS hsm_archive $dir_mdt0/$tfile || error "lfs hsm_archive" + wait_request_state $fid1 ARCHIVE SUCCEED 0 && + echo "archive successful on mdt0" + + # check that hsm request on mdt1 is sent to the right MDS + $LFS hsm_archive $dir_mdt1/$tfile || error "lfs hsm_archive" + wait_request_state $fid2 ARCHIVE SUCCEED 1 && + echo "archive successful on mdt1" + + copytool_cleanup + # clean test files and directories + rm -rf $dir_mdt0 $dir_mdt1 +} +run_test 400 "Single request is sent to the right MDT" + +test_401() { + [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return + + copytool_setup + + mkdir -p $DIR/$tdir + + local dir_mdt0=$DIR/$tdir/mdt0 + local dir_mdt1=$DIR/$tdir/mdt1 + + # create 1 dir per MDT + $LFS mkdir -i 0 $dir_mdt0 || error "lfs mkdir" + $LFS mkdir -i 1 $dir_mdt1 || error "lfs mkdir" + + # create 1 file in each MDT + local fid1=$(make_small $dir_mdt0/$tfile) + local fid2=$(make_small $dir_mdt1/$tfile) + + # check that compound requests are shunt to the rights MDTs + $LFS hsm_archive $dir_mdt0/$tfile $dir_mdt1/$tfile || + error "lfs hsm_archive" + wait_request_state $fid1 ARCHIVE SUCCEED 0 && + echo "archive successful on mdt0" + wait_request_state $fid2 ARCHIVE SUCCEED 1 && + echo "archive successful on mdt1" + + copytool_cleanup + # clean test files and directories + rm -rf $dir_mdt0 $dir_mdt1 +} +run_test 401 "Compound requests split and sent to their respective MDTs" + +mdc_change_state() # facet, MDT_pattern, activate|deactivate +{ + local facet=$1 + local pattern="$2" + local state=$3 + local node=$(facet_active_host $facet) + local mdc + for mdc in $(do_facet $facet "$LCTL dl | grep -E ${pattern}-mdc" | + awk '{print $4}'); do + echo "$3 $mdc on $node" + do_facet $facet "$LCTL --device $mdc $state" || return 1 + done +} + +test_402() { + # make sure there is no running copytool + copytool_cleanup + + # deactivate all mdc on agent1 + mdc_change_state $SINGLEAGT "MDT000." "deactivate" + + copytool_setup $SINGLEAGT + + check_agent_unregistered "uuid" # match any agent + + # no expected running copytool + search_copytools $agent && error "Copytool start should have failed" + + # reactivate MDCs + mdc_change_state $SINGLEAGT "MDT000." "activate" +} +run_test 402 "Copytool start fails if all MDTs are inactive" + +test_403() { + [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return + + # make sure there is no running copytool + copytool_cleanup + + local agent=$(facet_active_host $SINGLEAGT) + local uuid=$(do_rpc_nodes $agent get_client_uuid | cut -d' ' -f2) + + # deactivate all mdc for MDT0001 + mdc_change_state $SINGLEAGT "MDT0001" "deactivate" + + copytool_setup + # check the agent is registered on MDT0000, and not on MDT0001 + check_agent_registered_by_mdt $uuid 0 + check_agent_unregistered_by_mdt $uuid 1 + + # check running copytool process + search_copytools $agent || error "No running copytools on $agent" + + # reactivate all mdc for MDT0001 + mdc_change_state $SINGLEAGT "MDT0001" "activate" + + # make sure the copytool is now registered to all MDTs + check_agent_registered $uuid + + copytool_cleanup +} +run_test 403 "Copytool starts with inactive MDT and register on reconnect" + +test_404() { + [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return + + copytool_setup + + # create files on both MDT0000 and MDT0001 + mkdir -p $DIR/$tdir + + local dir_mdt0=$DIR/$tdir/mdt0 + $LFS mkdir -i 0 $dir_mdt0 || error "lfs mkdir" + + # create 1 file on mdt0 + local fid1=$(make_small $dir_mdt0/$tfile) + + # deactivate all mdc for MDT0001 + mdc_change_state $SINGLEAGT "MDT0001" "deactivate" + + # send an HSM request for files in MDT0000 + $LFS hsm_archive $dir_mdt0/$tfile || error "lfs hsm_archive" + + # check for completion of files in MDT0000 + wait_request_state $fid1 ARCHIVE SUCCEED 0 && + echo "archive successful on mdt0" + + # reactivate all mdc for MDT0001 + mdc_change_state $SINGLEAGT "MDT0001" "activate" + + copytool_cleanup + # clean test files and directories + rm -rf $dir_mdt0 +} +run_test 404 "Inactive MDT does not block requests for active MDTs" + copytool_cleanup complete $SECONDS