Added a number of tests over mdir relocations, fixed minor bugs

- lfsr_btree_isnull still used tag and not only weight for null trees
- relocation forgot the mid
- missed relocation when uninlining, though this fix should be cleaned up
- made revision count behavior a bit more consistent

Note that the new tests may be -Gnor exclusive, they rely quite a bit on
exactly when compaction happens...
This commit is contained in:
Christopher Haster
2023-05-14 19:46:23 -05:00
parent 7b1c35a99b
commit cd2d54855e
2 changed files with 1416 additions and 13 deletions
+30 -11
View File
@@ -2911,7 +2911,7 @@ static inline bool lfsr_btree_isinlined(const lfsr_btree_t *btree) {
}
static inline bool lfsr_btree_isnull(const lfsr_btree_t *btree) {
return lfsr_btree_isinlined(btree) && btree->inlined.tag == 0;
return btree->weight == 0x80000000;
}
static inline lfs_size_t lfsr_btree_weight(const lfsr_btree_t *btree) {
@@ -4448,7 +4448,7 @@ static int lfsr_mdir_alloc(lfs_t *lfs, lfsr_mdir_t *mdir, lfs_ssize_t mid) {
// align revision count in new mdirs to our block_cycles, this makes sure
// we don't immediately try to relocate the mdir
if (lfs->cfg->block_cycles > 0) {
rev = lfs_alignup(rev, lfs->cfg->block_cycles);
rev = lfs_alignup(rev+1, lfs->cfg->block_cycles)-1;
}
// setup mdir struct
@@ -4657,7 +4657,6 @@ static int lfsr_mdir_compact_(lfs_t *lfs, lfsr_mdir_t *mdir,
err = lfsr_rbyd_appendall(lfs, &mdir->rbyd, start_id, end_id,
attr2s, attr2_count);
printf("hey %d\n", err);
if (err) {
LFS_ASSERT(err != LFS_ERR_RANGE);
return err;
@@ -4733,15 +4732,10 @@ compact:;
if (lfs->cfg->block_cycles > 0
&& (mdir->rbyd.rev+1) % lfs->cfg->block_cycles == 0) {
// allocate a new mdir for relocation
err = lfsr_mdir_alloc(lfs, &mdir_, 0);
err = lfsr_mdir_alloc(lfs, &mdir_, mdir->mid);
if (err) {
return err;
}
LFS_DEBUG("Relocating mdir 0x{%"PRIx32",%"PRIx32"} "
"-> 0x{%"PRIx32",%"PRIx32"}",
mdir->rbyd.block, mdir->other_block,
mdir_.rbyd.block, mdir_.other_block);
}
while (true) {
@@ -5008,6 +5002,20 @@ static int lfsr_mdir_commit(lfs_t *lfs, lfsr_mdir_t *mdir, lfs_ssize_t *rid,
}
}
// TODO adding this here is a cludge and should definitely
// be deduplicated
//
// if we've compacted the mroot block_cycles number of times,
// trigger a relocation
if (lfs->cfg->block_cycles > 0
&& (mroot_.rbyd.rev+1) % lfs->cfg->block_cycles == 0) {
// allocate a new mdir for relocation
err = lfsr_mdir_alloc(lfs, &mroot_, -1);
if (err) {
return err;
}
}
// TODO yeah we're going to need a wide-rm
err = lfsr_mdir_compact_(lfs, &mroot_, -1, 0,
mdir, attrs, attr_count,
@@ -5190,6 +5198,11 @@ static int lfsr_mdir_commit(lfs_t *lfs, lfsr_mdir_t *mdir, lfs_ssize_t *rid,
// relocate a normal mdir
} else {
LFS_DEBUG("Relocating mdir 0x{%"PRIx32",%"PRIx32"} "
"-> 0x{%"PRIx32",%"PRIx32"}",
mdir->rbyd.block, mdir->other_block,
mdir_.rbyd.block, mdir_.other_block);
// update our mtree
uint8_t buf[LFSR_MPAIR_DSIZE];
lfs_ssize_t d = lfsr_mdir_todisk(lfs, &mdir_, buf);
@@ -5213,7 +5226,7 @@ static int lfsr_mdir_commit(lfs_t *lfs, lfsr_mdir_t *mdir, lfs_ssize_t *rid,
// need to update mtree?
if (dirtymtree) {
LFS_ASSERT(mdir->mid != -1);
LFS_ASSERT(mdir_.mid != -1);
// commit mtree
//
@@ -5259,6 +5272,11 @@ static int lfsr_mdir_commit(lfs_t *lfs, lfsr_mdir_t *mdir, lfs_ssize_t *rid,
break;
}
LFS_DEBUG("Relocating mroot 0x{%"PRIx32",%"PRIx32"} "
"-> 0x{%"PRIx32",%"PRIx32"}",
mchildroot.rbyd.block, mchildroot.other_block,
mchildroot_.rbyd.block, mchildroot_.other_block);
// commit mrootchild
uint8_t buf[LFSR_MPAIR_DSIZE];
lfs_ssize_t d = lfsr_mdir_todisk(lfs, &mchildroot_, buf);
@@ -5332,6 +5350,7 @@ static int lfsr_mdir_commit(lfs_t *lfs, lfsr_mdir_t *mdir, lfs_ssize_t *rid,
// update mdir to follow requested rid
lfs_ssize_t rid_ = *rid;
LFS_ASSERT(rid_ <= (lfs_ssize_t)mdir->rbyd.weight);
if (rid_ < 0) {
*mdir = mroot_;
} else if ((lfs_size_t)rid_ < mdir_.rbyd.weight) {
@@ -6671,7 +6690,7 @@ static int lfsr_formatinited(lfs_t *lfs) {
for (int i = 0; i < 2; i++) {
// write superblock to both rbyds in the root mroot to hopefully
// avoid mounting an older filesystem on disk
lfsr_rbyd_t rbyd = {.block=i, .rev=i+1, .off=0, .trunk=0};
lfsr_rbyd_t rbyd = {.block=i, .rev=i-1, .off=0, .trunk=0};
int err = lfsr_bd_erase(lfs, rbyd.block);
if (err) {
+1386 -2
View File
File diff suppressed because it is too large Load Diff