From 62e3d2109d256d25a48e5d91675f85fbac6c7b3d Mon Sep 17 00:00:00 2001 From: Christopher Haster Date: Fri, 31 Jan 2025 03:31:01 -0600 Subject: [PATCH] Fixed test_traversal_compact_mroot_split NOSPC error This is a pretty suspicious looking test failure, considering the recent changes to the mroot/mtree and related splitting logic, but it just turned out to be a bug in the test logic. Sort of. This loop is trying to create an mroot that will both compact and split, but it doesn't check if the mdir was split prematurely, so it just keeps adding files until we hit a true LFS_ERR_NOSPC condition: if ((file1.o.o.mdir.rbyd.eoff & 0x7fffffff) > GC_COMPACT_THRESH && estimate > BLOCK_SIZE/2) { break; } The solution is to make the filename size a bit smaller so we don't split too early. I also added some asserts to catch premature splits in case this happens again. These tests are a bit delicate. --- tests/test_traversal.toml | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/tests/test_traversal.toml b/tests/test_traversal.toml index f636152d..7a36c4db 100644 --- a/tests/test_traversal.toml +++ b/tests/test_traversal.toml @@ -5778,6 +5778,8 @@ code = ''' // create enough files to both compact and split lfs_size_t i = 0; while (true) { + // we should not have split yet + assert(lfs.mtree.weight == 0); // we need internals to check this lfs_ssize_t estimate = lfsr_mdir_estimate__(&lfs, &file1.o.o.mdir, -1, -1, @@ -5789,7 +5791,7 @@ code = ''' } char name[256]; - sprintf(name, "medusaaaaaaaaaaaaaaaaaaaaaaaaaaaa%03x", i); + sprintf(name, "medusaaaaaaaaaaaaaaaa%03x", i); lfsr_file_t file; lfsr_file_open(&lfs, &file, name, LFS_O_WRONLY | LFS_O_CREAT | LFS_O_EXCL) => 0; @@ -6204,7 +6206,10 @@ code = ''' // create enough files to both compact and split i = 0; + orig = lfs.mtree.weight; while (true) { + // we should not have split yet + assert(lfs.mtree.weight == orig); // we need internals to check this lfs_ssize_t estimate = lfsr_mdir_estimate__(&lfs, &file2.o.o.mdir, -1, -1, @@ -6216,7 +6221,7 @@ code = ''' } char name[256]; - sprintf(name, "medusaaaaaaaaaaaaaaaaaaaaaaaaaaaa%03x", i); + sprintf(name, "medusaaaaaaaaaaaaaaaa%03x", i); lfsr_file_t file; lfsr_file_open(&lfs, &file, name, LFS_O_WRONLY | LFS_O_CREAT | LFS_O_EXCL) => 0;