mirror of
https://github.com/versity/scoutfs.git
synced 2026-01-03 10:55:20 +00:00
Fix block-stale-reads test
The block-stale-reads test was built from the ashes of a test that used counters and triggers to work with the btree when it was only used on the server. The initial quick translation to try and trigger block cache retries while the forest called the btree got so much wrong. It was still trying to use some 'cl' variable that didn't refer to the client any more, the trigger helpers now call statfs to find paths and can end up triggering themselves. and many more counters stale reads can happen throughout the system while we're working -- not just one from our trigger. This fixes it up to consistently use fs numbers instead of the silly stale cl variable and be less sensitive to triggers firing and counter differences. Signed-off-by: Zach Brown <zab@versity.com>
This commit is contained in:
@@ -1,29 +1,52 @@
|
||||
== create file for xattr ping pong
|
||||
# file: /mnt/test/test/block-stale-reads/file
|
||||
user.xat="initial"
|
||||
|
||||
== retry btree forest reads between mounts
|
||||
trigger block_remove_stale armed: 0
|
||||
== create shared test file
|
||||
== set and get xattrs between mount pairs while retrying
|
||||
# file: /mnt/test/test/block-stale-reads/file
|
||||
user.xat="1"
|
||||
|
||||
trigger block_remove_stale after: 0
|
||||
counter block_cache_remove_stale diff 1
|
||||
trigger block_remove_stale armed: 0
|
||||
counter block_cache_remove_stale changed
|
||||
counter block_cache_remove_stale changed
|
||||
# file: /mnt/test/test/block-stale-reads/file
|
||||
user.xat="2"
|
||||
|
||||
trigger block_remove_stale after: 0
|
||||
counter block_cache_remove_stale diff 2
|
||||
trigger block_remove_stale armed: 0
|
||||
counter block_cache_remove_stale changed
|
||||
counter block_cache_remove_stale changed
|
||||
# file: /mnt/test/test/block-stale-reads/file
|
||||
user.xat="3"
|
||||
|
||||
trigger block_remove_stale after: 0
|
||||
counter block_cache_remove_stale diff 3
|
||||
trigger block_remove_stale armed: 0
|
||||
counter block_cache_remove_stale changed
|
||||
counter block_cache_remove_stale changed
|
||||
# file: /mnt/test/test/block-stale-reads/file
|
||||
user.xat="4"
|
||||
|
||||
trigger block_remove_stale after: 0
|
||||
counter block_cache_remove_stale diff 4
|
||||
counter block_cache_remove_stale changed
|
||||
counter block_cache_remove_stale changed
|
||||
# file: /mnt/test/test/block-stale-reads/file
|
||||
user.xat="5"
|
||||
|
||||
counter block_cache_remove_stale changed
|
||||
counter block_cache_remove_stale changed
|
||||
# file: /mnt/test/test/block-stale-reads/file
|
||||
user.xat="6"
|
||||
|
||||
counter block_cache_remove_stale changed
|
||||
counter block_cache_remove_stale changed
|
||||
# file: /mnt/test/test/block-stale-reads/file
|
||||
user.xat="7"
|
||||
|
||||
counter block_cache_remove_stale changed
|
||||
counter block_cache_remove_stale changed
|
||||
# file: /mnt/test/test/block-stale-reads/file
|
||||
user.xat="8"
|
||||
|
||||
counter block_cache_remove_stale changed
|
||||
counter block_cache_remove_stale changed
|
||||
# file: /mnt/test/test/block-stale-reads/file
|
||||
user.xat="9"
|
||||
|
||||
counter block_cache_remove_stale changed
|
||||
counter block_cache_remove_stale changed
|
||||
# file: /mnt/test/test/block-stale-reads/file
|
||||
user.xat="10"
|
||||
|
||||
counter block_cache_remove_stale changed
|
||||
counter block_cache_remove_stale changed
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
#
|
||||
# exercise stale block reading.
|
||||
# Exercise stale block reading.
|
||||
#
|
||||
# It would be very difficult to manipulate the allocators, cache, and
|
||||
# persistent blocks to create stable block reading scenarios. Instead
|
||||
@@ -7,34 +7,55 @@
|
||||
#
|
||||
|
||||
t_require_commands touch setfattr getfattr
|
||||
t_require_mounts 2
|
||||
|
||||
inc_wrap_fs_nr()
|
||||
{
|
||||
local nr="$(($1 + 1))"
|
||||
|
||||
if [ "$nr" == "$T_NR_MOUNTS" ]; then
|
||||
nr=0
|
||||
fi
|
||||
|
||||
echo $nr
|
||||
}
|
||||
|
||||
GETFATTR="getfattr --absolute-names"
|
||||
SETFATTR="setfattr"
|
||||
|
||||
#
|
||||
# force re-reading forest btree blocks as each mount reads the items
|
||||
# written by the other.
|
||||
#
|
||||
set_file="$T_D0/file"
|
||||
get_file="$T_D1/file"
|
||||
echo "== create file for xattr ping pong"
|
||||
touch "$set_file"
|
||||
$SETFATTR -n user.xat -v initial "$set_file"
|
||||
$GETFATTR -n user.xat "$get_file" 2>&1 | t_filter_fs
|
||||
echo "== create shared test file"
|
||||
touch "$T_D0/file"
|
||||
$SETFATTR -n user.xat -v 0 "$T_D0/file"
|
||||
|
||||
echo "== retry btree forest reads between mounts"
|
||||
for i in $(seq 1 4); do
|
||||
tmp="$set_file"
|
||||
set_file="$get_file"
|
||||
get_file="$tmp"
|
||||
#
|
||||
# Trigger retries in the block cache as we bounce xattr values around
|
||||
# between sequential pairs of mounts. This is a little silly because if
|
||||
# either of the mounts are the server then they'll almost certaily have
|
||||
# their trigger fired prematurely by message handling btree calls while
|
||||
# working with the t_ helpers long before we work with the xattrs. But
|
||||
# the block cache stale retry path is still being exercised.
|
||||
#
|
||||
echo "== set and get xattrs between mount pairs while retrying"
|
||||
set_nr=0
|
||||
get_nr=$(inc_wrap_fs_nr $set_nr)
|
||||
|
||||
for i in $(seq 1 10); do
|
||||
eval set_file="\$T_D${set_nr}/file"
|
||||
eval get_file="\$T_D${get_nr}/file"
|
||||
|
||||
old_set=$(t_counter block_cache_remove_stale $set_nr)
|
||||
old_get=$(t_counter block_cache_remove_stale $get_nr)
|
||||
|
||||
t_trigger_arm_silent block_remove_stale $set_nr
|
||||
t_trigger_arm_silent block_remove_stale $get_nr
|
||||
|
||||
$SETFATTR -n user.xat -v $i "$set_file"
|
||||
t_trigger_arm block_remove_stale $cl
|
||||
old=$(t_counter btree_stale_read $cl)
|
||||
$GETFATTR -n user.xat "$get_file" 2>&1 | t_filter_fs
|
||||
t_trigger_show block_remove_stale "after" $cl
|
||||
t_counter_diff block_cache_remove_stale $old $cl
|
||||
|
||||
t_counter_diff_changed block_cache_remove_stale $old_set $set_nr
|
||||
t_counter_diff_changed block_cache_remove_stale $old_get $get_nr
|
||||
|
||||
set_nr="$get_nr"
|
||||
get_nr=$(inc_wrap_fs_nr $set_nr)
|
||||
done
|
||||
|
||||
t_pass
|
||||
|
||||
Reference in New Issue
Block a user