diff --git a/tests/golden/block-stale-reads b/tests/golden/block-stale-reads index 51f11b28..60099ace 100644 --- a/tests/golden/block-stale-reads +++ b/tests/golden/block-stale-reads @@ -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 diff --git a/tests/tests/block-stale-reads.sh b/tests/tests/block-stale-reads.sh index a41d821d..f20a4f75 100644 --- a/tests/tests/block-stale-reads.sh +++ b/tests/tests/block-stale-reads.sh @@ -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