Whamcloud - gitweb
LU-10070 lod: SEL: Repeated components
[fs/lustre-release.git] / lustre / tests / sanity-flr.sh
index 33732e3..d4bf66c 100644 (file)
@@ -5,21 +5,21 @@
 set -e
 set +o posix
 
-SRCDIR=$(dirname $0)
-export PATH=$PWD/$SRCDIR:$SRCDIR:$PWD/$SRCDIR/../utils:$PATH:/sbin
 
 ONLY=${ONLY:-"$*"}
-# Bug number for skipped test:    LU-11381
-ALWAYS_EXCEPT="$SANITY_FLR_EXCEPT 201"
-# UPDATE THE COMMENT ABOVE WITH BUG NUMBERS WHEN CHANGING ALWAYS_EXCEPT!
 
-LUSTRE=${LUSTRE:-$(cd $(dirname $0)/..; echo $PWD)}
+LUSTRE=${LUSTRE:-$(dirname $0)/..}
 . $LUSTRE/tests/test-framework.sh
 init_test_env $@
-. ${CONFIG:=$LUSTRE/tests/cfg/$NAME.sh}
-get_lustre_env
 init_logging
 
+ALWAYS_EXCEPT="$SANITY_FLR_EXCEPT "
+# Bug number for skipped test:    LU-11381
+ALWAYS_EXCEPT+="                  201"
+# UPDATE THE COMMENT ABOVE WITH BUG NUMBERS WHEN CHANGING ALWAYS_EXCEPT!
+
+build_test_filter
+
 [[ $(lustre_version_code $SINGLEMDS) -ge $(version_code 2.10.56) ]] ||
        { skip "Need MDS version at least 2.10.56"; exit 0; }
 
@@ -31,8 +31,6 @@ check_and_setup_lustre
 DIR=${DIR:-$MOUNT}
 assert_DIR
 
-build_test_filter
-
 assert_DIR
 rm -rf $DIR/[Rdfs][0-9]*
 
@@ -2288,6 +2286,405 @@ test_203() {
 }
 run_test 203 "mirror file preserve mirror ID"
 
