verify_comp_attr_with_parent pool $tf $comp_id
}
+verify_flr_state()
+{
+ local tf=$1
+ local expected_state=$2
+
+ local state=$($LFS getstripe -v $tf | awk '/lcm_flags/{ print $2 }')
+ [ $expected_state = $state ] ||
+ error "expected: $expected_state, actual $state"
+}
+
# command line test cases
test_0a() {
local td=$DIR/$tdir
verify_comp_attr stripe-count $tf ${ids[5]} $OSTCOUNT
verify_comp_attr_with_parent pool $tf ${ids[5]}
+ if [[ $MDS1_VERSION -ge $(version_code 2.12.56) ]] ||
+ [[ $MDS1_VERSION -ge $(version_code 2.12.2) &&
+ $MDS1_VERSION -lt $(version_code 2.12.50) ]]; then
+ # LU-11022 - remove mirror by pool name
+ local=cnt cnt=$($LFS getstripe $tf | grep archive | wc -l)
+ [ "$cnt" != "1" ] && error "unexpected mirror count $cnt"
+ $LFS mirror split --pool archive -d $tf || error "delete mirror"
+ cnt=$($LFS getstripe $tf | grep archive | wc -l)
+ [ "$cnt" != "0" ] && error "mirror count after removal: $cnt"
+ fi
+
# destroy OST pool
destroy_test_pools
}
cat $tf &> /dev/null || error "error reading file '$tf'"
# verify that the data was provided by OST1 where mirror 1 resides
- local nr_read=$($LCTL get_param -n osc.$FSNAME-OST0000-osc-ffff*.stats |
+ local nr_read=$($LCTL get_param -n osc.$FSNAME-OST0000-osc-[-0-9a-f]*.stats |
awk '/ost_read/{print $2}')
[ -n "$nr_read" ] || error "read was not provided by OST1"
}
error "error setting flag prefer"
verify_comp_attr lcme_flags $tf 0x20003 prefer
+
+ $LFS setstripe --comp-set -I 0x20003 --comp-flags=^prefer $tf ||
+ error "error clearing prefer flag from component 0x20003"
+
+ # MDS disallows setting stale flag on the last non-stale mirror
+ [[ $MDS1_VERSION -ge $(version_code 2.12.57) ]] ||
+ [[ $MDS1_VERSION -ge $(version_code 2.12.2) &&
+ $MDS1_VERSION -lt $(version_code 2.12.50) ]] || return 0
+
+ cp /etc/hosts $tf || error "error writing file '$tf'"
+
+ verify_comp_attr lcme_flags $tf 0x10002 prefer
+ verify_comp_attr lcme_flags $tf 0x20003 stale
+ verify_comp_attr lcme_flags $tf 0x30004 stale
+
+ ! $LFS setstripe --comp-set -I 0x10002 --comp-flags=^prefer,stale $tf \
+ > /dev/null 2>&1 ||
+ error "setting stale flag on component 0x10002 should fail"
+
+ $LFS mirror resync $tf || error "error resync-ing file '$tf'"
+
+ $LFS setstripe --comp-set -I 0x10001 --comp-flags=stale $tf ||
+ error "error setting stale flag on component 0x10001"
+ $LFS setstripe --comp-set -I 0x20003 --comp-flags=stale $tf ||
+ error "error setting stale flag on component 0x20003"
+
+ ! $LFS setstripe --comp-set -I 0x30004 --comp-flags=stale $tf \
+ > /dev/null 2>&1 ||
+ error "setting stale flag on component 0x30004 should fail"
+
+ $LFS mirror resync $tf || error "error resync-ing file '$tf'"
}
run_test 0h "set, clear and test flags for FLR files"
local osc_name
local count
- osc_name=${FSNAME}-OST$(printf "%04x" $((idx-1)))-osc-'ffff*'
+ osc_name=${FSNAME}-OST$(printf "%04x" $((idx-1)))-osc-'[-0-9a-f]*'
count=$($LCTL get_param -n ldlm.namespaces.$osc_name.lock_count)
lock_count=$((lock_count + count))
done
}
run_test 32 "data should be mirrored to newly created mirror"
-test_33() {
+test_33a() {
[[ $OSTCOUNT -lt 2 ]] && skip "need >= 2 OSTs" && return
rm -f $DIR/$tfile $DIR/$tfile-2
start_osts 1
# read file again with ost2 failed
- $LCTL set_param ldlm.namespaces.lustre-*-osc-ffff*.lru_size=clear
-
- fail ost2 &
- sleep 1
+ stop_osts 2
+ drop_client_cache
# check size, glimpse should work
$CHECKSTAT -t file -s $fsize $DIR/$tfile ||
[[ "$rs" == "ost1" ]] ||
error "file content error: expected: \"ost1\", actual: \"$rs\""
+ start_osts 2
+}
+run_test 33a "read can choose available mirror to read"
+
+test_33b() {
+ [[ $OSTCOUNT -lt 2 ]] && skip "need >= 2 OSTs" && return
+
+ rm -f $DIR/$tfile
+
+ stack_trap "rm -f $DIR/$tfile" EXIT
+
+ # create a file with two mirrors on OST0000 and OST0001
+ $LFS setstripe -N -Eeof -o0 -N -Eeof -o1 $DIR/$tfile
+
+ # make sure that $tfile has two mirrors
+ [ $($LFS getstripe -N $DIR/$tfile) -eq 2 ] ||
+ { $LFS getstripe $DIR/$tfile; error "expected count 2"; }
+
+ # write 50M
+ dd if=/dev/urandom of=$DIR/$tfile bs=2M count=25 ||
+ error "write failed for $DIR/$tfile"
+ $LFS mirror resync $DIR/$tfile || error "resync failed for $DIR/$tfile"
+ verify_flr_state $DIR/$tfile "ro"
+ drop_client_cache
+
+ ls -l $DIR/$tfile
+
+ # read file - all OSTs are available
+ echo "reading file (data can be provided by any ost)... "
+ local t1=$SECONDS
+ time cat $DIR/$tfile > /dev/null || error "read all"
+ local t2=$SECONDS
+ ra=$((t2 - t1))
+
+ # read file again with ost1 {OST0000} failed
+ stop_osts 1
+ drop_client_cache
+ echo "reading file (data should be provided by ost2)..."
+ t1=$SECONDS
+ time cat $DIR/$tfile > /dev/null || error "read ost2"
+ t2=$SECONDS
+ r1=$((t2 - t1))
+
+ # remount ost1
+ start_osts 1
+
+ # read file again with ost2 {OST0001} failed
+ stop_osts 2
+ drop_client_cache
+
+ echo "reading file (data should be provided by ost1)..."
+ t1=$SECONDS
+ time cat $DIR/$tfile > /dev/null || error "read ost1"
+ t2=$SECONDS
+ r2=$((t2 - t1))
+
+ # remount ost2
+ start_osts 2
+
+ [ $((r1 * 100)) -gt $((ra * 105)) -a $r1 -gt $((ra + 2)) ] &&
+ error "read mirror too slow without ost1, from $ra to $r1"
+ [ $((r2 * 100)) -gt $((ra * 105)) -a $r2 -gt $((ra + 2)) ] &&
+ error "read mirror too slow without ost2, from $ra to $r2"
+
wait_osc_import_ready client ost2
}
-run_test 33 "read can choose available mirror to read"
+run_test 33b "avoid reading from unhealthy mirror"
+
+test_33c() {
+ [[ $OSTCOUNT -lt 3 ]] && skip "need >= 3 OSTs" && return
+
+ rm -f $DIR/$tfile
+
+ stack_trap "rm -f $DIR/$tfile" EXIT
+
+ # create a file with two mirrors
+ # mirror1: {OST0000, OST0001}
+ # mirror2: {OST0001, OST0002}
+ $LFS setstripe -N -Eeof -c2 -o0,1 -N -Eeof -c2 -o1,2 $DIR/$tfile
+
+ # make sure that $tfile has two mirrors
+ [ $($LFS getstripe -N $DIR/$tfile) -eq 2 ] ||
+ { $LFS getstripe $DIR/$tfile; error "expected count 2"; }
+
+ # write 50M
+ dd if=/dev/urandom of=$DIR/$tfile bs=2M count=25 ||
+ error "write failed for $DIR/$tfile"
+ $LFS mirror resync $DIR/$tfile || error "resync failed for $DIR/$tfile"
+ verify_flr_state $DIR/$tfile "ro"
+ drop_client_cache
+
+ ls -l $DIR/$tfile
+
+ # read file - all OSTs are available
+ echo "reading file (data can be provided by any ost)... "
+ time cat $DIR/$tfile > /dev/null || error "read all"
+
+ # read file again with ost2 (OST0001) failed
+ stop_osts 2
+ drop_client_cache
+
+ echo "reading file (data should be provided by ost1 and ost3)..."
+ time cat $DIR/$tfile > /dev/null || error "read ost1 & ost3"
+
+ # remount ost2
+ start_osts 2
+
+ wait_osc_import_ready client ost2
+}
+run_test 33c "keep reading among unhealthy mirrors"
test_34a() {
[[ $OSTCOUNT -lt 4 ]] && skip "need >= 4 OSTs" && return
local osts=$(comma_list $(osts_nodes))
- # define OBD_FAIL_OST_SKIP_LV_CHECK 0x241
- do_nodes $osts lctl set_param fail_loc=0x241
+ if [[ $MDS1_VERSION -lt $(version_code 2.12.3) ]]; then
+ # define OBD_FAIL_OST_SKIP_LV_CHECK 0x241
+ do_nodes $osts lctl set_param fail_loc=0x241
- mirror_io copy -i ${mirror_array[0]} \
- -t $(echo ${mirror_array[@]:1} | tr ' ' ',') $tf ||
- error "mirror copy error"
+ mirror_io copy -i ${mirror_array[0]} \
+ -t $(echo ${mirror_array[@]:1} | tr ' ' ',') $tf ||
+ error "mirror copy error"
- do_nodes $osts lctl set_param fail_loc=0
+ do_nodes $osts lctl set_param fail_loc=0
+ elif [[ $MDS1_VERSION -lt $(version_code 2.12.50) ||
+ $MDS1_VERSION -gt $(version_code 2.12.52) ]]; then
+ $LFS mirror copy -i ${mirror_array[0]} -o-1 $tf ||
+ error "mirror copy error"
+ fi
# verify copying is successful by checking checksums
remount_client $MOUNT
for i in ${mirror_array[@]}; do
sum=$($LFS mirror read -N $i $tf | md5sum)
[ "$sum" = "${checksums[1]}" ] ||
- error "$i: mismatch checksum after copy"
+ error "$i: mismatch checksum after copy \'$sum\'"
done
rm -f $tf
}
run_test 37 "mirror I/O API verification"
-verify_flr_state()
-{
- local tf=$1
- local expected_state=$2
-
- local state=$($LFS getstripe -v $tf | awk '/lcm_flags/{ print $2 }')
- [ $expected_state = $state ] ||
- error "expected: $expected_state, actual $state"
-}
-
test_38() {
local tf=$DIR/$tfile
local ref=$DIR/${tfile}-ref
verify_flr_state $tf "wp"
+ # disallow destroying the last non-stale mirror
+ ! $LFS mirror split --mirror-id 1 -d $tf > /dev/null 2>&1 ||
+ error "destroying mirror 1 should fail"
+
# synchronize all mirrors of the file
$LFS mirror resync $tf || error "mirror resync $tf failed"
verify_mirror_count $tf 2
verify_mirror_count $tf.mirror~2 1
+ $LFS setstripe --comp-set -I 0x30008 --comp-flags=stale $tf ||
+ error "setting stale flag on component 0x30008 failed"
+
+ # disallow destroying the last non-stale mirror
+ ! $LFS mirror split --mirror-id 4 -d $tf > /dev/null 2>&1 ||
+ error "destroying mirror 4 should fail"
+
+ $LFS mirror resync $tf || error "resynchronizing $tf failed"
+
$LFS mirror split --mirror-id 3 -d $tf ||
- error "split and delte mirror 3 failed"
+ error "destroying mirror 3 failed"
verify_mirror_count $tf 1
# verify splitted file contains the same content as the orig file does