scoutfs-tests: remove tiny btree and segment use

The test that exercises re-reading stale cached blocks was still
trying to use both tiny btree blocks and segments, both of which have
been removed.

Signed-off-by: Zach Brown <zab@versity.com>
This commit is contained in:
Zach Brown
2020-08-26 14:39:39 -07:00
committed by Zach Brown
parent d2d32c8776
commit a65eccd0f5
5 changed files with 52 additions and 170 deletions
+11
View File
@@ -0,0 +1,11 @@
== create file for xattr ping pong
# file: /mnt/test/test/stale-btree-read/file
user.xat="initial"
== retry btree block read
trigger btree_stale_read armed: 1
# file: /mnt/test/test/stale-btree-read/file
user.xat="btree"
trigger btree_stale_read after: 0
counter btree_stale_read diff 1
-39
View File
@@ -1,39 +0,0 @@
== create file for xattr ping pong
# file: /mnt/test/test/stale-btree-seg-read/file
user.xat="initial"
== retry btree block read
trigger btree_stale_read armed: 1
# file: /mnt/test/test/stale-btree-seg-read/file
user.xat="btree"
trigger btree_stale_read after: 0
counter btree_stale_read diff 1
== retry segment read
trigger seg_stale_read armed: 1
# file: /mnt/test/test/stale-btree-seg-read/file
user.xat="segment"
trigger seg_stale_read after: 0
counter seg_stale_read diff 1
== get a hard error, then have it work
trigger hard_stale_error armed: 1
getfattr: /mnt/test/test/stale-btree-seg-read/file: Input/output error
trigger hard_stale_error after: 0
counter manifest_hard_stale_error diff 1
# file: /mnt/test/test/stale-btree-seg-read/file
user.xat="err"
== read through multiple stale cached btree blocks
Y
trigger btree_advance_ring_half armed: 1
trigger btree_advance_ring_half after: 0
trigger btree_advance_ring_half armed: 1
trigger btree_advance_ring_half after: 0
trigger btree_advance_ring_half armed: 1
trigger btree_advance_ring_half after: 0
trigger btree_advance_ring_half armed: 1
trigger btree_advance_ring_half after: 0
trigger statfs_lock_purge armed: 1
trigger statfs_lock_purge after: 0
N
+1 -2
View File
@@ -23,6 +23,5 @@ setup-error-teardown.sh
mount-unmount-race.sh
createmany-parallel-mounts.sh
archive-light-cycle.sh
# this creates a ton of tiny btree blocks so we do it last
stale-btree-seg-read.sh
stale-btree-read.sh
xfstests.sh
+40
View File
@@ -0,0 +1,40 @@
#
# verify stale btree block reading
#
t_require_commands touch stat setfattr getfattr createmany
t_require_mounts 2
GETFATTR="getfattr --absolute-names"
SETFATTR="setfattr"
#
# This exercises the soft retry of btree blocks when
# inconsistent cached versions are found. It ensures that basic hard
# error returning turns into EIO in the case where the persistent reread
# blocks and segments really are inconsistent.
#
# The triggers apply across all execution in the file system. So to
# trigger btree block retries in the client we make sure that the server
# is running on the other node.
#
cl=$(t_first_client_nr)
sv=$(t_server_nr)
eval cl_dir="\$T_D${cl}"
eval sv_dir="\$T_D${sv}"
echo "== create file for xattr ping pong"
touch "$sv_dir/file"
$SETFATTR -n user.xat -v initial "$sv_dir/file"
$GETFATTR -n user.xat "$sv_dir/file" 2>&1 | t_filter_fs
echo "== retry btree block read"
$SETFATTR -n user.xat -v btree "$sv_dir/file"
t_trigger_arm btree_stale_read $cl
old=$(t_counter btree_stale_read $cl)
$GETFATTR -n user.xat "$cl_dir/file" 2>&1 | t_filter_fs
t_trigger_show btree_stale_read "after" $cl
t_counter_diff btree_stale_read $old $cl
t_pass
-129
View File
@@ -1,129 +0,0 @@
#
# verify stale btree and segment reading
#
t_require_commands touch stat setfattr getfattr createmany
t_require_mounts 2
GETFATTR="getfattr --absolute-names"
SETFATTR="setfattr"
#
# This exercises the soft retry of btree blocks and segment reads when
# inconsistent cached versions are found. It ensures that basic hard
# error returning turns into EIO in the case where the persistent reread
# blocks and segments really are inconsistent.
#
# The triggers apply across all execution in the file system. So to
# trigger btree block retries in the client we make sure that the server
# is running on the other node.
#
# We need to quiesce compaction before arming stale segment triggers
# because we don't want them to hit compaction.. they're not expected
# there because the server protects compaction input segments.
#
cl=$(t_first_client_nr)
sv=$(t_server_nr)
eval cl_dir="\$T_D${cl}"
eval sv_dir="\$T_D${sv}"
echo "== create file for xattr ping pong"
touch "$sv_dir/file"
$SETFATTR -n user.xat -v initial "$sv_dir/file"
$GETFATTR -n user.xat "$sv_dir/file" 2>&1 | t_filter_fs
echo "== retry btree block read"
$SETFATTR -n user.xat -v btree "$sv_dir/file"
t_trigger_arm btree_stale_read $cl
old=$(t_counter btree_stale_read $cl)
$GETFATTR -n user.xat "$cl_dir/file" 2>&1 | t_filter_fs
t_trigger_show btree_stale_read "after" $cl
t_counter_diff btree_stale_read $old $cl
echo "== retry segment read"
$SETFATTR -n user.xat -v segment "$sv_dir/file"
sync; sleep .5 # hopefully compaction finishes
t_trigger_arm seg_stale_read $cl
old=$(t_counter seg_stale_read $cl)
$GETFATTR -n user.xat "$cl_dir/file" 2>&1 | t_filter_fs
t_trigger_show seg_stale_read "after" $cl
t_counter_diff seg_stale_read $old $cl
echo "== get a hard error, then have it work"
$SETFATTR -n user.xat -v err "$sv_dir/file"
t_trigger_arm hard_stale_error $cl
old=$(t_counter manifest_hard_stale_error $cl)
$GETFATTR -n user.xat "$cl_dir/file" 2>&1 | t_filter_fs
t_trigger_show hard_stale_error "after" $cl
t_counter_diff manifest_hard_stale_error $old $cl
$GETFATTR -n user.xat "$cl_dir/file" 2>&1 | t_filter_fs
#
# we had bugs trying to read the manifest and segments when multiple
# segments and btree blocks were stale in memory but fine on disk.
#
# We can ensure stale cached blocks by reading on one node while
# aggressively advancing the btree ring on another. And we can ensure
# that there are lots of stale btree blocks to walk through by using
# tiny blocks which results in a huge tree.
#
LOTS=500000
INC=1000
stat_lots() {
local top="$1"
local out="$2"
local i
for i in $(seq 1 $INC $LOTS); do
stat "$top/dir/file_$i" | t_filter_fs
done > "$out"
}
advance_next_half() {
local nr="$1"
local which="btree_advance_ring_half"
t_trigger_arm $which $nr
while [ "$(t_trigger_get $which $nr)" == "1" ]; do
touch -a "$T_D0"
sync
sleep .1
done
t_trigger_show $which "after" $nr
}
echo "== read through multiple stale cached btree blocks"
# make sure we create a ton of blocks
echo 1 > "$(t_debugfs_path $sv)/options/btree_force_tiny_blocks"
cat "$(t_debugfs_path $sv)/options/btree_force_tiny_blocks"
# make enough items to create a tall tree
mkdir "$sv_dir/dir"
createmany -o "$sv_dir/dir/file_$i" $LOTS >> $T_TMP.log
# get our good stat output
stat_lots "$sv_dir" "$T_TMP.good"
# advance next block to half X
advance_next_half "$sv"
# densely fill half X with migration and start to write to half X+1
advance_next_half "$sv"
# read and cache a bunch of blocks in half X
stat_lots "$cl_dir" "$T_TMP.1"
# fill half X+1 with migration, then half X+2 (X!) with migration
advance_next_half "$sv"
advance_next_half "$sv"
# drop item cache by purging locks, forcing manifest reads
t_trigger_arm statfs_lock_purge $cl
stat -f "$cl_dir" > /dev/null
t_trigger_show statfs_lock_purge "after" $cl
# then attempt to read X+2 blocks through stale cached X blocks
stat_lots "$cl_dir" "$T_TMP.2"
# everyone needs to match
diff -u "$T_TMP.good" "$T_TMP.1"
diff -u "$T_TMP.good" "$T_TMP.2"
echo 0 > "$(t_debugfs_path $sv)/options/btree_force_tiny_blocks"
cat "$(t_debugfs_path $sv)/options/btree_force_tiny_blocks"
rm -rf "$sv_dir/dir"
t_pass