+# Simple test of FLR + self-extending layout, SEL in non-primary mirror
+test_204a() {
+       [ $(lustre_version_code $SINGLEMDS) -lt $(version_code $SEL_VER) ] &&
+               skip "skipped for lustre < $SEL_VER"
+
+       local comp_file=$DIR/$tdir/$tfile
+       local flg_opts=""
+       local found=""
+
+       test_mkdir $DIR/$tdir
+
+       # first mirror is 0-10M, then 10M-(-1), second mirror is 1M followed
+       # by extension space to -1
+       $LFS setstripe -N -E 10M -E-1 -N -E 1M -E-1 -z64M $comp_file ||
+               error "Create $comp_file failed"
+
+       # Write to first component, extending & staling second mirror
+       dd if=/dev/zero bs=2M count=1 of=$comp_file conv=notrunc ||
+               error "dd to extend + stale failed"
+
+       $LFS getstripe $comp_file
+
+       flg_opts="--component-flags init,stale"
+       found=$($LFS find --component-end 65M $flg_opts $comp_file | wc -l)
+       [ $found -eq 1 ] || error "write: Second comp end incorrect"
+
+       flg_opts="--component-flags extension"
+       found=$($LFS find --component-start 65M $flg_opts $comp_file | wc -l)
+       [ $found -eq 1 ] || error "write: Third comp start incorrect"
+
+       # mirror resync should not change the extents
+       $LFS mirror resync $comp_file
+
+       flg_opts="--component-flags init"
+       found=$($LFS find --component-end 65M $flg_opts $comp_file | wc -l)
+       [ $found -eq 1 ] || error "resync: Second comp end incorrect"
+
+       flg_opts="--component-flags extension"
+       found=$($LFS find --component-start 65M $flg_opts $comp_file | wc -l)
+       [ $found -eq 1 ] || error "resync: Third comp start incorrect"
+
+       sel_layout_sanity $comp_file 5
+
+       rm -f $comp_file
+}
+run_test 204a "FLR write/stale/resync tests with self-extending mirror"
+
+# Simple test of FLR + self-extending layout, SEL in primary mirror
+test_204b() {
+       [ $(lustre_version_code $SINGLEMDS) -lt $(version_code $SEL_VER) ] &&
+               skip "skipped for lustre < $SEL_VER"
+
+       local comp_file=$DIR/$tdir/$tfile
+       local flg_opts=""
+       local found=""
+
+       test_mkdir $DIR/$tdir
+
+       # first mirror is 1M followed by extension space to -1, second mirror
+       # is 0-10M, then 10M-(-1),
+       $LFS setstripe -N -E 1M -E-1 -z64M -N -E 10M -E-1 $comp_file ||
+               error "Create $comp_file failed"
+
+       # Write to first component, extending first component & staling
+       # other mirror
+       dd if=/dev/zero bs=2M count=1 of=$comp_file conv=notrunc ||
+               error "dd to extend + stale failed"
+
+       $LFS getstripe $comp_file
+
+       flg_opts="--component-flags init"
+       found=$($LFS find --component-end 65M $flg_opts $comp_file | wc -l)
+       [ $found -eq 1 ] || error "write: First comp end incorrect"
+
+       flg_opts="--component-flags extension"
+       found=$($LFS find --component-start 65M $flg_opts $comp_file | wc -l)
+       [ $found -eq 1 ] || error "write: Second comp start incorrect"
+
+       flg_opts="--component-flags init,stale"
+       found=$($LFS find --component-end 10M $flg_opts $comp_file | wc -l)
+       [ $found -eq 1 ] || error "write: First mirror comp flags incorrect"
+
+       # This component is staled because it overlaps the extended first
+       # component of the primary mirror, even though it doesn't overlap
+       # the actual write - thus not inited.
+       flg_opts="--component-flags stale"
+       found=$($LFS find --component-start 10M $flg_opts $comp_file | wc -l)
+       [ $found -eq 1 ] || error "write: Second mirror comp flags incorrect"
+
+       # mirror resync should not change the extents
+       $LFS mirror resync $comp_file
+
+       $LFS getstripe $comp_file
+
+       flg_opts="--component-flags init"
+       found=$($LFS find --component-end 65M $flg_opts $comp_file | wc -l)
+       [ $found -eq 1 ] || error "resync: First comp end incorrect"
+
+       flg_opts="--component-flags extension"
+       found=$($LFS find --component-start 65M $flg_opts $comp_file | wc -l)
+       [ $found -eq 1 ] || error "resync: Second comp start incorrect"
+
+       flg_opts="--component-flags init"
+       found=$($LFS find --component-end 10M $flg_opts $comp_file | wc -l)
+       [ $found -eq 1 ] || error "resync: First mirror comp flags incorrect"
+
+       flg_opts="--component-flags init"
+       found=$($LFS find --component-start 10M $flg_opts $comp_file | wc -l)
+       [ $found -eq 1 ] || error "resync: Second mirror comp flags incorrect"
+
+       sel_layout_sanity $comp_file 5
+
+       rm -f $comp_file
+}
+run_test 204b "FLR write/stale/resync tests with self-extending primary"
+
+# FLR + SEL failed extension & component removal
+# extension space in second mirror
+test_204c() {
+       [ $OSTCOUNT -lt 2 ] && skip "needs >= 2 OSTs" && return
+       [ $(lustre_version_code $SINGLEMDS) -lt $(version_code $SEL_VER) ] &&
+               skip "skipped for lustre < $SEL_VER"
+
+       local comp_file=$DIR/$tdir/$tfile
+       local found=""
+       local ost_idx1=0
+       local ost_name=$(ostname_from_index $ost_idx1)
+
+       test_mkdir $DIR/$tdir
+
+       # first mirror is is 0-10M, then 10M-(-1), second mirror is 0-1M, then
+       # extension space from 1M to 1G, then normal space to -1
+       $LFS setstripe -N -E 10M -E-1 -N -E 1M -E 1G -i $ost_idx1 -z 64M \
+               -E -1 $comp_file || error "Create $comp_file failed"
+
+       do_facet ost1 $LCTL set_param -n obdfilter.$ost_name.degraded=1
+       sleep_maxage
+
+       # write to first comp (0 - 10M) of mirror 1, extending + staling
+       # first + second comp of mirror 2
+       dd if=/dev/zero bs=2M count=1 of=$comp_file conv=notrunc
+       RC=$?
+
+       do_facet ost1 $LCTL set_param -n obdfilter.$ost_name.degraded=0
+       sleep_maxage
+
+       [ $RC -eq 0 ] || error "dd to extend + stale failed"
+
+       $LFS getstripe $comp_file
+
+       found=$($LFS find --component-start 0m --component-end 1m \
+               --comp-flags init,stale $comp_file | wc -l)
+       [ $found -eq 1 ] || error "write: First mirror comp incorrect"
+
+       found=$($LFS find --component-start 1m --component-end EOF \
+               --comp-flags stale,^init $comp_file | wc -l)
+       [ $found -eq 1 ] || error "write: Second mirror comp incorrect"
+
+       local mirror_id=$($LFS getstripe --component-start=1m   \
+                        --component-end=EOF $comp_file |       \
+                        grep lcme_mirror_id | awk '{ print $2 }')
+
+       [[ $mirror_id -eq 2 ]] ||
+               error "component not in correct mirror? $mirror_id"
+
+       $LFS mirror resync $comp_file
+
+       $LFS getstripe $comp_file
+
+       # component dimensions should not change from resync
+       found=$($LFS find --component-start 1m --component-end EOF \
+               --component-flags init $comp_file | wc -l)
+       [ $found -eq 1 ] || error "resync: Second mirror comp incorrect"
+
+       sel_layout_sanity $comp_file 4
+
+       rm -f $comp_file
+}
+run_test 204c "FLR write/stale/resync test with component removal"
+
+# Successful repeated component in primary mirror
+test_204d() {
+       [ $OSTCOUNT -lt 2 ] && skip "needs >= 2 OSTs" && return
+       [ $(lustre_version_code $SINGLEMDS) -lt $(version_code $SEL_VER) ] &&
+               skip "skipped for lustre < $SEL_VERSION"
+
+       local comp_file=$DIR/$tdir/$tfile
+       local found=""
+
+       wait_delete_completed
+       wait_mds_ost_sync
+       test_mkdir $DIR/$tdir
+
+       # first mirror is 64M followed by extension space to -1, second mirror
+       # is 0-10M, then 10M-(-1)
+       $LFS setstripe -N -E-1 -z64M -N -E 10M -E-1 $comp_file ||
+               error "Create $comp_file failed"
+
+       local ost_idx1=$($LFS getstripe -I65537 -i $comp_file)
+       local ost_name=$(ostname_from_index $ost_idx1)
+       # degrade OST for first comp so we won't extend there
+       do_facet ost$((ost_idx1+1)) $LCTL set_param -n \
+               obdfilter.$ost_name.degraded=1
+       sleep_maxage
+
+       # Write beyond first component, causing repeat & stale second mirror
+       dd if=/dev/zero bs=1M count=1 seek=66 of=$comp_file conv=notrunc
+       RC=$?
+
+       do_facet ost$((ost_idx1+1)) $LCTL set_param -n \
+               obdfilter.$ost_name.degraded=0
+       sleep_maxage
+
+       [ $RC -eq 0 ] || error "dd to repeat & stale failed"
+
+       $LFS getstripe $comp_file
+
+       found=$($LFS find --component-start 64m --component-end 128m \
+               --component-flags init $comp_file | wc -l)
+       [ $found -eq 1 ] || error "write: Repeat comp incorrect"
+
+       local ost_idx2=$($LFS getstripe --component-start=64m           \
+                        --component-end=128m --component-flags=init    \
+                        -i $comp_file)
+       [[ $ost_idx1 -eq $ost_idx2 ]] && error "$ost_idx1 == $ost_idx2"
+       local mirror_id=$($LFS getstripe --component-start=64m          \
+                        --component-end=128m --component-flags=init    \
+                        $comp_file | grep lcme_mirror_id | awk '{ print $2 }')
+       [[ $mirror_id -eq 1 ]] ||
+               error "component not in correct mirror: $mirror_id, not 1"
+
+       $LFS mirror resync $comp_file
+
+       $LFS getstripe $comp_file
+
+       # component dimensions should not change from resync
+       found=$($LFS find --component-start 0m --component-end 64m \
+               --component-flags init $comp_file | wc -l)
+       [ $found -eq 1 ] || error "resync: first comp incorrect"
+       found=$($LFS find --component-start 64m --component-end 128m \
+               --component-flags init $comp_file | wc -l)
+       [ $found -eq 1 ] || error "resync: repeat comp incorrect"
+
+       sel_layout_sanity $comp_file 5
+
+       rm -f $comp_file
+}
+run_test 204d "FLR write/stale/resync sel test with repeated comp"
+
+# Successful repeated component, SEL in non-primary mirror
+test_204e() {
+       [ $OSTCOUNT -lt 2 ] && skip "needs >= 2 OSTs" && return
+       [ $(lustre_version_code $SINGLEMDS) -lt $(version_code $SEL_VER) ] &&
+               skip "skipped for lustre < $SEL_VERSION"
+
+       local comp_file=$DIR/$tdir/$tfile
+       local found=""
+
+       wait_delete_completed
+       wait_mds_ost_sync
+
+       test_mkdir $DIR/$tdir
+
+       # first mirror is is 0-100M, then 100M-(-1), second mirror is extension
+       # space to -1 (-z 64M, so first comp is 0-64M)
+       # Note: we have to place both 1st components on OST0, otherwise 2 OSTs
+       # will be not enough - one will be degraded, the other is used on
+       # an overlapping mirror.
+       $LFS setstripe -N -E 100M -i 0 -E-1 -N -E-1 -i 0 -z 64M $comp_file ||
+               error "Create $comp_file failed"
+
+       local ost_idx1=$($LFS getstripe --component-start=0 \
+                        --component-end=64m -i $comp_file)
+       local ost_name=$(ostname_from_index $ost_idx1)
+       # degrade OST for first comp of 2nd mirror so we won't extend there
+       do_facet ost$((ost_idx1+1)) $LCTL set_param -n \
+               obdfilter.$ost_name.degraded=1
+       sleep_maxage
+
+       $LFS getstripe $comp_file
+
+       # Write to first component, stale & instantiate second mirror components
+       # overlapping with the written component (0-100M);
+       dd if=/dev/zero bs=2M count=1 of=$comp_file conv=notrunc
+       RC=$?
+
+       do_facet ost$((ost_idx1+1)) $LCTL set_param -n \
+               obdfilter.$ost_name.degraded=0
+       sleep_maxage
+       $LFS getstripe $comp_file
+
+       [ $RC -eq 0 ] || error "dd to repeat & stale failed"
+
+       found=$($LFS find --component-start 0m --component-end 64m \
+               --component-flags init,stale $comp_file | wc -l)
+       [ $found -eq 1 ] || error "write: first comp incorrect"
+
+       # was repeated due to degraded ost
+       found=$($LFS find --component-start 64m --component-end 128m \
+               --component-flags init,stale $comp_file | wc -l)
+       [ $found -eq 1 ] || error "write: repeated comp incorrect"
+
+       local ost_idx2=$($LFS getstripe --component-start=64m           \
+                        --component-end=128m --component-flags=init    \
+                        -i $comp_file)
+       [[ $ost_idx1 -eq $ost_idx2 ]] && error "$ost_idx1 == $ost_idx2"
+       local mirror_id=$($LFS getstripe --component-start=0m           \
+                        --component-end=64m --component-flags=init     \
+                        $comp_file | grep lcme_mirror_id | awk '{ print $2 }')
+       [[ $mirror_id -eq 2 ]] ||
+               error "component not in correct mirror? $mirror_id"
+
+       $LFS mirror resync $comp_file
+
+       $LFS getstripe $comp_file
+
+       # component dimensions should not change from resync
+       found=$($LFS find --component-start 0m --component-end 64m \
+               --component-flags init,^stale $comp_file | wc -l)
+       [ $found -eq 1 ] || error "resync: first comp incorrect"
+       found=$($LFS find --component-start 64m --component-end 128m \
+               --component-flags init,^stale $comp_file | wc -l)
+       [ $found -eq 1 ] || error "resync: repeated comp incorrect"
+
+       sel_layout_sanity $comp_file 5
+
+       rm -f $comp_file
+}
+run_test 204e "FLR write/stale/resync sel test with repeated comp"
+
+# FLR + SEL: failed repeated component, SEL in non-primary mirror
+test_204f() {
+       [ $OSTCOUNT -lt 2 ] && skip "needs >= 2 OSTs" && return
+       [ $(lustre_version_code $SINGLEMDS) -lt $(version_code $SEL_VER) ] &&
+               skip "skipped for lustre < $SEL_VERSION"
+
+       local comp_file=$DIR/$tdir/$tfile
+       local found=""
+
+       wait_delete_completed
+       wait_mds_ost_sync
+       test_mkdir $DIR/$tdir
+
+       pool_add $TESTNAME || error "Pool creation failed"
+       pool_add_targets $TESTNAME 0 1 || error "Pool add targets failed"
+
+       # first mirror is is 0-100M, then 100M-(-1), second mirror is extension
+       # space to -1 (-z 64M, so first comp is 0-64M)
+       $LFS setstripe -N -E 100M -E-1 -N --pool="$TESTNAME" \
+               -E-1 -c 1 -z 64M $comp_file || error "Create $comp_file failed"
+
+       local ost_name0=$(ostname_from_index 0)
+       local ost_name1=$(ostname_from_index 1)
+
+       # degrade both OSTs in pool, so we'll try to repeat, then fail and
+       # extend original comp
+       do_facet ost1 $LCTL set_param -n obdfilter.$ost_name0.degraded=1
+       do_facet ost2 $LCTL set_param -n obdfilter.$ost_name1.degraded=1
+       sleep_maxage
+
+       # a write to the 1st component, 100M length, which will try to stale
+       # the first 100M of mirror 2, attempting to extend its 0-64M component
+       dd if=/dev/zero bs=2M count=1 of=$comp_file conv=notrunc
+       RC=$?
+
+       do_facet ost1 $LCTL set_param -n obdfilter.$ost_name0.degraded=0
+       do_facet ost2 $LCTL set_param -n obdfilter.$ost_name1.degraded=0
+       sleep_maxage
+
+       [ $RC -eq 0 ] || error "dd to extend mirror comp failed"
+
+       $LFS getstripe $comp_file
+
+       found=$($LFS find --component-start 0m --component-end 128m \
+               --component-flags init,stale $comp_file | wc -l)
+       [ $found -eq 1 ] || error "write: First mirror comp incorrect"
+
+       local mirror_id=$($LFS getstripe --component-start=0m           \
+                        --component-end=128m --component-flags=init    \
+                        $comp_file | grep lcme_mirror_id | awk '{ print $2 }')
+
+       [[ $mirror_id -eq 2 ]] ||
+               error "component not in correct mirror? $mirror_id, not 2"
+
+       $LFS mirror resync $comp_file
+
+       $LFS getstripe $comp_file
+
+       # component dimensions should not change from resync
+       found=$($LFS find --component-start 0m --component-end 128m \
+               --component-flags init,^stale $comp_file | wc -l)
+       [ $found -eq 1 ] || error "resync: First mirror comp incorrect"
+
+       sel_layout_sanity $comp_file 4
+
+       rm -f $comp_file
+}
+run_test 204f "FLR write/stale/resync sel w/forced extension"
+
 complete $SECONDS
 check_and_cleanup_lustre
 exit_status