Always log mbid=-1 for mroots and inlined mdirs

So mbid=0 now implies the mdir is not inlined.

Downsides:

- A bit more work to calculate
- May lose information due to masking everything when mtree.weight==0
- Risk of confusion when in-lfs.c state doesn't match (mbid=-1 is
  implied by mtree.weight==0)

Upsides:

- Includes more information about the topology of the mtree
- Avoids multiple dbgmbids for the same physical mdir

Also added lfsr_dbgmbid and lfsr_dbgmrid to help make logging
easier/more consistent.

And updated dbg scripts.
This commit is contained in:
Christopher Haster
2025-04-17 01:41:44 -05:00
parent 89356fc697
commit 3ca6670dcd
5 changed files with 56 additions and 51 deletions
+40 -27
View File
@@ -6689,6 +6689,19 @@ static inline lfsr_srid_t lfsr_mrid(const lfs_t *lfs, lfsr_smid_t mid) {
| (mid & ((1 << lfs->mbits) - 1));
}
// these should only be used for logging
static inline lfsr_sbid_t lfsr_dbgmbid(const lfs_t *lfs, lfsr_smid_t mid) {
if (lfs->mtree.weight == 0) {
return -1;
} else {
return mid >> lfs->mbits;
}
}
static inline lfsr_srid_t lfsr_dbgmrid(const lfs_t *lfs, lfsr_smid_t mid) {
return lfsr_mrid(lfs, mid);
}
/// metadata-pointer things ///
@@ -7296,7 +7309,7 @@ static int lfsr_mdir_fetch(lfs_t *lfs, lfsr_mdir_t *mdir,
LFS_DEBUG("Fetched mdir %"PRId32" "
"0x{%"PRIx32",%"PRIx32"}.%"PRIx32" w%"PRId32", "
"cksum %"PRIx32,
mdir->mid >> lfs->mbits,
lfsr_dbgmbid(lfs, mdir->mid),
mdir->rbyd.blocks[0], mdir->rbyd.blocks[1],
lfsr_rbyd_trunk(&mdir->rbyd),
mdir->rbyd.weight,
@@ -8124,7 +8137,7 @@ relocate:;
// without relocating
if (err == LFS_ERR_NOSPC) {
LFS_WARN("Overcompacting mdir %"PRId32" 0x{%"PRIx32",%"PRIx32"}",
mdir->mid >> lfs->mbits,
lfsr_dbgmbid(lfs, mdir->mid),
mdir->rbyd.blocks[0], mdir->rbyd.blocks[1]);
overcompacted = true;
@@ -8145,7 +8158,7 @@ compact:;
#ifdef LFS_DEBUGMDIRCOMMITS
LFS_DEBUG("Compacting mdir %"PRId32" 0x{%"PRIx32",%"PRIx32"} "
"-> 0x{%"PRIx32",%"PRIx32"}",
mdir->mid >> lfs->mbits,
lfsr_dbgmbid(lfs, mdir->mid),
mdir->rbyd.blocks[0], mdir->rbyd.blocks[1],
mdir_.rbyd.blocks[0], mdir_.rbyd.blocks[1]);
#endif
@@ -8398,7 +8411,7 @@ static int lfsr_mdir_commit(lfs_t *lfs, lfsr_mdir_t *mdir,
LFS_INFO("Splitting mdir %"PRId32" 0x{%"PRIx32",%"PRIx32"} "
"-> 0x{%"PRIx32",%"PRIx32"}, 0x{%"PRIx32",%"PRIx32"}",
mdir->mid >> lfs->mbits,
lfsr_dbgmbid(lfs, mdir->mid),
mdir->rbyd.blocks[0], mdir->rbyd.blocks[1],
mdir_[0].rbyd.blocks[0], mdir_[0].rbyd.blocks[1],
mdir_[1].rbyd.blocks[0], mdir_[1].rbyd.blocks[1]);
@@ -8409,17 +8422,17 @@ static int lfsr_mdir_commit(lfs_t *lfs, lfsr_mdir_t *mdir,
// both siblings reduced to zero
if (mdir_[0].rbyd.weight == 0 && mdir_[1].rbyd.weight == 0) {
LFS_INFO("Dropping mdir %"PRId32" 0x{%"PRIx32",%"PRIx32"}",
mdir_[0].mid >> lfs->mbits,
lfsr_dbgmbid(lfs, mdir_[0].mid),
mdir_[0].rbyd.blocks[0], mdir_[0].rbyd.blocks[1]);
LFS_INFO("Dropping mdir %"PRId32" 0x{%"PRIx32",%"PRIx32"}",
mdir_[1].mid >> lfs->mbits,
lfsr_dbgmbid(lfs, mdir_[1].mid),
mdir_[1].rbyd.blocks[0], mdir_[1].rbyd.blocks[1]);
goto dropped;
// one sibling reduced to zero
} else if (mdir_[0].rbyd.weight == 0) {
LFS_INFO("Dropping mdir %"PRId32" 0x{%"PRIx32",%"PRIx32"}",
mdir_[0].mid >> lfs->mbits,
lfsr_dbgmbid(lfs, mdir_[0].mid),
mdir_[0].rbyd.blocks[0], mdir_[0].rbyd.blocks[1]);
lfsr_mdir_sync(&mdir_[0], &mdir_[1]);
goto relocated;
@@ -8427,7 +8440,7 @@ static int lfsr_mdir_commit(lfs_t *lfs, lfsr_mdir_t *mdir,
// other sibling reduced to zero
} else if (mdir_[1].rbyd.weight == 0) {
LFS_INFO("Dropping mdir %"PRId32" 0x{%"PRIx32",%"PRIx32"}",
mdir_[1].mid >> lfs->mbits,
lfsr_dbgmbid(lfs, mdir_[1].mid),
mdir_[1].rbyd.blocks[0], mdir_[1].rbyd.blocks[1]);
goto relocated;
}
@@ -8490,7 +8503,7 @@ static int lfsr_mdir_commit(lfs_t *lfs, lfsr_mdir_t *mdir,
// need to drop?
} else if (err == LFS_ERR_NOENT) {
LFS_INFO("Dropping mdir %"PRId32" 0x{%"PRIx32",%"PRIx32"}",
mdir->mid >> lfs->mbits,
lfsr_dbgmbid(lfs, mdir->mid),
mdir->rbyd.blocks[0], mdir->rbyd.blocks[1]);
// set weight to zero
mdir_[0].rbyd.weight = 0;
@@ -8524,7 +8537,7 @@ static int lfsr_mdir_commit(lfs_t *lfs, lfsr_mdir_t *mdir,
&& lfsr_mdir_cmp(mdir, &lfs->mroot) != 0) {
LFS_INFO("Relocating mdir %"PRId32" 0x{%"PRIx32",%"PRIx32"} "
"-> 0x{%"PRIx32",%"PRIx32"}",
mdir->mid >> lfs->mbits,
lfsr_dbgmbid(lfs, mdir->mid),
mdir->rbyd.blocks[0], mdir->rbyd.blocks[1],
mdir_[0].rbyd.blocks[0], mdir_[0].rbyd.blocks[1]);
@@ -8827,7 +8840,7 @@ static int lfsr_mdir_commit(lfs_t *lfs, lfsr_mdir_t *mdir,
LFS_DEBUG("Committed mdir %"PRId32" "
"0x{%"PRIx32",%"PRIx32"}.%"PRIx32" w%"PRId32", "
"cksum %"PRIx32,
mdir->mid >> lfs->mbits,
lfsr_dbgmbid(lfs, mdir->mid),
mdir->rbyd.blocks[0], mdir->rbyd.blocks[1],
lfsr_rbyd_trunk(&mdir->rbyd),
mdir->rbyd.weight,
@@ -9506,7 +9519,7 @@ static int lfsr_mtree_traverse(lfs_t *lfs, lfsr_traversal_t *t,
LFS_ERROR("Found mdir cksum mismatch %"PRId32" "
"0x{%"PRIx32",%"PRIx32"}, "
"cksum %08"PRIx32" (!= %08"PRIx32")",
mdir->mid >> lfs->mbits,
lfsr_dbgmbid(lfs, mdir->mid),
mdir->rbyd.blocks[0],
mdir->rbyd.blocks[1],
mdir->rbyd.cksum,
@@ -9649,7 +9662,7 @@ dropped:;
lfsr_mdir_t *mdir = (lfsr_mdir_t*)bptr.data.u.buffer;
LFS_INFO("Compacting mdir %"PRId32" 0x{%"PRIx32",%"PRIx32"} "
"(%"PRId32" > %"PRId32")",
mdir->mid >> lfs->mbits,
lfsr_dbgmbid(lfs, mdir->mid),
mdir->rbyd.blocks[0],
mdir->rbyd.blocks[1],
lfsr_rbyd_eoff(&mdir->rbyd),
@@ -13733,14 +13746,14 @@ static int lfsr_mountinited(lfs_t *lfs) {
// found pending grms? this should only happen if we lost power
if (lfsr_grm_count(lfs) == 2) {
LFS_INFO("Found pending grm %"PRId32".%"PRId32" %"PRId32".%"PRId32,
lfsr_mbid(lfs, lfs->grm.mids[0]) >> lfs->mbits,
lfsr_mrid(lfs, lfs->grm.mids[0]),
lfsr_mbid(lfs, lfs->grm.mids[1]) >> lfs->mbits,
lfsr_mrid(lfs, lfs->grm.mids[1]));
lfsr_dbgmbid(lfs, lfs->grm.mids[0]),
lfsr_dbgmrid(lfs, lfs->grm.mids[0]),
lfsr_dbgmbid(lfs, lfs->grm.mids[1]),
lfsr_dbgmrid(lfs, lfs->grm.mids[1]));
} else if (lfsr_grm_count(lfs) == 1) {
LFS_INFO("Found pending grm %"PRId32".%"PRId32,
lfsr_mbid(lfs, lfs->grm.mids[0]) >> lfs->mbits,
lfsr_mrid(lfs, lfs->grm.mids[0]));
lfsr_dbgmbid(lfs, lfs->grm.mids[0]),
lfsr_dbgmrid(lfs, lfs->grm.mids[0]));
}
return 0;
@@ -14074,14 +14087,14 @@ lfs_ssize_t lfsr_fs_size(lfs_t *lfs) {
static int lfsr_fs_fixgrm(lfs_t *lfs) {
if (lfsr_grm_count(lfs) == 2) {
LFS_INFO("Fixing grm %"PRId32".%"PRId32" %"PRId32".%"PRId32,
lfsr_mbid(lfs, lfs->grm.mids[0]) >> lfs->mbits,
lfsr_mrid(lfs, lfs->grm.mids[0]),
lfsr_mbid(lfs, lfs->grm.mids[1]) >> lfs->mbits,
lfsr_mrid(lfs, lfs->grm.mids[1]));
lfsr_dbgmbid(lfs, lfs->grm.mids[0]),
lfsr_dbgmrid(lfs, lfs->grm.mids[0]),
lfsr_dbgmbid(lfs, lfs->grm.mids[1]),
lfsr_dbgmrid(lfs, lfs->grm.mids[1]));
} else if (lfsr_grm_count(lfs) == 1) {
LFS_INFO("Fixing grm %"PRId32".%"PRId32,
lfsr_mbid(lfs, lfs->grm.mids[0]) >> lfs->mbits,
lfsr_mrid(lfs, lfs->grm.mids[0]));
lfsr_dbgmbid(lfs, lfs->grm.mids[0]),
lfsr_dbgmrid(lfs, lfs->grm.mids[0]));
}
while (lfsr_grm_count(lfs) > 0) {
@@ -14145,8 +14158,8 @@ static int lfsr_mdir_mkconsistent(lfs_t *lfs, lfsr_mdir_t *mdir) {
// we found an orphaned stickynote, remove
LFS_INFO("Fixing orphaned stickynote %"PRId32".%"PRId32,
lfsr_mbid(lfs, mdir->mid) >> lfs->mbits,
lfsr_mrid(lfs, mdir->mid));
lfsr_dbgmbid(lfs, mdir->mid),
lfsr_dbgmrid(lfs, mdir->mid));
lfs_alloc_ckpoint(lfs);
err = lfsr_mdir_commit(lfs, mdir, LFSR_RATTRS(
+4 -6
View File
@@ -1777,11 +1777,10 @@ class Mtree:
else:
return None
mdir = Mdir(0, self.mroot)
if path:
return mdir, path_
return self.mroot, path_
else:
return mdir
return self.mroot
# mtree? lookup in mtree
else:
@@ -2151,11 +2150,10 @@ class Mtree:
# no mtree? must be inlined in mroot
if self.mtree is None:
mdir = Mdir(0, self.mroot)
if path:
return mdir, path_
return self.mroot, path_
else:
return mdir
return self.mroot
# mtree? find name in mtree
else:
+4 -6
View File
@@ -1807,11 +1807,10 @@ class Mtree:
else:
return None
mdir = Mdir(0, self.mroot)
if path:
return mdir, path_
return self.mroot, path_
else:
return mdir
return self.mroot
# mtree? lookup in mtree
else:
@@ -2181,11 +2180,10 @@ class Mtree:
# no mtree? must be inlined in mroot
if self.mtree is None:
mdir = Mdir(0, self.mroot)
if path:
return mdir, path_
return self.mroot, path_
else:
return mdir
return self.mroot
# mtree? find name in mtree
else:
+4 -6
View File
@@ -1734,11 +1734,10 @@ class Mtree:
else:
return None
mdir = Mdir(0, self.mroot)
if path:
return mdir, path_
return self.mroot, path_
else:
return mdir
return self.mroot
# mtree? lookup in mtree
else:
@@ -2108,11 +2107,10 @@ class Mtree:
# no mtree? must be inlined in mroot
if self.mtree is None:
mdir = Mdir(0, self.mroot)
if path:
return mdir, path_
return self.mroot, path_
else:
return mdir
return self.mroot
# mtree? find name in mtree
else:
+4 -6
View File
@@ -1700,11 +1700,10 @@ class Mtree:
else:
return None
mdir = Mdir(0, self.mroot)
if path:
return mdir, path_
return self.mroot, path_
else:
return mdir
return self.mroot
# mtree? lookup in mtree
else:
@@ -2074,11 +2073,10 @@ class Mtree:
# no mtree? must be inlined in mroot
if self.mtree is None:
mdir = Mdir(0, self.mroot)
if path:
return mdir, path_
return self.mroot, path_
else:
return mdir
return self.mroot
# mtree? find name in mtree
else: