From 564b942eadb0fb523806a23d14769cf4debc7101 Mon Sep 17 00:00:00 2001 From: Zach Brown Date: Wed, 28 Jun 2023 15:01:36 -0700 Subject: [PATCH] Write test for hole filling noncontig prealloc Add a test which exercises filling holes in prealloc regions when the _contig_only prealloc option is not set. Signed-off-by: Zach Brown --- tests/golden/data-prealloc | 322 +++++++++++++++++++++++++++++++++++ tests/tests/data-prealloc.sh | 94 ++++++++++ 2 files changed, 416 insertions(+) diff --git a/tests/golden/data-prealloc b/tests/golden/data-prealloc index 93854034..f6ac8d65 100644 --- a/tests/golden/data-prealloc +++ b/tests/golden/data-prealloc @@ -24,3 +24,325 @@ /mnt/test/test/data-prealloc/file-2: 5 extents found /mnt/test/test/data-prealloc/file-1: 3 extents found /mnt/test/test/data-prealloc/file-2: 3 extents found +== block writes into region allocs hole +wrote blk 24 +wrote blk 32 +wrote blk 40 +wrote blk 55 +wrote blk 63 +wrote blk 71 +wrote blk 72 +wrote blk 79 +wrote blk 80 +wrote blk 87 +wrote blk 88 +wrote blk 95 +before: +24.. 1: +32.. 1: +40.. 1: +55.. 1: +63.. 1: +71.. 2: +79.. 2: +87.. 2: +95.. 1: eof +writing into existing 0 at pos 0 +wrote blk 0 +0.. 1: +1.. 7: unwritten +24.. 1: +32.. 1: +40.. 1: +55.. 1: +63.. 1: +71.. 2: +79.. 2: +87.. 2: +95.. 1: eof +writing into existing 0 at pos 1 +wrote blk 15 +0.. 1: +1.. 14: unwritten +15.. 1: +24.. 1: +32.. 1: +40.. 1: +55.. 1: +63.. 1: +71.. 2: +79.. 2: +87.. 2: +95.. 1: eof +writing into existing 0 at pos 2 +wrote blk 19 +0.. 1: +1.. 14: unwritten +15.. 1: +16.. 3: unwritten +19.. 1: +20.. 4: unwritten +24.. 1: +32.. 1: +40.. 1: +55.. 1: +63.. 1: +71.. 2: +79.. 2: +87.. 2: +95.. 1: eof +writing into existing 1 at pos 0 +wrote blk 25 +0.. 1: +1.. 14: unwritten +15.. 1: +16.. 3: unwritten +19.. 1: +20.. 4: unwritten +24.. 1: +25.. 1: +26.. 6: unwritten +32.. 1: +40.. 1: +55.. 1: +63.. 1: +71.. 2: +79.. 2: +87.. 2: +95.. 1: eof +writing into existing 1 at pos 1 +wrote blk 39 +0.. 1: +1.. 14: unwritten +15.. 1: +16.. 3: unwritten +19.. 1: +20.. 4: unwritten +24.. 1: +25.. 1: +26.. 6: unwritten +32.. 1: +33.. 6: unwritten +39.. 1: +40.. 1: +55.. 1: +63.. 1: +71.. 2: +79.. 2: +87.. 2: +95.. 1: eof +writing into existing 1 at pos 2 +wrote blk 44 +0.. 1: +1.. 14: unwritten +15.. 1: +16.. 3: unwritten +19.. 1: +20.. 4: unwritten +24.. 1: +25.. 1: +26.. 6: unwritten +32.. 1: +33.. 6: unwritten +39.. 1: +40.. 1: +41.. 3: unwritten +44.. 1: +45.. 3: unwritten +55.. 1: +63.. 1: +71.. 2: +79.. 2: +87.. 2: +95.. 1: eof +writing into existing 2 at pos 0 +wrote blk 48 +0.. 1: +1.. 14: unwritten +15.. 1: +16.. 3: unwritten +19.. 1: +20.. 4: unwritten +24.. 1: +25.. 1: +26.. 6: unwritten +32.. 1: +33.. 6: unwritten +39.. 1: +40.. 1: +41.. 3: unwritten +44.. 1: +45.. 3: unwritten +48.. 1: +49.. 6: unwritten +55.. 1: +63.. 1: +71.. 2: +79.. 2: +87.. 2: +95.. 1: eof +writing into existing 2 at pos 1 +wrote blk 62 +0.. 1: +1.. 14: unwritten +15.. 1: +16.. 3: unwritten +19.. 1: +20.. 4: unwritten +24.. 1: +25.. 1: +26.. 6: unwritten +32.. 1: +33.. 6: unwritten +39.. 1: +40.. 1: +41.. 3: unwritten +44.. 1: +45.. 3: unwritten +48.. 1: +49.. 6: unwritten +55.. 1: +56.. 6: unwritten +62.. 1: +63.. 1: +71.. 2: +79.. 2: +87.. 2: +95.. 1: eof +writing into existing 2 at pos 2 +wrote blk 67 +0.. 1: +1.. 14: unwritten +15.. 1: +16.. 3: unwritten +19.. 1: +20.. 4: unwritten +24.. 1: +25.. 1: +26.. 6: unwritten +32.. 1: +33.. 6: unwritten +39.. 1: +40.. 1: +41.. 3: unwritten +44.. 1: +45.. 3: unwritten +48.. 1: +49.. 6: unwritten +55.. 1: +56.. 6: unwritten +62.. 1: +63.. 1: +64.. 3: unwritten +67.. 1: +68.. 3: unwritten +71.. 2: +79.. 2: +87.. 2: +95.. 1: eof +writing into existing 3 at pos 0 +wrote blk 73 +0.. 1: +1.. 14: unwritten +15.. 1: +16.. 3: unwritten +19.. 1: +20.. 4: unwritten +24.. 1: +25.. 1: +26.. 6: unwritten +32.. 1: +33.. 6: unwritten +39.. 1: +40.. 1: +41.. 3: unwritten +44.. 1: +45.. 3: unwritten +48.. 1: +49.. 6: unwritten +55.. 1: +56.. 6: unwritten +62.. 1: +63.. 1: +64.. 3: unwritten +67.. 1: +68.. 3: unwritten +71.. 2: +73.. 1: +74.. 5: unwritten +79.. 2: +87.. 2: +95.. 1: eof +writing into existing 3 at pos 1 +wrote blk 86 +0.. 1: +1.. 14: unwritten +15.. 1: +16.. 3: unwritten +19.. 1: +20.. 4: unwritten +24.. 1: +25.. 1: +26.. 6: unwritten +32.. 1: +33.. 6: unwritten +39.. 1: +40.. 1: +41.. 3: unwritten +44.. 1: +45.. 3: unwritten +48.. 1: +49.. 6: unwritten +55.. 1: +56.. 6: unwritten +62.. 1: +63.. 1: +64.. 3: unwritten +67.. 1: +68.. 3: unwritten +71.. 2: +73.. 1: +74.. 5: unwritten +79.. 2: +81.. 5: unwritten +86.. 1: +87.. 2: +95.. 1: eof +writing into existing 3 at pos 2 +wrote blk 92 +0.. 1: +1.. 14: unwritten +15.. 1: +16.. 3: unwritten +19.. 1: +20.. 4: unwritten +24.. 1: +25.. 1: +26.. 6: unwritten +32.. 1: +33.. 6: unwritten +39.. 1: +40.. 1: +41.. 3: unwritten +44.. 1: +45.. 3: unwritten +48.. 1: +49.. 6: unwritten +55.. 1: +56.. 6: unwritten +62.. 1: +63.. 1: +64.. 3: unwritten +67.. 1: +68.. 3: unwritten +71.. 2: +73.. 1: +74.. 5: unwritten +79.. 2: +81.. 5: unwritten +86.. 1: +87.. 2: +89.. 3: unwritten +92.. 1: +93.. 2: unwritten +95.. 1: eof diff --git a/tests/tests/data-prealloc.sh b/tests/tests/data-prealloc.sh index b0bb81d2..09f42637 100644 --- a/tests/tests/data-prealloc.sh +++ b/tests/tests/data-prealloc.sh @@ -6,6 +6,15 @@ # t_require_commands scoutfs stat filefrag dd touch truncate +write_block() +{ + local file="$1" + local blk="$2" + + dd if=/dev/zero of="$file" bs=4096 seek=$blk count=1 conv=notrunc status=none + echo "wrote blk $blk" +} + write_forwards() { local prefix="$1" @@ -70,6 +79,25 @@ print_extents_found() filefrag "$prefix"* 2>&1 | grep "extent.*found" | t_filter_fs } +# +# print the logical start, len, and flags if they're there. +# +print_logical_extents() +{ + local file="$1" + + filefrag -v -b4096 "$file" 2>&1 | t_filter_fs | awk ' + ($1 ~ /[0-9]+:/) { + if ($NF !~ /[0-9]+:/) { + flags=$NF + } else { + flags="" + } + print $2, $6, flags + } + ' +} + t_save_all_sysfs_mount_options data_prealloc_blocks t_save_all_sysfs_mount_options data_prealloc_contig_only restore_options() @@ -133,4 +161,70 @@ t_set_sysfs_mount_option 0 data_prealloc_contig_only 0 write_forwards $prefix 3 print_extents_found $prefix +# +# prepare aligned regions of 8 blocks that we'll write into. +# We'll right into the first, last, and middle block of each +# region which was prepared with no existing extents, one at +# the start, and one at the end. +# +# Let's keep this last because it creates a ton of output to read +# through. +# +echo "== block writes into region allocs hole" +t_set_sysfs_mount_option 0 data_prealloc_blocks 8 +t_set_sysfs_mount_option 0 data_prealloc_contig_only 1 +touch "$prefix" +truncate -s 0 "$prefix" + +# write initial blocks in regions +base=0 +for sides in 0 1 2 3; do + for i in 0 1 2; do + case "$sides" in + # none + 0) ;; + # left + 1) write_block $prefix $((base + 0)) ;; + # right + 2) write_block $prefix $((base + 7)) ;; + # both + 3) write_block $prefix $((base + 0)) + write_block $prefix $((base + 7)) ;; + esac + ((base+=8)) + done +done + +echo before: +print_logical_extents "$prefix" + +# now write into the first, middle, and last empty block of each +t_set_sysfs_mount_option 0 data_prealloc_contig_only 0 +base=0 +for sides in 0 1 2 3; do + for i in 0 1 2; do + echo "writing into existing $sides at pos $i" + case "$sides" in + # none + 0) left=$base; right=$((base + 7));; + # left + 1) left=$((base + 1)); right=$((base + 7));; + # right + 2) left=$((base)); right=$((base + 6));; + # both + 3) left=$((base + 1)); right=$((base + 6));; + esac + case "$i" in + # start + 0) write_block $prefix $left ;; + # end + 1) write_block $prefix $right ;; + # mid (both has 6 blocks internally) + 2) write_block $prefix $((left + 3)) ;; + esac + print_logical_extents "$prefix" + ((base+=8)) + done +done + t_pass