From 3ae0ebd0d8554c7470fc262cfe85b66065d69c64 Mon Sep 17 00:00:00 2001 From: "Bryant G. Duffy-Ly" Date: Mon, 15 Nov 2021 17:05:01 -0600 Subject: [PATCH] Fix block-stale-read test case The current test case attempts to create a state to read by calling setattr and getattr in attempt to force block cache reads. It so happens that this does not always force cache block reads, which in rare cases causes this test case to fail. The new test case removes all the extra bouncing around of mount points and we just directly call scoutfs df which will walk everyone's allocators to summarize the block counts, which is guaranteed to exist. Therefore, we do not have to create any sort of state prior to trying to force a read. Signed-off-by: Bryant G. Duffy-Ly --- tests/golden/block-stale-reads | 52 +---------------------------- tests/tests/block-stale-reads.sh | 57 +++++--------------------------- 2 files changed, 10 insertions(+), 99 deletions(-) diff --git a/tests/golden/block-stale-reads b/tests/golden/block-stale-reads index 60099ace..73eed5e4 100644 --- a/tests/golden/block-stale-reads +++ b/tests/golden/block-stale-reads @@ -1,52 +1,2 @@ -== create shared test file -== set and get xattrs between mount pairs while retrying -# file: /mnt/test/test/block-stale-reads/file -user.xat="1" - -counter block_cache_remove_stale changed -counter block_cache_remove_stale changed -# file: /mnt/test/test/block-stale-reads/file -user.xat="2" - -counter block_cache_remove_stale changed -counter block_cache_remove_stale changed -# file: /mnt/test/test/block-stale-reads/file -user.xat="3" - -counter block_cache_remove_stale changed -counter block_cache_remove_stale changed -# file: /mnt/test/test/block-stale-reads/file -user.xat="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 +== Issue scoutfs df to force block reads to trigger stale invalidation/retry counter block_cache_remove_stale changed diff --git a/tests/tests/block-stale-reads.sh b/tests/tests/block-stale-reads.sh index f20a4f75..91960f7b 100644 --- a/tests/tests/block-stale-reads.sh +++ b/tests/tests/block-stale-reads.sh @@ -5,57 +5,18 @@ # persistent blocks to create stable block reading scenarios. Instead # we use triggers to exercise how readers encounter stale blocks. # +# Trigger retries in the block cache by calling scoutfs df +# which in turn will call scoutfs_ioctl_alloc_detail. This +# is guaranteed to exist, which will force block cache reads. -t_require_commands touch setfattr getfattr +echo "== Issue scoutfs df to force block reads to trigger stale invalidation/retry" +nr=0 -inc_wrap_fs_nr() -{ - local nr="$(($1 + 1))" +old=$(t_counter block_cache_remove_stale $nr) +t_trigger_arm_silent block_remove_stale $nr - if [ "$nr" == "$T_NR_MOUNTS" ]; then - nr=0 - fi +scoutfs df -p "$T_M0" > /dev/null - echo $nr -} - -GETFATTR="getfattr --absolute-names" -SETFATTR="setfattr" - -echo "== create shared test file" -touch "$T_D0/file" -$SETFATTR -n user.xat -v 0 "$T_D0/file" - -# -# 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" - $GETFATTR -n user.xat "$get_file" 2>&1 | t_filter_fs - - 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_counter_diff_changed block_cache_remove_stale $old $nr t_pass