X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Ftests%2Fsanity-pfl.sh;h=106842bd73ed08aa8514fe1993855141dad36b7d;hb=3043c6f18964b0cc843b2e7866756a1d1ddd61e3;hp=e6f709cfc1947fd908119137feb9834c9adbc6ee;hpb=4eca26ddab3186a68888862218fa8904f812e5a1;p=fs%2Flustre-release.git diff --git a/lustre/tests/sanity-pfl.sh b/lustre/tests/sanity-pfl.sh index e6f709c..106842b 100644 --- a/lustre/tests/sanity-pfl.sh +++ b/lustre/tests/sanity-pfl.sh @@ -19,7 +19,7 @@ build_test_filter check_and_setup_lustre -if [[ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.9.51) ]]; then +if [[ "$MDS1_VERSION" -lt $(version_code 2.9.51) ]]; then skip_env "Need MDS version at least 2.9.51" fi @@ -528,7 +528,8 @@ test_11() { [[ -n $f4 ]] && error "1: 4th component instantiated" # the first 2 components instantiated - $TRUNCATE $comp_file $((1024*1024*1+1)) + # Truncate to exact start of new component - LU-12586 + $TRUNCATE $comp_file $((1024*1024*1)) f2=$($LFS getstripe -I2 $comp_file | grep "l_fid") [[ -z $f2 ]] && error "2: 2nd component uninstantiated" @@ -538,7 +539,7 @@ test_11() { [[ -n $f4 ]] && error "2: 4th component instantiated" # the first 3 components instantiated - $TRUNCATE $comp_file $((1024*1024*3)) + $TRUNCATE $comp_file $((1024*1024*3 - 1)) $TRUNCATE $comp_file $((1024*1024*1+1)) f2=$($LFS getstripe -I2 $comp_file | grep "l_fid") @@ -674,7 +675,7 @@ test_15() { $LFS setstripe -E 1M -S 1M -E 10M -E eof $parent/f1 || error "create f1" $LFS setstripe -E 4M -E 20M -E eof $parent/f2 || error "create f2" test_mkdir $parent/subdir - $LFS setstripe -E 6M -S 1M -E 30M -E eof $parent/subdir || + $LFS setstripe -E 6M -S 1M -c1 -E 30M -c4 -E eof -c -1 $parent/subdir || error "setstripe to subdir" $LFS setstripe -E 8M -E eof $parent/subdir/f3 || error "create f3" $LFS setstripe -c 1 $parent/subdir/f4 || error "create f4" @@ -724,6 +725,15 @@ test_15() { found=$($LFS find $ext_opts ! $cnt_opts $flg_opts $parent | wc -l) [ $found -eq 2 ] || error "start-1M, end+5M, !count+2, flag=init, $found != 2" + + # check last component stripe count + if [ $OSTCOUNT -gt 1 ]; then + touch $parent/subdir/f5 + $TRUNCATE $parent/subdir/f5 $((32*1024*1024)) + found=$($LFS find $parent/subdir -c $OSTCOUNT) + [[ "$found" == "$parent/subdir/f5" ]] || + error "got '$found' with stripe_count=$OSTCOUNT, not f5" + fi } run_test 15 "Verify component options for lfs find" @@ -974,7 +984,52 @@ test19_io_base() { flg_opts="--comp-flags extension" found=$($LFS find --comp-start 128M -E EOF $flg_opts $comp_file | wc -l) - [ $found -eq 1 ] || error "Write: Second component not found" + [ $found -eq 1 ] || error "Write: second component not found" + + found=$($LFS find -z 64M $comp_file | wc -l) + [ $found -eq 1 ] || error "component not found by ext size" + + found=$($LFS find --extension-size +63M $comp_file | wc -l) + [ $found -eq 1 ] || error "component not found by +ext size" + + found=$($LFS find --ext-size -65M $comp_file | wc -l) + [ $found -eq 1 ] || error "component not found by -ext size" + + found=$($LFS find -z 65M $comp_file | wc -l) + [ $found -eq 0 ] || error "component found by wrong ext size" + + found=$($LFS find -z +65M $comp_file | wc -l) + [ $found -eq 0 ] || error "component found by wrong +ext size" + + found=$($LFS find -z -63M $comp_file | wc -l) + [ $found -eq 0 ] || error "component found by wrong -ext size" + + found=$($LFS find ! -z 64M $comp_file | wc -l) + [ $found -eq 0 ] || error "component found by negation of ext size" + + found=$($LFS find ! -z +63M $comp_file | wc -l) + [ $found -eq 0 ] || error "component found by negation of +ext size" + + found=$($LFS find ! -z -65M $comp_file | wc -l) + [ $found -eq 0 ] || error "component found by negation of -ext size" + + found=$($LFS find ! -z 65M $comp_file | wc -l) + [ $found -eq 1 ] || + error "component not found by negation of wrong ext size" + + found=$($LFS find ! -z +65M $comp_file | wc -l) + [ $found -eq 1 ] || + error "component not found by negation of wrong +ext size" + + found=$($LFS find ! -z -63M $comp_file | wc -l) + [ $found -eq 1 ] || + error "component not found by negation of wrong -ext size" + + found=$($LFS find -S +1M $comp_file | wc -l) + [ $found -eq 0 ] || error "component found by wrong +stripe size" + + found=$($LFS find -c 1 $comp_file | wc -l) + [ $found -eq 1 ] || error "component not found by stripe count" small_write $comp_file $rw_len || error "Verify RW failed" @@ -983,8 +1038,8 @@ test19_io_base() { # Self-extending PFL tests test_19a() { - [ $OSTCOUNT -lt 2 ] && skip "needs >= 2 OSTs" && return - [ $(lustre_version_code $SINGLEMDS) -lt $(version_code $SEL_VER) ] && + [ $OSTCOUNT -lt 2 ] && skip "needs >= 2 OSTs" + [ "$MDS1_VERSION" -lt $(version_code $SEL_VER) ] && skip "skipped for lustre < $SEL_VER" test19_io_base $DIR/$tdir/$tfile @@ -993,11 +1048,12 @@ run_test 19a "Simple test of extension behavior" # Same as 19a, but with default layout set on directory rather than on file test_19b() { - [ $OSTCOUNT -lt 2 ] && skip "needs >= 2 OSTs" && return - [ $(lustre_version_code $SINGLEMDS) -lt $(version_code $SEL_VER) ] && + [ $OSTCOUNT -lt 2 ] && skip "needs >= 2 OSTs" + [ "$MDS1_VERSION" -lt $(version_code $SEL_VER) ] && skip "skipped for lustre < $SEL_VER" local comp_file=$DIR/$tdir/$tfile + local comp_dir=$DIR/$tdir/$tdir local flg_opts="" local found="" @@ -1005,15 +1061,24 @@ test_19b() { $LFS setstripe --ext-size 64M -c 1 -E -1 $DIR/$tdir || error "Setstripe on $DIR/$tdir failed" + # check inheritance for a sub-dir and a file + test_mkdir $comp_dir + found=$($LFS find --comp-start 0 -E 64M $comp_dir | wc -l) + [ $found -eq 1 ] || error "Dir Inheritance: wrong first component size" + + flg_opts="--comp-flags extension" + found=$($LFS find --comp-start 64M -E EOF $flg_opts $comp_dir | wc -l) + [ $found -eq 1 ] || error "Dir Inheritance: Second component not found" + touch $comp_file flg_opts="--comp-flags init" found=$($LFS find --comp-start 0 -E 64M $flg_opts $comp_file | wc -l) - [ $found -eq 1 ] || error "Inheritance: wrong first component size" + [ $found -eq 1 ] || error "File Inheritance: wrong first component size" flg_opts="--comp-flags extension" found=$($LFS find --comp-start 64M -E EOF $flg_opts $comp_file | wc -l) - [ $found -eq 1 ] || error "Inheritance: Second component not found" + [ $found -eq 1 ] || error "File Inheritance: Second component not found" test19_io_base $comp_file 1 } @@ -1021,8 +1086,8 @@ run_test 19b "Simple test of SEL as default layout" # Test behavior when seeking deep in a file test_19c() { - [ $OSTCOUNT -lt 2 ] && skip "needs >= 2 OSTs" && return - [ $(lustre_version_code $SINGLEMDS) -lt $(version_code $SEL_VER) ] && + [ $OSTCOUNT -lt 2 ] && skip "needs >= 2 OSTs" + [ "$MDS1_VERSION" -lt $(version_code $SEL_VER) ] && skip "skipped for lustre < $SEL_VER" local comp_file=$DIR/$tdir/$tfile @@ -1084,8 +1149,8 @@ test_19c() { run_test 19c "Test self-extending layout seeking behavior" test_19d() { - [ $OSTCOUNT -lt 2 ] && skip "needs >= 2 OSTs" && return - [ $(lustre_version_code $SINGLEMDS) -lt $(version_code $SEL_VER) ] && + [ $OSTCOUNT -lt 2 ] && skip "needs >= 2 OSTs" + [ "$MDS1_VERSION" -lt $(version_code $SEL_VER) ] && skip "skipped for lustre < $SEL_VER" local comp_file=$DIR/$tdir/$tfile @@ -1138,8 +1203,8 @@ test_19e_check() { } test_19e() { - [ $OSTCOUNT -lt 2 ] && skip "needs >= 2 OSTs" && return - [ $(lustre_version_code $SINGLEMDS) -lt $(version_code $SEL_VER) ] && + [ $OSTCOUNT -lt 2 ] && skip "needs >= 2 OSTs" + [ "$MDS1_VERSION" -lt $(version_code $SEL_VER) ] && skip "skipped for lustre < $SEL_VER" local comp_file=$DIR/$tdir/$tfile @@ -1193,8 +1258,8 @@ test_19e() { run_test 19e "Replay of layout instantiation & extension" test_19f() { - [ $OSTCOUNT -lt 2 ] && skip "needs >= 2 OSTs" && return - [ $(lustre_version_code $SINGLEMDS) -lt $(version_code $SEL_VER) ] && + [ $OSTCOUNT -lt 2 ] && skip "needs >= 2 OSTs" + [ "$MDS1_VERSION" -lt $(version_code $SEL_VER) ] && skip "skipped for lustre < $SEL_VER" local comp_file=$DIR/$tdir/$tfile @@ -1210,10 +1275,86 @@ test_19f() { } run_test 19f "Rejection of invalid layouts" +test_19g() { + [ $OSTCOUNT -lt 2 ] && skip "needs >= 2 OSTs" + [ "$MDS1_VERSION" -lt $(version_code $SEL_VER) ] && + skip "skipped for lustre < $SEL_VER" + + local file1=$DIR/${tfile}-1 + local file2=$DIR/${tfile}-2 + + test_mkdir -p $DIR/$tdir + multiop $file1 oO_RDWR:O_CREAT:O_LOV_DELAY_CREATE:c || + error "create failed $file1" + multiop $file2 oO_RDWR:O_CREAT:O_LOV_DELAY_CREATE:c || + error "create failed $file2" + + $LFS setstripe --component-add -E 1G -c 1 $file1 || + error "comp-add [0,1G] failed $file1" + $LFS setstripe --component-add -E 512M -z 128M $file1 && + error "comp-add [1G,1G],SEL[1G,512M] succeded $file1" + $LFS setstripe --component-add -E 10G -z 128M $file1 || + error "comp-add [1G,1G],SEL[1G,10G] failed $file1" + $LFS setstripe --component-add -E -1 $file1 || + error "comp-add [10G,-1] failed $file1" + + $LFS setstripe --component-add -E 1G -z 32M -c 1 $file2 && + error "comp-add with smal ext size succeeded $file1" + $LFS setstripe --component-add -E 1G -z 100M -c 1 $file2 && + error "comp-add with not aligned ext size succeeded $file1" + $LFS setstripe --component-add -E 1G -z 128M -c 1 $file2 || + error "comp-add [0,128M],SEL[128M,1G] failed $file1" + $LFS setstripe --component-add -E 10G $file2 || + error "comp-add [1G,10G] failed $file1" + $LFS setstripe --component-add -E -1 -z 128M -c 1 $file2 || + error "comp-add [10G,10G],SEL[10G,-1] failed $file1" + $LFS setstripe --component-add -E -1 -z 128M -c 1 $file2 && + error "repeated comp-add [10G,10G],SEL[10G,-1] succeeded $file1" + + $LFS getstripe $file1 + flg_opts="--comp-flags init" + found=$($LFS find --comp-start 0 -E 1G $flg_opts $file1 | wc -l) + [ $found -eq 1 ] || error "First component not found $file1" + + flg_opts="--comp-flags ^init" + found=$($LFS find --comp-start 1G -E 1G $flg_opts $file1 | wc -l) + [ $found -eq 1 ] || error "Second component not found $file1" + + flg_opts="--comp-flags ^init,extension" + found=$($LFS find --comp-start 1G -E 10G $flg_opts $file1 | wc -l) + [ $found -eq 1 ] || error "Third component not found $file1" + + flg_opts="--comp-flags ^init" + found=$($LFS find --comp-start 10G -E EOF $flg_opts $file1 | wc -l) + [ $found -eq 1 ] || error "Fourth component not found $file1" + + $LFS getstripe $file2 + flg_opts="--comp-flags init" + found=$($LFS find --comp-start 0 -E 128M $flg_opts $file2 | wc -l) + [ $found -eq 1 ] || error "First component not found $file2" + + flg_opts="--comp-flags extension" + found=$($LFS find --comp-start 128M -E 1G $flg_opts $file2 | wc -l) + [ $found -eq 1 ] || error "Second component not found $file2" + + flg_opts="--comp-flags ^init" + found=$($LFS find --comp-start 1G -E 10G $flg_opts $file2 | wc -l) + [ $found -eq 1 ] || error "Third component not found $file2" + + flg_opts="--comp-flags ^init" + found=$($LFS find --comp-start 10G -E 10G $flg_opts $file2 | wc -l) + [ $found -eq 1 ] || error "Fourth component not found $file2" + + flg_opts="--comp-flags ^init,extension" + found=$($LFS find --comp-start 10G -E EOF $flg_opts $file2 | wc -l) + [ $found -eq 1 ] || error "Fifth component not found $file2" +} +run_test 19g "component-add behaviour" + # Test out of space behavior test_20a() { - [ $OSTCOUNT -lt 2 ] && skip "needs >= 2 OSTs" && return - [ $(lustre_version_code $SINGLEMDS) -lt $(version_code $SEL_VER) ] && + [ $OSTCOUNT -lt 2 ] && skip "needs >= 2 OSTs" + [ "$MDS1_VERSION" -lt $(version_code $SEL_VER) ] && skip "skipped for lustre < $SEL_VER" local comp_file=$DIR/$tdir/$tfile @@ -1264,8 +1405,8 @@ test_20a() { run_test 20a "Test out of space, spillover to defined component" test_20b() { - [ $OSTCOUNT -lt 2 ] && skip "needs >= 2 OSTs" && return - [ $(lustre_version_code $SINGLEMDS) -lt $(version_code $SEL_VER) ] && + [ $OSTCOUNT -lt 2 ] && skip "needs >= 2 OSTs" + [ "$MDS1_VERSION" -lt $(version_code $SEL_VER) ] && skip "skipped for lustre < $SEL_VER" local comp_file=$DIR/$tdir/$tfile @@ -1330,8 +1471,8 @@ test_20b() { run_test 20b "Remove component without instantiation when there is no space" test_20c() { - [ $OSTCOUNT -lt 2 ] && skip "needs >= 2 OSTs" && return - [ $(lustre_version_code $SINGLEMDS) -lt $(version_code $SEL_VER) ] && + [ $OSTCOUNT -lt 2 ] && skip "needs >= 2 OSTs" + [ "$MDS1_VERSION" -lt $(version_code $SEL_VER) ] && skip "skipped for lustre < $SEL_VER" local comp_file=$DIR/$tdir/$tfile @@ -1381,8 +1522,8 @@ test_20c() { run_test 20c "Test inability to stripe new extension component" test_20d() { - [ $OSTCOUNT -lt 2 ] && skip "needs >= 2 OSTs" && return - [ $(lustre_version_code $SINGLEMDS) -lt $(version_code $SEL_VER) ] && + [ $OSTCOUNT -lt 2 ] && skip "needs >= 2 OSTs" + [ "$MDS1_VERSION" -lt $(version_code $SEL_VER) ] && skip "skipped for lustre < $SEL_VER" local comp_file=$DIR/$tdir/$tfile @@ -1426,8 +1567,8 @@ test_20d() { run_test 20d "Low on space + 0-length comp: force extension" test_20e() { - [ $OSTCOUNT -lt 2 ] && skip "needs >= 2 OSTs" && return - [ $(lustre_version_code $SINGLEMDS) -lt $(version_code $SEL_VER) ] && + [ $OSTCOUNT -lt 2 ] && skip "needs >= 2 OSTs" + [ "$MDS1_VERSION" -lt $(version_code $SEL_VER) ] && skip "skipped for lustre < $SEL_VER" local comp_file=$DIR/$tdir/$tfile @@ -1466,7 +1607,7 @@ run_test 20e "ENOSPC with next real comp: spillover and backward extension" # Simple DoM interaction test test_21a() { - [ $(lustre_version_code $SINGLEMDS) -lt $(version_code $SEL_VER) ] && + [ "$MDS1_VERSION" -lt $(version_code $SEL_VER) ] && skip "skipped for lustre < $SEL_VER" local comp_file=$DIR/$tdir/$tfile @@ -1497,8 +1638,8 @@ run_test 21a "Simple DoM interaction tests" # DoM + extension + removal test_21b() { - [ $OSTCOUNT -lt 2 ] && skip "needs >= 2 OSTs" && return - [ $(lustre_version_code $SINGLEMDS) -lt $(version_code $SEL_VER) ] && + [ $OSTCOUNT -lt 2 ] && skip "needs >= 2 OSTs" + [ "$MDS1_VERSION" -lt $(version_code $SEL_VER) ] && skip "skipped for lustre < $SEL_VER" local comp_file=$DIR/$tdir/$tfile @@ -1544,9 +1685,315 @@ test_21b() { } run_test 21b "DoM followed by extendable component with removal" +# Test of repeat component behavior with OOS/degraded OST +test_22a() { + [ $OSTCOUNT -lt 2 ] && skip "needs >= 2 OSTs" + [ "$MDS1_VERSION" -lt $(version_code $SEL_VER) ] && + skip "skipped for lustre < $SEL_VER" + + local comp_file=$DIR/$tdir/$tfile + local flg_opts="" + local found="" + + test_mkdir -p $DIR/$tdir + + $LFS setstripe -E -1 -c 1 -z 128M $comp_file || + error "Create $comp_file failed" + + local ost_idx1=$($LFS getstripe -I1 -i $comp_file) + local ost_name=$(ostname_from_index $ost_idx1) + + # write past end of first component, so it is extended + dd if=/dev/zero of=$comp_file bs=1M count=1 seek=130 || + error "dd to extend failed" + + flg_opts="--comp-flags extension" + found=$($LFS find --comp-start 256M -E EOF $flg_opts $comp_file | wc -l) + [ $found -eq 1 ] || error "Write: second component not found" + + # degrade OST for component 1 + do_facet ost$((ost_idx1+1)) $LCTL set_param -n \ + obdfilter.$ost_name.degraded=1 + # sleep to guarantee we see the degradation + sleep_maxage + + # un-degrade on exit + stack_trap "do_facet ost$((ost_idx1+1)) $LCTL set_param -n \ + obdfilter.$ost_name.degraded=0; sleep_maxage" EXIT + + replay_barrier $SINGLEMDS + + # seek past the end of current comp & write, should cause a new comp + # to be created (ie repeat previous comp) + dd if=/dev/zero of=$comp_file bs=1M count=1 seek=300 || + error "dd to repeat failed" + + local ost_idx2=$($LFS getstripe -I2 -i $comp_file) + + [ $ost_idx1 -eq $ost_idx2 ] && error "$ost_idx1 == $ost_idx2" + + flg_opts="--comp-flags init" + found=$($LFS find --comp-start 256M $flg_opts $comp_file | wc -l) + [ $found -eq 1 ] || error "Write: second component not found" + + flg_opts="--comp-flags extension" + found=$($LFS find --comp-start 384M -E EOF $flg_opts $comp_file | wc -l) + [ $found -eq 1 ] || error "Write: extension component not found" + + fail $SINGLEMDS + + local ost_idx2_2=$($LFS getstripe -I2 -i $comp_file) + [ $ost_idx2_2 -ne $ost_idx2 ] && error "$ost_idx2_2 != $ost_idx2" + + flg_opts="--comp-flags init" + found=$($LFS find --comp-start 256M $flg_opts $comp_file | wc -l) + [ $found -eq 1 ] || error "Failover: second component not found" + + flg_opts="--comp-flags extension" + found=$($LFS find --comp-start 384M -E EOF $flg_opts $comp_file | wc -l) + [ $found -eq 1 ] || error "Failover: extension component not found" + + sel_layout_sanity $comp_file 3 +} +run_test 22a "Test repeat component behavior with degraded OST" + +# Test repeat behavior with low space +test_22b() { + [ $OSTCOUNT -lt 2 ] && skip "needs >= 2 OSTs" + [ "$MDS1_VERSION" -lt $(version_code $SEL_VER) ] && + skip "skipped for lustre < $SEL_VER" + + local comp_file=$DIR/$tdir/$tfile + local flg_opts="" + local found="" + + test_mkdir -p $DIR/$tdir + + # without this, a previous delete can finish after we check free space + wait_delete_completed + wait_mds_ost_sync + + $LFS setstripe -E -1 -c 1 -z 128M \ + $comp_file || error "Create $comp_file failed" + + # write past end of first component, so it is extended + dd if=/dev/zero of=$comp_file bs=1M count=1 seek=130 || + error "dd to extend failed" + + flg_opts="--comp-flags extension" + found=$($LFS find --comp-start 256M -E EOF $flg_opts $comp_file | wc -l) + [ $found -eq 1 ] || error "Write: Second component not found" + + # set our OST low on space + local ost_idx1=$($LFS getstripe -I1 -i $comp_file) + local wms=$(ost_watermarks_set_low_space $ost_idx1 | grep "watermarks") + + stack_trap "ost_watermarks_clear_enospc $tfile $ost_idx1 $wms" EXIT + + # Write past end of current space, fail to extend, causing repeat + dd if=/dev/zero of=$comp_file bs=1M count=1 seek=300 || + error "dd to repeat failed" + + $LFS getstripe $comp_file + + local ost_idx2=$($LFS getstripe -I2 -i $comp_file) + + [ $ost_idx1 -eq $ost_idx2 ] && error "$ost_idx1 == $ost_idx2" + + flg_opts="--comp-flags init" + found=$($LFS find --comp-start 256M $flg_opts $comp_file | wc -l) + [ $found -eq 1 ] || error "Write: Second component not found" + + flg_opts="--comp-flags extension" + found=$($LFS find --comp-start 384M -E EOF $flg_opts $comp_file | wc -l) + [ $found -eq 1 ] || error "Write: Extension component not found" + + sel_layout_sanity $comp_file 3 +} +run_test 22b "Test simple 'out of space' condition with repeat" + +# This tests both "repeat" and "extend in place when repeat fails" aspects +# of repeating components +test_22c() { + [ $OSTCOUNT -lt 2 ] && skip "needs >= 2 OSTs" + [ "$MDS1_VERSION" -lt $(version_code $SEL_VER) ] && + skip "skipped for lustre < $SEL_VER" + + local comp_file=$DIR/$tdir/$tfile + local flg_opts="" + local found="" + + test_mkdir -p $DIR/$tdir + + # pool is used to limit available OSTs to 0 and 1, so we can set all + # available OSTs out of space + pool_add $TESTNAME || error "Pool creation failed" + pool_add_targets $TESTNAME 0 1 || error "Pool add targets failed" + + # without this, a previous delete can finish after we check free space + wait_delete_completed + wait_mds_ost_sync + + $LFS setstripe -E -1 -z 64M -c 1 -p "$TESTNAME" $comp_file || \ + error "Create $comp_file failed" + + # write past end of first component, so it is extended + dd if=/dev/zero of=$comp_file bs=1M count=1 seek=80 conv=notrunc || + error "dd to extend failed" + + $LFS getstripe $comp_file + + flg_opts="--comp-flags extension" + found=$($LFS find --comp-start 128M -E EOF $flg_opts $comp_file | wc -l) + [ $found -eq 1 ] || error "Write: second component not found" + + # set our OST out of space + local ost_idx1=$($LFS getstripe -I1 -i $comp_file) + local wms=$(ost_watermarks_set_enospc $tfile $ost_idx1 | + grep "watermarks") + stack_trap "ost_watermarks_clear_enospc $tfile $ost_idx1 $wms" EXIT + + # This should create a repeat component on a new OST + dd if=/dev/zero of=$comp_file bs=1M count=1 seek=180 conv=notrunc || + error "dd to repeat failed" + + $LFS getstripe $comp_file + + local comp_cnt=$($LFS getstripe --component-count $comp_file) + [ $comp_cnt -ne 3 ] && error "component count: $comp_cnt, should be 3" + + # New second component should be on a different OST + local ost_idx2=$($LFS getstripe --comp-start=128m \ + --comp-end=192m --comp-flags=init -i $comp_file) + + [ $ost_idx1 -eq $ost_idx2 ] && error "2nd comp: same OST $ost_idx1" + + local wms2=$(ost_watermarks_set_enospc $tfile $ost_idx2 | + grep "watermarks") + stack_trap "ost_watermarks_clear_enospc $tfile $ost_idx2 $wms2" EXIT + + # now that the second OST is out of space (as is the first OST), we + # attempt to extend. This should result in an extension of the + # existing component, rather than a new component. + dd if=/dev/zero of=$comp_file bs=1M count=1 seek=240 conv=notrunc || + error "dd for forced extension failed" + + $LFS getstripe $comp_file + + # clear out of space on first OST + ost_watermarks_clear_enospc $tfile $ost_idx1 $wms + + # finally, now that the first OST has space again, we attempt to + # extend one last time. This should create a new component on the + # first OST + dd if=/dev/zero of=$comp_file bs=1M count=1 seek=300 conv=notrunc || + error "dd for repeat on first OST failed" + + $LFS getstripe $comp_file + + flg_opts="--comp-flags init" + found=$($LFS find --comp-start 128M $flg_opts $comp_file | wc -l) + [ $found -eq 1 ] || error "Write: second component not found" + + flg_opts="--comp-flags init" + found=$($LFS find --comp-start 256M $flg_opts $comp_file | wc -l) + [ $found -eq 1 ] || error "Write: third component not found" + + flg_opts="--comp-flags extension" + found=$($LFS find --comp-start 320M -E EOF $flg_opts $comp_file | wc -l) + [ $found -eq 1 ] || error "Write: extension component not found" + + sel_layout_sanity $comp_file 4 +} +run_test 22c "Test repeat with out of space on > 1 OST" + +test_22d_post_check() { + local comp_file=$1 + local name=$2 + local flg_opts="--comp-flags init" + local found=$($LFS find --comp-start 0M -E 128M $flg_opts $comp_file | + wc -l) + [ $found -eq 1 ] || { + $LFS getstripe $comp_file + error "$name: second component not found" + } + + flg_opts="--comp-flags extension" + found=$($LFS find --comp-start 128M -E EOF $flg_opts $comp_file | wc -l) + [ $found -eq 1 ] || error "$name: third extension component not found" + + sel_layout_sanity $comp_file 2 +} + +test_22d_pre() { + local comp_file=$1 + local wms="$2" + local RC + + # write past end of first component + dd if=/dev/zero of=$comp_file bs=1M count=1 seek=70 + RC=$? + + ost_watermarks_clear_enospc $tfile 0 $wms + [ $RC -eq 0 ] || error "dd to force extend failed" + + test_22d_post_check $comp_file "Write" +} + +test_22d() { + [ $OSTCOUNT -lt 2 ] && skip "needs >= 2 OSTs" + [ "$MDS1_VERSION" -lt $(version_code $SEL_VER) ] && + skip "skipped for lustre < $SEL_VER" + + local comp_file=$DIR/$tdir/$tfile + local flg_opts="" + local found="" + + test_mkdir -p $DIR/$tdir + + # without this, a previous delete can finish after we check free space + wait_delete_completed + wait_mds_ost_sync + + # Pool allows us to force use of only certain OSTs + pool_add $TESTNAME || error "Pool creation failed" + pool_add_targets $TESTNAME 0 || error "Pool add targets failed" + + # 1. Fail to extend due to OOS, try to repeat within the same pool, + # fail to stripe (again OOS) the 0-length component, remove the + # repeated one, force the extension on the original one. + $LFS setstripe -E -1 -p $TESTNAME -z 64M $comp_file || + error "Create $comp_file failed" + + replay_barrier $SINGLEMDS + + # set our OST out of space + local wms=$(ost_watermarks_set_enospc $tfile 0 | grep "watermarks") + + test_22d_pre $comp_file "$wms" + fail $SINGLEMDS + test_22d_post_check $comp_file "Failover" + + # 2. repeat with low on space: 0-length repeated component will be + # striped, but still fails to be extended; otherwise the same as (1). + rm -f $comp_file + $LFS setstripe -E -1 -p $TESTNAME -z 64M $comp_file || + error "Create $comp_file failed" + + replay_barrier $SINGLEMDS + + # set our OST low on space + local wms=$(ost_watermarks_set_low_space 0 | grep "watermarks") + + test_22d_pre $comp_file "$wms" + fail $SINGLEMDS + test_22d_post_check $comp_file "Failover" +} +run_test 22d "out of/low on space + failed to repeat + forced extension" + test_23a() { - [ $OSTCOUNT -lt 2 ] && skip "needs >= 2 OSTs" && return - [ $(lustre_version_code $SINGLEMDS) -lt $(version_code $SEL_VER) ] && + [ $OSTCOUNT -lt 2 ] && skip "needs >= 2 OSTs" + [ "$MDS1_VERSION" -lt $(version_code $SEL_VER) ] && skip "skipped for lustre < $SEL_VER" local comp_file=$DIR/$tdir/$tfile @@ -1570,8 +2017,8 @@ test_23a() { run_test 23a "Append: remove EXT comp" test_23b() { - [ $OSTCOUNT -lt 2 ] && skip "needs >= 2 OSTs" && return - [ $(lustre_version_code $SINGLEMDS) -lt $(version_code $SEL_VER) ] && + [ $OSTCOUNT -lt 2 ] && skip "needs >= 2 OSTs" + [ "$MDS1_VERSION" -lt $(version_code $SEL_VER) ] && skip "skipped for lustre < $SEL_VER" local comp_file=$DIR/$tdir/$tfile @@ -1595,8 +2042,8 @@ test_23b() { run_test 23b "Append with 0-length comp: remove EXT comp" test_23c() { - [ $OSTCOUNT -lt 2 ] && skip "needs >= 2 OSTs" && return - [ $(lustre_version_code $SINGLEMDS) -lt $(version_code $SEL_VER) ] && + [ $OSTCOUNT -lt 2 ] && skip "needs >= 2 OSTs" + [ "$MDS1_VERSION" -lt $(version_code $SEL_VER) ] && skip "skipped for lustre < $SEL_VER" local comp_file=$DIR/$tdir/$tfile @@ -1629,8 +2076,8 @@ test_23c() { run_test 23c "Append with low on space + 0-length comp: force extension" test_23d() { - [ $OSTCOUNT -lt 2 ] && skip "needs >= 2 OSTs" && return - [ $(lustre_version_code $SINGLEMDS) -lt $(version_code $SEL_VER) ] && + [ $OSTCOUNT -lt 2 ] && skip "needs >= 2 OSTs" + [ "$MDS1_VERSION" -lt $(version_code $SEL_VER) ] && skip "skipped for lustre < $SEL_VER" local comp_file=$DIR/$tdir/$tfile @@ -1654,8 +2101,8 @@ test_23d() { run_test 23d "Append with 0-length comp + next real comp: remove EXT comp" test_23e() { - [ $OSTCOUNT -lt 2 ] && skip "needs >= 2 OSTs" && return - [ $(lustre_version_code $SINGLEMDS) -lt $(version_code $SEL_VER) ] && + [ $OSTCOUNT -lt 2 ] && skip "needs >= 2 OSTs" + [ "$MDS1_VERSION" -lt $(version_code $SEL_VER) ] && skip "skipped for lustre < $SEL_VER" local comp_file=$DIR/$tdir/$tfile @@ -1691,6 +2138,37 @@ test_23e() { } run_test 23e "Append with next real comp: spillover and backward extension" +test_23f() { + [ $OSTCOUNT -lt 2 ] && skip "needs >= 2 OSTs" + [ "$MDS1_VERSION" -lt $(version_code $SEL_VER) ] && + skip "skipped for lustre < $SEL_VER" + + local comp_file=$DIR/$tdir/$tfile + test_mkdir -p $DIR/$tdir + + $LFS setstripe -z 64M -c 1 -E -1 $comp_file || + error "Create $comp_file failed" + + local ost_idx=$($LFS getstripe -I1 -i $comp_file) + local wms=$(ost_watermarks_set_low_space $ost_idx | grep "watermarks") + + dd if=/dev/zero bs=1M oflag=append count=1 of=$comp_file + RC=$? + + ost_watermarks_clear_enospc $tfile $ost_idx $wms + [ $RC -eq 0 ] || error "dd append failed" + + local flg_opts="--comp-start 64M -E EOF --comp-flags init" + local found=$($LFS find $flg_opts $comp_file | wc -l) + [ $found -eq 1 ] || error "Append: component (64M-EOF) not found" + + ost_idx=$($LFS getstripe -I2 -i $comp_file) + [ "$ost_idx" != "" ] && error "Append: extension component still exists" + + sel_layout_sanity $comp_file 2 +} +run_test 23f "Append with low on space: repeat and remove EXT comp" + complete $SECONDS check_and_cleanup_lustre exit_status