From 94941806c723d58c5ff1a8068c9d8f913df9958e Mon Sep 17 00:00:00 2001 From: Christopher Haster Date: Sun, 27 Aug 2023 21:14:26 -0500 Subject: [PATCH] Changed mtree to be weighted by mdir upper bound More on this when explaining compressed mids, but basically the idea is instead of just storing all mdirs in our mtree as single element entries, store each mdir in as a weighted entry, where the weight is a known upper bound on the possible number of mid entries in a single mdir. With the current mid representation, this just complicates things without much benefits. But with compressed mids it allows us to lookup mdirs with the mid directly, and avoid decoding the bid from the mid in some cases. The mid-per-mdir upper bound is derived from the block size. We know: 1. Each tag needs <=2 alts+null with our current compaction strategy 2. Each tag/alt encodes to a minimum of 4 bytes This gives us ~4*4 or ~16 bytes per mid at minimum. If we cram an mdir with the smallest possible mids, this gives us at most ~block_size/16 mids in a single mdir before the mdir runs out of space. Note we can't assume ~1/2 block utilization here, as an mdir may temporarily fill with more mids before compaction occurs. --- lfs.c | 70 ++++++--- lfs.h | 7 +- tests/test_alloc.toml | 2 +- tests/test_mtree.toml | 350 +++++++++++++++++++++--------------------- 4 files changed, 231 insertions(+), 198 deletions(-) diff --git a/lfs.c b/lfs.c index 5050af50..f589861b 100644 --- a/lfs.c +++ b/lfs.c @@ -1536,6 +1536,18 @@ static int lfsr_data_readecksum(lfs_t *lfs, lfsr_data_t *data, /// Metadata-id things /// +static inline lfs_size_t lfsr_mbidweight(lfs_t *lfs) { + return 1 << lfs->mrid_bits; +} + +static inline lfs_ssize_t lfsr_mridmask(lfs_t *lfs) { + return (1 << lfs->mrid_bits) - 1; +} + +static inline lfs_ssize_t lfsr_mbidmask(lfs_t *lfs) { + return ~lfsr_mridmask(lfs); +} + #define LFSR_MID(_bid, _rid) ((lfsr_mid_t){.bid=_bid, .rid=_rid}) #define LFSR_MID_MROOT LFSR_MID((lfsr_smbid_t)0x80000000, 0) @@ -4792,8 +4804,8 @@ static int lfsr_mtree_lookup(lfs_t *lfs, lfsr_mid_t mid, lfsr_mdir_t *mdir_) { LFS_ASSERT(mid.bid < (lfs_ssize_t)lfsr_mtree_weight(lfs)); lfsr_tag_t tag; lfsr_data_t data; - int err = lfsr_btree_lookup(lfs, &lfs->mtree, mid.bid, - &tag, NULL, &data); + int err = lfsr_btree_lookupnext(lfs, &lfs->mtree, mid.bid, + (lfs_size_t*)&mid.bid, &tag, NULL, &data); if (err) { return err; } @@ -5203,7 +5215,7 @@ static int lfsr_mdir_commit(lfs_t *lfs, lfsr_mdir_t *mdir, // we're uninlining. LFS_ASSERT(lfsr_btree_weight(&mtree_) == 0); int err = lfsr_btree_commit(lfs, &mtree_, LFSR_ATTRS( - LFSR_ATTR(0, MDIR, +1, NULL))); + LFSR_ATTR(0, MDIR, +lfsr_mbidweight(lfs), NULL))); if (err) { return err; } @@ -5221,8 +5233,9 @@ static int lfsr_mdir_commit(lfs_t *lfs, lfsr_mdir_t *mdir, } // compact into new mdir tags < split_rid - lfsr_smbid_t mbid = lfsr_mdir_mid(mdir).bid; - int err = lfsr_mdir_compact_(lfs, &mdir_, mbid, 0, split_rid, + lfsr_smbid_t mbid = lfsr_mdir_mid(mdir).bid | lfsr_mridmask(lfs); + int err = lfsr_mdir_compact_(lfs, &mdir_, + mbid, 0, split_rid, mdir, attrs, attr_count, NULL, 0); if (err) { LFS_ASSERT(err != LFS_ERR_RANGE); @@ -5230,7 +5243,8 @@ static int lfsr_mdir_commit(lfs_t *lfs, lfsr_mdir_t *mdir, } // compact into new mdir tags >= split_rid - err = lfsr_mdir_compact_(lfs, &msibling_, mbid, split_rid, -1, + err = lfsr_mdir_compact_(lfs, &msibling_, + mbid+lfsr_mbidweight(lfs), split_rid, -1, mdir, attrs, attr_count, NULL, 0); if (err) { LFS_ASSERT(err != LFS_ERR_RANGE); @@ -5262,7 +5276,8 @@ static int lfsr_mdir_commit(lfs_t *lfs, lfsr_mdir_t *mdir, // update our mtree int err = lfsr_btree_commit(lfs, &mtree_, LFSR_ATTRS( - LFSR_ATTR(mbid, RM, -1, NULL))); + LFSR_ATTR(mdir_.mid.bid, RM, -lfsr_mbidweight(lfs), + NULL))); if (err) { return err; } @@ -5285,7 +5300,7 @@ static int lfsr_mdir_commit(lfs_t *lfs, lfsr_mdir_t *mdir, } int err = lfsr_btree_commit(lfs, &mtree_, LFSR_ATTRS( - LFSR_ATTR(mbid, MDIR, 0, + LFSR_ATTR(mdir_.mid.bid, MDIR, 0, BUF(mdir_buf, mdir_dsize)))); if (err) { return err; @@ -5299,6 +5314,7 @@ static int lfsr_mdir_commit(lfs_t *lfs, lfsr_mdir_t *mdir, // mark as dropped mdir_.u.r.rbyd.trunk = 0; + msibling_.mid.bid -= lfsr_mbidweight(lfs); // update our mtree uint8_t msibling_buf[LFSR_MDIR_DSIZE]; @@ -5309,7 +5325,7 @@ static int lfsr_mdir_commit(lfs_t *lfs, lfsr_mdir_t *mdir, } int err = lfsr_btree_commit(lfs, &mtree_, LFSR_ATTRS( - LFSR_ATTR(mbid, MDIR, 0, + LFSR_ATTR(msibling_.mid.bid, MDIR, 0, BUF(msibling_buf, msibling_dsize)))); if (err) { return err; @@ -5317,10 +5333,6 @@ static int lfsr_mdir_commit(lfs_t *lfs, lfsr_mdir_t *mdir, // no siblings reduced to zero } else { - // adjust our sibling's mid, do this here in case other sibling - // was dropped - msibling_.mid.bid += 1; - // update out mtree // lookup first name in sibling to use as the split name @@ -5349,10 +5361,11 @@ static int lfsr_mdir_commit(lfs_t *lfs, lfsr_mdir_t *mdir, } err = lfsr_btree_commit(lfs, &mtree_, LFSR_ATTRS( - LFSR_ATTR(mbid, MDIR, 0, + LFSR_ATTR(mdir_.mid.bid, MDIR, 0, BUF(mdir_buf, mdir_dsize)), - LFSR_ATTR(mbid+1, BRANCH, +1, DATA(split_data)), - LFSR_ATTR(mbid+1, MDIR, 0, + LFSR_ATTR(mdir_.mid.bid+1, BRANCH, +lfsr_mbidweight(lfs), + DATA(split_data)), + LFSR_ATTR(msibling_.mid.bid, MDIR, 0, BUF(msibling_buf, msibling_dsize)))); if (err) { return err; @@ -5372,7 +5385,7 @@ static int lfsr_mdir_commit(lfs_t *lfs, lfsr_mdir_t *mdir, // update our mtree int err = lfsr_btree_commit(lfs, &mtree_, LFSR_ATTRS( - LFSR_ATTR(mdir->mid.bid, RM, -1, NULL))); + LFSR_ATTR(mdir->mid.bid, RM, -lfsr_mbidweight(lfs), NULL))); if (err) { return err; } @@ -5446,7 +5459,7 @@ static int lfsr_mdir_commit(lfs_t *lfs, lfsr_mdir_t *mdir, LFS_ASSERT(grm->rms[j].rid <= (lfs_ssize_t)mdir->u.m.weight); if (grm->rms[j].rid >= (lfs_ssize_t)mdir_.u.m.weight) { - grm->rms[j].bid += 1; + grm->rms[j].bid = msibling_.mid.bid; grm->rms[j].rid -= mdir_.u.m.weight; } // update mid if we had a split or drop @@ -6062,7 +6075,8 @@ static int lfsr_mtree_traversal_next(lfs_t *lfs, if (err == LFS_ERR_NOENT) { lfs->mtree = LFSR_BTREE_NULL; } else if (tag == LFSR_TAG_MDIR) { - err = lfsr_data_readbtreeinlined(lfs, &data, LFSR_TAG_MDIR, 1, + err = lfsr_data_readbtreeinlined(lfs, &data, + LFSR_TAG_MDIR, lfsr_mbidweight(lfs), &lfs->mtree); if (err) { return err; @@ -10862,6 +10876,24 @@ static int lfs_init(lfs_t *lfs, const struct lfs_config *cfg) { // TODO maybe reorganize this function? + // compute the number of bits we need to reserve for metadata rids + // + // This is equivalent to the nlog2 of the maximum number of rids we can + // ever have in a single mdir. With some knowledge of our system we can + // find a conservative, but useful, limit to this upper bound: + // + // - Each tag needs <=2 alts+null with our current compaction strategy + // - Each tag/alt encodes to a minimum of 4 bytes + // + // This gives us ~4*4 or ~16 bytes per mid at minimum. If we cram an mdir + // with the smallest possible mids, this gives us at most ~block_size/16 + // mids in a single mdir before the mdir runs out of space. + // + // Note we can't assume ~1/2 block utilization here, as an mdir may + // temporarily fill with more mids before compaction occurs. + // + lfs->mrid_bits = lfs_nlog2(lfs->cfg->block_size/16); + // zero linked-lists of opened mdirs lfs->opened[LFS_TYPE_REG] = NULL; lfs->opened[LFS_TYPE_DIR] = NULL; diff --git a/lfs.h b/lfs.h index 8b1aa3b7..fb7ef59d 100644 --- a/lfs.h +++ b/lfs.h @@ -517,13 +517,14 @@ typedef struct lfs { lfs_size_t attr_max; // begin lfsr things - lfsr_mdir_t mroot; - lfsr_btree_t mtree; - lfsr_grm_t grm; uint8_t pgrm[LFSR_GRM_DSIZE]; uint8_t dgrm[LFSR_GRM_DSIZE]; + uint8_t mrid_bits; + lfsr_mdir_t mroot; + lfsr_btree_t mtree; + // linked-lists of opened mdirs, we keep a separate linked-list // for each type since these need to be handled a bit differently lfsr_openedmdir_t *opened[2]; diff --git a/tests/test_alloc.toml b/tests/test_alloc.toml index 0657008e..a445c7cb 100644 --- a/tests/test_alloc.toml +++ b/tests/test_alloc.toml @@ -146,7 +146,7 @@ code = ''' lfs_size_t i = 0; for (lfs_ssize_t mid = 0; mid < lfs_smax32(lfsr_mtree_weight(&lfs), 1); - mid++) { + mid += lfsr_mbidweight(&lfs)) { lfsr_mdir_t mdir; lfsr_mtree_lookup(&lfs, LFSR_MID(mid, -1), &mdir) => 0; for (mdir.mid.rid = 0; diff --git a/tests/test_mtree.toml b/tests/test_mtree.toml index abb938bb..8daf3e05 100644 --- a/tests/test_mtree.toml +++ b/tests/test_mtree.toml @@ -182,7 +182,7 @@ code = ''' lfsr_mdir_commit(&lfs, &lfs.mroot, NULL, 0) => 0; // assert mdir was unininlined correctly - assert(lfsr_mtree_weight(&lfs) == 1); + assert(lfsr_mtree_weight(&lfs) == 1*lfsr_mbidweight(&lfs)); // assert mroot now has no entries assert(lfs.mroot.u.m.weight == 0); @@ -193,7 +193,7 @@ code = ''' // assert that our entry is still in the mtree lfsr_mdir_t mdir; - lfsr_mtree_lookup(&lfs, LFSR_MID(0, -1), &mdir) => 0; + lfsr_mtree_lookup(&lfs, LFSR_MID(0*lfsr_mbidweight(&lfs), -1), &mdir) => 0; assert(mdir.u.m.weight == 1); lfsr_mdir_get(&lfs, &mdir, 0, LFSR_TAG_REG, @@ -207,7 +207,7 @@ code = ''' lfsr_mount(&lfs, CFG) => 0; // assert mdir was unininlined correctly - assert(lfsr_mtree_weight(&lfs) == 1); + assert(lfsr_mtree_weight(&lfs) == 1*lfsr_mbidweight(&lfs)); // assert mroot now has no entries assert(lfs.mroot.u.m.weight == 0); @@ -217,7 +217,7 @@ code = ''' assert(memcmp(buffer, "a", 1) == 0); // assert that our entry is still in the mtree - lfsr_mtree_lookup(&lfs, LFSR_MID(0, -1), &mdir) => 0; + lfsr_mtree_lookup(&lfs, LFSR_MID(0*lfsr_mbidweight(&lfs), -1), &mdir) => 0; assert(mdir.u.m.weight == 1); lfsr_mdir_get(&lfs, &mdir, 0, LFSR_TAG_REG, @@ -255,19 +255,19 @@ code = ''' lfsr_mdir_commit(&lfs, &lfs.mroot, NULL, 0) => 0; // assert mdirs were unininlined and split - assert(lfsr_mtree_weight(&lfs) == 2); + assert(lfsr_mtree_weight(&lfs) == 2*lfsr_mbidweight(&lfs)); // assert mroot now has no entries assert(lfs.mroot.u.m.weight == 0); // assert that our entries are still in the mtree lfsr_mdir_t mdir; - lfsr_mtree_lookup(&lfs, LFSR_MID(0, -1), &mdir) => 0; + lfsr_mtree_lookup(&lfs, LFSR_MID(0*lfsr_mbidweight(&lfs), -1), &mdir) => 0; assert(mdir.u.m.weight == 1); lfsr_mdir_get(&lfs, &mdir, 0, LFSR_TAG_REG, buffer, SIZE) => SIZE; assert(memcmp(buffer, "a", 1) == 0); - lfsr_mtree_lookup(&lfs, LFSR_MID(1, -1), &mdir) => 0; + lfsr_mtree_lookup(&lfs, LFSR_MID(1*lfsr_mbidweight(&lfs), -1), &mdir) => 0; assert(mdir.u.m.weight == 1); lfsr_mdir_get(&lfs, &mdir, 0, LFSR_TAG_REG, buffer, SIZE) => SIZE; @@ -280,18 +280,18 @@ code = ''' lfsr_mount(&lfs, CFG) => 0; // assert mdirs were unininlined and split - assert(lfsr_mtree_weight(&lfs) == 2); + assert(lfsr_mtree_weight(&lfs) == 2*lfsr_mbidweight(&lfs)); // assert mroot now has no entries assert(lfs.mroot.u.m.weight == 0); // assert that our entries are still in the mtree - lfsr_mtree_lookup(&lfs, LFSR_MID(0, -1), &mdir) => 0; + lfsr_mtree_lookup(&lfs, LFSR_MID(0*lfsr_mbidweight(&lfs), -1), &mdir) => 0; assert(mdir.u.m.weight == 1); lfsr_mdir_get(&lfs, &mdir, 0, LFSR_TAG_REG, buffer, SIZE) => SIZE; assert(memcmp(buffer, "a", 1) == 0); - lfsr_mtree_lookup(&lfs, LFSR_MID(1, -1), &mdir) => 0; + lfsr_mtree_lookup(&lfs, LFSR_MID(1*lfsr_mbidweight(&lfs), -1), &mdir) => 0; assert(mdir.u.m.weight == 1); lfsr_mdir_get(&lfs, &mdir, 0, LFSR_TAG_REG, buffer, SIZE) => SIZE; @@ -328,13 +328,13 @@ code = ''' lfsr_mdir_commit(&lfs, &lfs.mroot, NULL, 0) => 0; // assert mdir was unininlined correctly - assert(lfsr_mtree_weight(&lfs) == 1); + assert(lfsr_mtree_weight(&lfs) == 1*lfsr_mbidweight(&lfs)); // assert mroot now has no entries assert(lfs.mroot.u.m.weight == 0); // now add another large entry to the mdir, forcing a split lfsr_mdir_t mdir; - lfsr_mtree_lookup(&lfs, LFSR_MID(0, -1), &mdir) => 0; + lfsr_mtree_lookup(&lfs, LFSR_MID(0*lfsr_mbidweight(&lfs), -1), &mdir) => 0; assert(mdir.u.m.weight == 1); memset(buffer, 'c', SIZE); @@ -346,7 +346,7 @@ code = ''' lfsr_mdir_commit(&lfs, &mdir, NULL, 0) => 0; // assert mdir was split correctly - assert(lfsr_mtree_weight(&lfs) == 2); + assert(lfsr_mtree_weight(&lfs) == 2*lfsr_mbidweight(&lfs)); // assert mroot still has no entries assert(lfs.mroot.u.m.weight == 0); @@ -356,13 +356,13 @@ code = ''' assert(memcmp(buffer, "a", 1) == 0); // assert that our entries are still in the mtree - lfsr_mtree_lookup(&lfs, LFSR_MID(0, -1), &mdir) => 0; + lfsr_mtree_lookup(&lfs, LFSR_MID(0*lfsr_mbidweight(&lfs), -1), &mdir) => 0; assert(mdir.u.m.weight == 1); lfsr_mdir_get(&lfs, &mdir, 0, LFSR_TAG_REG, buffer, SIZE) => SIZE; assert(memcmp(buffer, "b", 1) == 0); - lfsr_mtree_lookup(&lfs, LFSR_MID(1, -1), &mdir) => 0; + lfsr_mtree_lookup(&lfs, LFSR_MID(1*lfsr_mbidweight(&lfs), -1), &mdir) => 0; assert(mdir.u.m.weight == 1); lfsr_mdir_get(&lfs, &mdir, 0, LFSR_TAG_REG, buffer, SIZE) => SIZE; @@ -374,7 +374,7 @@ code = ''' lfsr_mount(&lfs, CFG) => 0; // assert mdir was split correctly - assert(lfsr_mtree_weight(&lfs) == 2); + assert(lfsr_mtree_weight(&lfs) == 2*lfsr_mbidweight(&lfs)); // assert mroot still has no entries assert(lfs.mroot.u.m.weight == 0); @@ -384,13 +384,13 @@ code = ''' assert(memcmp(buffer, "a", 1) == 0); // assert that our entries are still in the mtree - lfsr_mtree_lookup(&lfs, LFSR_MID(0, -1), &mdir) => 0; + lfsr_mtree_lookup(&lfs, LFSR_MID(0*lfsr_mbidweight(&lfs), -1), &mdir) => 0; assert(mdir.u.m.weight == 1); lfsr_mdir_get(&lfs, &mdir, 0, LFSR_TAG_REG, buffer, SIZE) => SIZE; assert(memcmp(buffer, "b", 1) == 0); - lfsr_mtree_lookup(&lfs, LFSR_MID(1, -1), &mdir) => 0; + lfsr_mtree_lookup(&lfs, LFSR_MID(1*lfsr_mbidweight(&lfs), -1), &mdir) => 0; assert(mdir.u.m.weight == 1); lfsr_mdir_get(&lfs, &mdir, 0, LFSR_TAG_REG, buffer, SIZE) => SIZE; @@ -444,7 +444,7 @@ code = ''' lfs_size_t i = 0; for (lfs_ssize_t mid = 0; mid < lfs_smax32(lfsr_mtree_weight(&lfs), 1); - mid++) { + mid += lfsr_mbidweight(&lfs)) { lfsr_mdir_t mdir; lfsr_mtree_lookup(&lfs, LFSR_MID(mid, -1), &mdir) => 0; for (mdir.mid.rid = 0; @@ -469,7 +469,7 @@ code = ''' i = 0; for (lfs_ssize_t mid = 0; mid < lfs_smax32(lfsr_mtree_weight(&lfs), 1); - mid++) { + mid += lfsr_mbidweight(&lfs)) { lfsr_mdir_t mdir; lfsr_mtree_lookup(&lfs, LFSR_MID(mid, -1), &mdir) => 0; for (mdir.mid.rid = 0; @@ -543,7 +543,7 @@ code = ''' for (lfs_ssize_t mid = 0; mid < lfs_smax32(lfsr_mtree_weight(&lfs), 1); - mid++) { + mid += lfsr_mbidweight(&lfs)) { lfsr_mdir_t mdir; lfsr_mtree_lookup(&lfs, LFSR_MID(mid, -1), &mdir) => 0; for (mdir.mid.rid = 0; @@ -572,7 +572,7 @@ code = ''' for (lfs_ssize_t mid = 0; mid < lfs_smax32(lfsr_mtree_weight(&lfs), 1); - mid++) { + mid += lfsr_mbidweight(&lfs)) { lfsr_mdir_t mdir; lfsr_mtree_lookup(&lfs, LFSR_MID(mid, -1), &mdir) => 0; for (mdir.mid.rid = 0; @@ -625,20 +625,20 @@ code = ''' lfsr_mdir_commit(&lfs, &lfs.mroot, NULL, 0) => 0; // assert mdir was unininlined correctly - assert(lfsr_mtree_weight(&lfs) == 1); + assert(lfsr_mtree_weight(&lfs) == 1*lfsr_mbidweight(&lfs)); // assert mroot now has no entries assert(lfs.mroot.u.m.weight == 0); // remove the entry, forcing the mdir to be dropped lfsr_mdir_t mdir; - lfsr_mtree_lookup(&lfs, LFSR_MID(0, -1), &mdir) => 0; + lfsr_mtree_lookup(&lfs, LFSR_MID(0*lfsr_mbidweight(&lfs), -1), &mdir) => 0; assert(mdir.u.m.weight == 1); lfsr_mdir_commit(&lfs, &mdir, LFSR_ATTRS( LFSR_ATTR(0, RM, -1, NULL))) => 0; // assert mdir was dropped - assert(lfsr_mtree_weight(&lfs) == 0); + assert(lfsr_mtree_weight(&lfs) == 0*lfsr_mbidweight(&lfs)); // assert mroot still has no entries assert(lfs.mroot.u.m.weight == 0); @@ -654,7 +654,7 @@ code = ''' lfsr_mount(&lfs, CFG) => 0; // assert mdir was dropped - assert(lfsr_mtree_weight(&lfs) == 0); + assert(lfsr_mtree_weight(&lfs) == 0*lfsr_mbidweight(&lfs)); // assert mroot still has no entries assert(lfs.mroot.u.m.weight == 0); @@ -694,13 +694,13 @@ code = ''' lfsr_mdir_commit(&lfs, &lfs.mroot, NULL, 0) => 0; // assert mdir was unininlined correctly - assert(lfsr_mtree_weight(&lfs) == 1); + assert(lfsr_mtree_weight(&lfs) == 1*lfsr_mbidweight(&lfs)); // assert mroot now has no entries assert(lfs.mroot.u.m.weight == 0); // remove the entry, forcing the mdir to be dropped lfsr_mdir_t mdir; - lfsr_mtree_lookup(&lfs, LFSR_MID(0, -1), &mdir) => 0; + lfsr_mtree_lookup(&lfs, LFSR_MID(0*lfsr_mbidweight(&lfs), -1), &mdir) => 0; assert(mdir.u.m.weight == 1); // force mdir to compact while we're removing @@ -710,7 +710,7 @@ code = ''' LFSR_ATTR(0, RM, -1, NULL))) => 0; // assert mdir was dropped - assert(lfsr_mtree_weight(&lfs) == 0); + assert(lfsr_mtree_weight(&lfs) == 0*lfsr_mbidweight(&lfs)); // assert mroot still has no entries assert(lfs.mroot.u.m.weight == 0); @@ -726,7 +726,7 @@ code = ''' lfsr_mount(&lfs, CFG) => 0; // assert mdir was dropped - assert(lfsr_mtree_weight(&lfs) == 0); + assert(lfsr_mtree_weight(&lfs) == 0*lfsr_mbidweight(&lfs)); // assert mroot still has no entries assert(lfs.mroot.u.m.weight == 0); @@ -769,7 +769,7 @@ code = ''' LFSR_ATTR(0, RM, -1, NULL))) => 0; // assert mdir was dropped - assert(lfsr_mtree_weight(&lfs) == 0); + assert(lfsr_mtree_weight(&lfs) == 0*lfsr_mbidweight(&lfs)); // assert mroot has no entries assert(lfs.mroot.u.m.weight == 0); @@ -785,7 +785,7 @@ code = ''' lfsr_mount(&lfs, CFG) => 0; // assert mdir was dropped - assert(lfsr_mtree_weight(&lfs) == 0); + assert(lfsr_mtree_weight(&lfs) == 0*lfsr_mbidweight(&lfs)); // assert mroot has no entries assert(lfs.mroot.u.m.weight == 0); @@ -829,13 +829,13 @@ code = ''' LFSR_ATTR(0, RM, -1, NULL))) => 0; // assert mdir was dropped - assert(lfsr_mtree_weight(&lfs) == 1); + assert(lfsr_mtree_weight(&lfs) == 1*lfsr_mbidweight(&lfs)); // assert mroot has no entries assert(lfs.mroot.u.m.weight == 0); // assert that one entry is still in the mtree lfsr_mdir_t mdir; - lfsr_mtree_lookup(&lfs, LFSR_MID(0, -1), &mdir) => 0; + lfsr_mtree_lookup(&lfs, LFSR_MID(0*lfsr_mbidweight(&lfs), -1), &mdir) => 0; assert(mdir.u.m.weight == 1); lfsr_mdir_get(&lfs, &mdir, 0, LFSR_TAG_REG, @@ -849,12 +849,12 @@ code = ''' lfsr_mount(&lfs, CFG) => 0; // assert mdir was dropped - assert(lfsr_mtree_weight(&lfs) == 1); + assert(lfsr_mtree_weight(&lfs) == 1*lfsr_mbidweight(&lfs)); // assert mroot has no entries assert(lfs.mroot.u.m.weight == 0); // assert that one entry is still in the mtree - lfsr_mtree_lookup(&lfs, LFSR_MID(0, -1), &mdir) => 0; + lfsr_mtree_lookup(&lfs, LFSR_MID(0*lfsr_mbidweight(&lfs), -1), &mdir) => 0; assert(mdir.u.m.weight == 1); lfsr_mdir_get(&lfs, &mdir, 0, LFSR_TAG_REG, @@ -896,13 +896,13 @@ code = ''' LFSR_ATTR(1, RM, -1, NULL))) => 0; // assert mdir was dropped - assert(lfsr_mtree_weight(&lfs) == 1); + assert(lfsr_mtree_weight(&lfs) == 1*lfsr_mbidweight(&lfs)); // assert mroot has no entries assert(lfs.mroot.u.m.weight == 0); // assert that one entry is still in the mtree lfsr_mdir_t mdir; - lfsr_mtree_lookup(&lfs, LFSR_MID(0, -1), &mdir) => 0; + lfsr_mtree_lookup(&lfs, LFSR_MID(0*lfsr_mbidweight(&lfs), -1), &mdir) => 0; assert(mdir.u.m.weight == 1); lfsr_mdir_get(&lfs, &mdir, 0, LFSR_TAG_REG, @@ -916,12 +916,12 @@ code = ''' lfsr_mount(&lfs, CFG) => 0; // assert mdir was dropped - assert(lfsr_mtree_weight(&lfs) == 1); + assert(lfsr_mtree_weight(&lfs) == 1*lfsr_mbidweight(&lfs)); // assert mroot has no entries assert(lfs.mroot.u.m.weight == 0); // assert that one entry is still in the mtree - lfsr_mtree_lookup(&lfs, LFSR_MID(0, -1), &mdir) => 0; + lfsr_mtree_lookup(&lfs, LFSR_MID(0*lfsr_mbidweight(&lfs), -1), &mdir) => 0; assert(mdir.u.m.weight == 1); lfsr_mdir_get(&lfs, &mdir, 0, LFSR_TAG_REG, @@ -963,7 +963,7 @@ code = ''' LFSR_ATTR(0, RM, -1, NULL))) => 0; // assert mdir was dropped - assert(lfsr_mtree_weight(&lfs) == 0); + assert(lfsr_mtree_weight(&lfs) == 0*lfsr_mbidweight(&lfs)); // assert mroot has no entries assert(lfs.mroot.u.m.weight == 0); @@ -974,7 +974,7 @@ code = ''' lfsr_mount(&lfs, CFG) => 0; // assert mdir was dropped - assert(lfsr_mtree_weight(&lfs) == 0); + assert(lfsr_mtree_weight(&lfs) == 0*lfsr_mbidweight(&lfs)); // assert mroot has no entries assert(lfs.mroot.u.m.weight == 0); @@ -1009,13 +1009,13 @@ code = ''' lfsr_mdir_commit(&lfs, &lfs.mroot, NULL, 0) => 0; // assert mdir was unininlined correctly - assert(lfsr_mtree_weight(&lfs) == 1); + assert(lfsr_mtree_weight(&lfs) == 1*lfsr_mbidweight(&lfs)); // assert mroot now has no entries assert(lfs.mroot.u.m.weight == 0); // now add another large entry to the mdir, forcing a split lfsr_mdir_t mdir; - lfsr_mtree_lookup(&lfs, LFSR_MID(0, -1), &mdir) => 0; + lfsr_mtree_lookup(&lfs, LFSR_MID(0*lfsr_mbidweight(&lfs), -1), &mdir) => 0; assert(mdir.u.m.weight == 1); memset(buffer, 'c', SIZE); @@ -1031,7 +1031,7 @@ code = ''' LFSR_ATTR(0, RM, -1, NULL))) => 0; // assert mdir was dropped - assert(lfsr_mtree_weight(&lfs) == 1); + assert(lfsr_mtree_weight(&lfs) == 1*lfsr_mbidweight(&lfs)); // assert mroot has no entries assert(lfs.mroot.u.m.weight == 0); @@ -1041,7 +1041,7 @@ code = ''' assert(memcmp(buffer, "a", 1) == 0); // assert that one entry is still in the mtree - lfsr_mtree_lookup(&lfs, LFSR_MID(0, -1), &mdir) => 0; + lfsr_mtree_lookup(&lfs, LFSR_MID(0*lfsr_mbidweight(&lfs), -1), &mdir) => 0; assert(mdir.u.m.weight == 1); lfsr_mdir_get(&lfs, &mdir, 0, LFSR_TAG_REG, @@ -1055,7 +1055,7 @@ code = ''' lfsr_mount(&lfs, CFG) => 0; // assert mdir was dropped - assert(lfsr_mtree_weight(&lfs) == 1); + assert(lfsr_mtree_weight(&lfs) == 1*lfsr_mbidweight(&lfs)); // assert mroot has no entries assert(lfs.mroot.u.m.weight == 0); @@ -1065,7 +1065,7 @@ code = ''' assert(memcmp(buffer, "a", 1) == 0); // assert that one entry is still in the mtree - lfsr_mtree_lookup(&lfs, LFSR_MID(0, -1), &mdir) => 0; + lfsr_mtree_lookup(&lfs, LFSR_MID(0*lfsr_mbidweight(&lfs), -1), &mdir) => 0; assert(mdir.u.m.weight == 1); lfsr_mdir_get(&lfs, &mdir, 0, LFSR_TAG_REG, @@ -1103,13 +1103,13 @@ code = ''' lfsr_mdir_commit(&lfs, &lfs.mroot, NULL, 0) => 0; // assert mdir was unininlined correctly - assert(lfsr_mtree_weight(&lfs) == 1); + assert(lfsr_mtree_weight(&lfs) == 1*lfsr_mbidweight(&lfs)); // assert mroot now has no entries assert(lfs.mroot.u.m.weight == 0); // now add another large entry to the mdir, forcing a split lfsr_mdir_t mdir; - lfsr_mtree_lookup(&lfs, LFSR_MID(0, -1), &mdir) => 0; + lfsr_mtree_lookup(&lfs, LFSR_MID(0*lfsr_mbidweight(&lfs), -1), &mdir) => 0; assert(mdir.u.m.weight == 1); memset(buffer, 'c', SIZE); @@ -1125,7 +1125,7 @@ code = ''' LFSR_ATTR(1, RM, -1, NULL))) => 0; // assert mdir was dropped - assert(lfsr_mtree_weight(&lfs) == 1); + assert(lfsr_mtree_weight(&lfs) == 1*lfsr_mbidweight(&lfs)); // assert mroot has no entries assert(lfs.mroot.u.m.weight == 0); @@ -1135,7 +1135,7 @@ code = ''' assert(memcmp(buffer, "a", 1) == 0); // assert that one entry is still in the mtree - lfsr_mtree_lookup(&lfs, LFSR_MID(0, -1), &mdir) => 0; + lfsr_mtree_lookup(&lfs, LFSR_MID(0*lfsr_mbidweight(&lfs), -1), &mdir) => 0; assert(mdir.u.m.weight == 1); lfsr_mdir_get(&lfs, &mdir, 0, LFSR_TAG_REG, @@ -1149,7 +1149,7 @@ code = ''' lfsr_mount(&lfs, CFG) => 0; // assert mdir was dropped - assert(lfsr_mtree_weight(&lfs) == 1); + assert(lfsr_mtree_weight(&lfs) == 1*lfsr_mbidweight(&lfs)); // assert mroot has no entries assert(lfs.mroot.u.m.weight == 0); @@ -1159,7 +1159,7 @@ code = ''' assert(memcmp(buffer, "a", 1) == 0); // assert that one entry is still in the mtree - lfsr_mtree_lookup(&lfs, LFSR_MID(0, -1), &mdir) => 0; + lfsr_mtree_lookup(&lfs, LFSR_MID(0*lfsr_mbidweight(&lfs), -1), &mdir) => 0; assert(mdir.u.m.weight == 1); lfsr_mdir_get(&lfs, &mdir, 0, LFSR_TAG_REG, @@ -1197,13 +1197,13 @@ code = ''' lfsr_mdir_commit(&lfs, &lfs.mroot, NULL, 0) => 0; // assert mdir was unininlined correctly - assert(lfsr_mtree_weight(&lfs) == 1); + assert(lfsr_mtree_weight(&lfs) == 1*lfsr_mbidweight(&lfs)); // assert mroot now has no entries assert(lfs.mroot.u.m.weight == 0); // now add another large entry to the mdir, forcing a split lfsr_mdir_t mdir; - lfsr_mtree_lookup(&lfs, LFSR_MID(0, -1), &mdir) => 0; + lfsr_mtree_lookup(&lfs, LFSR_MID(0*lfsr_mbidweight(&lfs), -1), &mdir) => 0; assert(mdir.u.m.weight == 1); memset(buffer, 'c', SIZE); @@ -1219,7 +1219,7 @@ code = ''' LFSR_ATTR(0, RM, -1, NULL))) => 0; // assert mdir was dropped - assert(lfsr_mtree_weight(&lfs) == 0); + assert(lfsr_mtree_weight(&lfs) == 0*lfsr_mbidweight(&lfs)); // assert mroot has no entries assert(lfs.mroot.u.m.weight == 0); @@ -1235,7 +1235,7 @@ code = ''' lfsr_mount(&lfs, CFG) => 0; // assert mdir was dropped - assert(lfsr_mtree_weight(&lfs) == 0); + assert(lfsr_mtree_weight(&lfs) == 0*lfsr_mbidweight(&lfs)); // assert mroot has no entries assert(lfs.mroot.u.m.weight == 0); @@ -1286,7 +1286,7 @@ code = ''' // remove entries for (lfs_size_t i = 0; i < N - REMAINING; i++) { lfsr_mdir_t mdir; - lfsr_mtree_lookup(&lfs, LFSR_MID(0, -1), &mdir) => 0; + lfsr_mtree_lookup(&lfs, LFSR_MID(0*lfsr_mbidweight(&lfs), -1), &mdir) => 0; // drop should make sure we never have empty mdirs assert(lfsr_mdir_ismroot(&mdir) || mdir.u.m.weight > 0); @@ -1305,7 +1305,7 @@ code = ''' lfs_size_t i = N - REMAINING; for (lfs_ssize_t mid = 0; mid < lfs_smax32(lfsr_mtree_weight(&lfs), 1); - mid++) { + mid += lfsr_mbidweight(&lfs)) { lfsr_mdir_t mdir; lfsr_mtree_lookup(&lfs, LFSR_MID(mid, -1), &mdir) => 0; for (mdir.mid.rid = 0; @@ -1330,7 +1330,7 @@ code = ''' i = N - REMAINING; for (lfs_ssize_t mid = 0; mid < lfs_smax32(lfsr_mtree_weight(&lfs), 1); - mid++) { + mid += lfsr_mbidweight(&lfs)) { lfsr_mdir_t mdir; lfsr_mtree_lookup(&lfs, LFSR_MID(mid, -1), &mdir) => 0; for (mdir.mid.rid = 0; @@ -1388,7 +1388,7 @@ code = ''' lfs_size_t i = 0; for (lfs_ssize_t mid = 0; mid < lfs_smax32(lfsr_mtree_weight(&lfs), 1); - mid++) { + mid += lfsr_mbidweight(&lfs)) { lfsr_mdir_t mdir; lfsr_mtree_lookup(&lfs, LFSR_MID(mid, -1), &mdir) => 0; for (mdir.mid.rid = 0; @@ -1406,7 +1406,7 @@ code = ''' // remove entries for (lfs_size_t i = 0; i < N; i++) { lfsr_mdir_t mdir; - lfsr_mtree_lookup(&lfs, LFSR_MID(0, -1), &mdir) => 0; + lfsr_mtree_lookup(&lfs, LFSR_MID(0*lfsr_mbidweight(&lfs), -1), &mdir) => 0; // drop should make sure we never have empty mdirs assert(lfsr_mdir_ismroot(&mdir) || mdir.u.m.weight > 0); @@ -1421,7 +1421,7 @@ code = ''' LFSR_ATTR(0, RM, -1, NULL))) => 0; } - assert(lfsr_mtree_weight(&lfs) == 0); + assert(lfsr_mtree_weight(&lfs) == 0*lfsr_mbidweight(&lfs)); assert(lfs.mroot.u.m.weight == 0); } @@ -1431,7 +1431,7 @@ code = ''' // check things stay sane after remount lfsr_mount(&lfs, CFG) => 0; - assert(lfsr_mtree_weight(&lfs) == 0); + assert(lfsr_mtree_weight(&lfs) == 0*lfsr_mbidweight(&lfs)); assert(lfs.mroot.u.m.weight == 0); lfsr_unmount(&lfs) => 0; @@ -1506,7 +1506,7 @@ code = ''' for (lfs_ssize_t mid = 0; mid < lfs_smax32(lfsr_mtree_weight(&lfs), 1); - mid++) { + mid += lfsr_mbidweight(&lfs)) { lfsr_mdir_t mdir; lfsr_mtree_lookup(&lfs, LFSR_MID(mid, -1), &mdir) => 0; @@ -1539,7 +1539,7 @@ code = ''' for (lfs_ssize_t mid = 0; mid < lfs_smax32(lfsr_mtree_weight(&lfs), 1); - mid++) { + mid += lfsr_mbidweight(&lfs)) { lfsr_mdir_t mdir; lfsr_mtree_lookup(&lfs, LFSR_MID(mid, -1), &mdir) => 0; @@ -1599,13 +1599,13 @@ code = ''' lfsr_mdir_commit(&lfs, &lfs.mroot, NULL, 0) => 0; // assert mtree has one mdir - assert(lfsr_mtree_weight(&lfs) == 1); + assert(lfsr_mtree_weight(&lfs) == 1*lfsr_mbidweight(&lfs)); // assert mroot now has no entries assert(lfs.mroot.u.m.weight == 0); // force mdir to compact twice, this should relocate lfsr_mdir_t mdir; - lfsr_mtree_lookup(&lfs, LFSR_MID(0, -1), &mdir) => 0; + lfsr_mtree_lookup(&lfs, LFSR_MID(0*lfsr_mbidweight(&lfs), -1), &mdir) => 0; assert(mdir.u.m.weight == 1); lfsr_mdir_t old_mdir = mdir; @@ -1626,7 +1626,7 @@ code = ''' assert(memcmp(buffer, "a", 1) == 0); // assert that our entry is still in the mtree - lfsr_mtree_lookup(&lfs, LFSR_MID(0, -1), &mdir) => 0; + lfsr_mtree_lookup(&lfs, LFSR_MID(0*lfsr_mbidweight(&lfs), -1), &mdir) => 0; assert(mdir.u.m.weight == 1); lfsr_mdir_get(&lfs, &mdir, 0, LFSR_TAG_REG, @@ -1640,7 +1640,7 @@ code = ''' lfsr_mount(&lfs, CFG) => 0; // assert mtree has one mdir - assert(lfsr_mtree_weight(&lfs) == 1); + assert(lfsr_mtree_weight(&lfs) == 1*lfsr_mbidweight(&lfs)); // assert mroot now has no entries assert(lfs.mroot.u.m.weight == 0); @@ -1653,7 +1653,7 @@ code = ''' assert(memcmp(buffer, "a", 1) == 0); // assert that our entry is still in the mtree - lfsr_mtree_lookup(&lfs, LFSR_MID(0, -1), &mdir) => 0; + lfsr_mtree_lookup(&lfs, LFSR_MID(0*lfsr_mbidweight(&lfs), -1), &mdir) => 0; assert(mdir.u.m.weight == 1); lfsr_mdir_get(&lfs, &mdir, 0, LFSR_TAG_REG, @@ -1693,13 +1693,13 @@ code = ''' lfsr_mdir_commit(&lfs, &lfs.mroot, NULL, 0) => 0; // assert mdirs were unininlined and split - assert(lfsr_mtree_weight(&lfs) == 2); + assert(lfsr_mtree_weight(&lfs) == 2*lfsr_mbidweight(&lfs)); // assert mroot now has no entries assert(lfs.mroot.u.m.weight == 0); // force mdir to compact twice, this should relocate lfsr_mdir_t mdir; - lfsr_mtree_lookup(&lfs, LFSR_MID(0, -1), &mdir) => 0; + lfsr_mtree_lookup(&lfs, LFSR_MID(0*lfsr_mbidweight(&lfs), -1), &mdir) => 0; assert(mdir.u.m.weight == 1); lfsr_mdir_t old_mdir = mdir; @@ -1715,13 +1715,13 @@ code = ''' assert(lfsr_mdir_cmp(old_mdir.u.m.blocks, mdir.u.m.blocks) != 0); // assert that our entries are still in the mtree - lfsr_mtree_lookup(&lfs, LFSR_MID(0, -1), &mdir) => 0; + lfsr_mtree_lookup(&lfs, LFSR_MID(0*lfsr_mbidweight(&lfs), -1), &mdir) => 0; assert(mdir.u.m.weight == 1); lfsr_mdir_get(&lfs, &mdir, 0, LFSR_TAG_REG, buffer, SIZE) => SIZE; assert(memcmp(buffer, "c", 1) == 0); - lfsr_mtree_lookup(&lfs, LFSR_MID(1, -1), &mdir) => 0; + lfsr_mtree_lookup(&lfs, LFSR_MID(1*lfsr_mbidweight(&lfs), -1), &mdir) => 0; assert(mdir.u.m.weight == 1); lfsr_mdir_get(&lfs, &mdir, 0, LFSR_TAG_REG, buffer, SIZE) => SIZE; @@ -1734,7 +1734,7 @@ code = ''' lfsr_mount(&lfs, CFG) => 0; // assert mdirs were unininlined and split - assert(lfsr_mtree_weight(&lfs) == 2); + assert(lfsr_mtree_weight(&lfs) == 2*lfsr_mbidweight(&lfs)); // assert mroot now has no entries assert(lfs.mroot.u.m.weight == 0); @@ -1742,13 +1742,13 @@ code = ''' assert(lfsr_mdir_cmp(old_mdir.u.m.blocks, mdir.u.m.blocks) != 0); // assert that our entries are still in the mtree - lfsr_mtree_lookup(&lfs, LFSR_MID(0, -1), &mdir) => 0; + lfsr_mtree_lookup(&lfs, LFSR_MID(0*lfsr_mbidweight(&lfs), -1), &mdir) => 0; assert(mdir.u.m.weight == 1); lfsr_mdir_get(&lfs, &mdir, 0, LFSR_TAG_REG, buffer, SIZE) => SIZE; assert(memcmp(buffer, "c", 1) == 0); - lfsr_mtree_lookup(&lfs, LFSR_MID(1, -1), &mdir) => 0; + lfsr_mtree_lookup(&lfs, LFSR_MID(1*lfsr_mbidweight(&lfs), -1), &mdir) => 0; assert(mdir.u.m.weight == 1); lfsr_mdir_get(&lfs, &mdir, 0, LFSR_TAG_REG, buffer, SIZE) => SIZE; @@ -1787,13 +1787,13 @@ code = ''' lfsr_mdir_commit(&lfs, &lfs.mroot, NULL, 0) => 0; // assert mdirs were unininlined and split - assert(lfsr_mtree_weight(&lfs) == 2); + assert(lfsr_mtree_weight(&lfs) == 2*lfsr_mbidweight(&lfs)); // assert mroot now has no entries assert(lfs.mroot.u.m.weight == 0); // force mdir to compact twice, this should relocate lfsr_mdir_t mdir; - lfsr_mtree_lookup(&lfs, LFSR_MID(1, -1), &mdir) => 0; + lfsr_mtree_lookup(&lfs, LFSR_MID(1*lfsr_mbidweight(&lfs), -1), &mdir) => 0; assert(mdir.u.m.weight == 1); lfsr_mdir_t old_mdir = mdir; @@ -1809,13 +1809,13 @@ code = ''' assert(lfsr_mdir_cmp(old_mdir.u.m.blocks, mdir.u.m.blocks) != 0); // assert that our entries are still in the mtree - lfsr_mtree_lookup(&lfs, LFSR_MID(0, -1), &mdir) => 0; + lfsr_mtree_lookup(&lfs, LFSR_MID(0*lfsr_mbidweight(&lfs), -1), &mdir) => 0; assert(mdir.u.m.weight == 1); lfsr_mdir_get(&lfs, &mdir, 0, LFSR_TAG_REG, buffer, SIZE) => SIZE; assert(memcmp(buffer, "a", 1) == 0); - lfsr_mtree_lookup(&lfs, LFSR_MID(1, -1), &mdir) => 0; + lfsr_mtree_lookup(&lfs, LFSR_MID(1*lfsr_mbidweight(&lfs), -1), &mdir) => 0; assert(mdir.u.m.weight == 1); lfsr_mdir_get(&lfs, &mdir, 0, LFSR_TAG_REG, buffer, SIZE) => SIZE; @@ -1828,7 +1828,7 @@ code = ''' lfsr_mount(&lfs, CFG) => 0; // assert mdirs were unininlined and split - assert(lfsr_mtree_weight(&lfs) == 2); + assert(lfsr_mtree_weight(&lfs) == 2*lfsr_mbidweight(&lfs)); // assert mroot now has no entries assert(lfs.mroot.u.m.weight == 0); @@ -1836,13 +1836,13 @@ code = ''' assert(lfsr_mdir_cmp(old_mdir.u.m.blocks, mdir.u.m.blocks) != 0); // assert that our entries are still in the mtree - lfsr_mtree_lookup(&lfs, LFSR_MID(0, -1), &mdir) => 0; + lfsr_mtree_lookup(&lfs, LFSR_MID(0*lfsr_mbidweight(&lfs), -1), &mdir) => 0; assert(mdir.u.m.weight == 1); lfsr_mdir_get(&lfs, &mdir, 0, LFSR_TAG_REG, buffer, SIZE) => SIZE; assert(memcmp(buffer, "a", 1) == 0); - lfsr_mtree_lookup(&lfs, LFSR_MID(1, -1), &mdir) => 0; + lfsr_mtree_lookup(&lfs, LFSR_MID(1*lfsr_mbidweight(&lfs), -1), &mdir) => 0; assert(mdir.u.m.weight == 1); lfsr_mdir_get(&lfs, &mdir, 0, LFSR_TAG_REG, buffer, SIZE) => SIZE; @@ -2066,7 +2066,7 @@ code = ''' lfsr_mdir_commit(&lfs, &lfs.mroot, NULL, 0) => 0; // assert mtree has one mdir - assert(lfsr_mtree_weight(&lfs) == 1); + assert(lfsr_mtree_weight(&lfs) == 1*lfsr_mbidweight(&lfs)); // assert mroot now has no entries assert(lfs.mroot.u.m.weight == 0); @@ -2077,7 +2077,7 @@ code = ''' // force mdir to compact twice, this should relocate lfsr_mdir_t mdir; - lfsr_mtree_lookup(&lfs, LFSR_MID(0, -1), &mdir) => 0; + lfsr_mtree_lookup(&lfs, LFSR_MID(0*lfsr_mbidweight(&lfs), -1), &mdir) => 0; assert(mdir.u.m.weight == 1); lfsr_mdir_t old_mdir = mdir; @@ -2101,7 +2101,7 @@ code = ''' assert(memcmp(buffer, "a", 1) == 0); // assert that our entry is still in the mtree - lfsr_mtree_lookup(&lfs, LFSR_MID(0, -1), &mdir) => 0; + lfsr_mtree_lookup(&lfs, LFSR_MID(0*lfsr_mbidweight(&lfs), -1), &mdir) => 0; assert(mdir.u.m.weight == 1); lfsr_mdir_get(&lfs, &mdir, 0, LFSR_TAG_REG, @@ -2115,7 +2115,7 @@ code = ''' lfsr_mount(&lfs, CFG) => 0; // assert mtree has one mdir - assert(lfsr_mtree_weight(&lfs) == 1); + assert(lfsr_mtree_weight(&lfs) == 1*lfsr_mbidweight(&lfs)); // assert mroot now has no entries assert(lfs.mroot.u.m.weight == 0); @@ -2131,7 +2131,7 @@ code = ''' assert(memcmp(buffer, "a", 1) == 0); // assert that our entry is still in the mtree - lfsr_mtree_lookup(&lfs, LFSR_MID(0, -1), &mdir) => 0; + lfsr_mtree_lookup(&lfs, LFSR_MID(0*lfsr_mbidweight(&lfs), -1), &mdir) => 0; assert(mdir.u.m.weight == 1); lfsr_mdir_get(&lfs, &mdir, 0, LFSR_TAG_REG, @@ -2171,7 +2171,7 @@ code = ''' lfsr_mdir_commit(&lfs, &lfs.mroot, NULL, 0) => 0; // assert mdir was unininlined correctly - assert(lfsr_mtree_weight(&lfs) == 1); + assert(lfsr_mtree_weight(&lfs) == 1*lfsr_mbidweight(&lfs)); // assert mroot now has no entries assert(lfs.mroot.u.m.weight == 0); @@ -2182,7 +2182,7 @@ code = ''' // now add another large entry to the mdir, forcing a split lfsr_mdir_t mdir; - lfsr_mtree_lookup(&lfs, LFSR_MID(0, -1), &mdir) => 0; + lfsr_mtree_lookup(&lfs, LFSR_MID(0*lfsr_mbidweight(&lfs), -1), &mdir) => 0; assert(mdir.u.m.weight == 1); memset(buffer, 'c', SIZE); @@ -2194,7 +2194,7 @@ code = ''' lfsr_mdir_commit(&lfs, &mdir, NULL, 0) => 0; // assert mdir was split correctly - assert(lfsr_mtree_weight(&lfs) == 2); + assert(lfsr_mtree_weight(&lfs) == 2*lfsr_mbidweight(&lfs)); // assert mroot still has no entries assert(lfs.mroot.u.m.weight == 0); @@ -2207,13 +2207,13 @@ code = ''' assert(memcmp(buffer, "a", 1) == 0); // assert that our entries are still in the mtree - lfsr_mtree_lookup(&lfs, LFSR_MID(0, -1), &mdir) => 0; + lfsr_mtree_lookup(&lfs, LFSR_MID(0*lfsr_mbidweight(&lfs), -1), &mdir) => 0; assert(mdir.u.m.weight == 1); lfsr_mdir_get(&lfs, &mdir, 0, LFSR_TAG_REG, buffer, SIZE) => SIZE; assert(memcmp(buffer, "b", 1) == 0); - lfsr_mtree_lookup(&lfs, LFSR_MID(1, -1), &mdir) => 0; + lfsr_mtree_lookup(&lfs, LFSR_MID(1*lfsr_mbidweight(&lfs), -1), &mdir) => 0; assert(mdir.u.m.weight == 1); lfsr_mdir_get(&lfs, &mdir, 0, LFSR_TAG_REG, buffer, SIZE) => SIZE; @@ -2226,7 +2226,7 @@ code = ''' lfsr_mount(&lfs, CFG) => 0; // assert mdir was split correctly - assert(lfsr_mtree_weight(&lfs) == 2); + assert(lfsr_mtree_weight(&lfs) == 2*lfsr_mbidweight(&lfs)); // assert mroot still has no entries assert(lfs.mroot.u.m.weight == 0); @@ -2239,13 +2239,13 @@ code = ''' assert(memcmp(buffer, "a", 1) == 0); // assert that our entries are still in the mtree - lfsr_mtree_lookup(&lfs, LFSR_MID(0, -1), &mdir) => 0; + lfsr_mtree_lookup(&lfs, LFSR_MID(0*lfsr_mbidweight(&lfs), -1), &mdir) => 0; assert(mdir.u.m.weight == 1); lfsr_mdir_get(&lfs, &mdir, 0, LFSR_TAG_REG, buffer, SIZE) => SIZE; assert(memcmp(buffer, "b", 1) == 0); - lfsr_mtree_lookup(&lfs, LFSR_MID(1, -1), &mdir) => 0; + lfsr_mtree_lookup(&lfs, LFSR_MID(1*lfsr_mbidweight(&lfs), -1), &mdir) => 0; assert(mdir.u.m.weight == 1); lfsr_mdir_get(&lfs, &mdir, 0, LFSR_TAG_REG, buffer, SIZE) => SIZE; @@ -2284,7 +2284,7 @@ code = ''' lfsr_mdir_commit(&lfs, &lfs.mroot, NULL, 0) => 0; // assert mdir was unininlined correctly - assert(lfsr_mtree_weight(&lfs) == 1); + assert(lfsr_mtree_weight(&lfs) == 1*lfsr_mbidweight(&lfs)); // assert mroot now has no entries assert(lfs.mroot.u.m.weight == 0); @@ -2295,14 +2295,14 @@ code = ''' // remove the entry, forcing the mdir to be dropped lfsr_mdir_t mdir; - lfsr_mtree_lookup(&lfs, LFSR_MID(0, -1), &mdir) => 0; + lfsr_mtree_lookup(&lfs, LFSR_MID(0*lfsr_mbidweight(&lfs), -1), &mdir) => 0; assert(mdir.u.m.weight == 1); lfsr_mdir_commit(&lfs, &mdir, LFSR_ATTRS( LFSR_ATTR(0, RM, -1, NULL))) => 0; // assert mdir was dropped - assert(lfsr_mtree_weight(&lfs) == 0); + assert(lfsr_mtree_weight(&lfs) == 0*lfsr_mbidweight(&lfs)); // assert mroot still has no entries assert(lfs.mroot.u.m.weight == 0); @@ -2321,7 +2321,7 @@ code = ''' lfsr_mount(&lfs, CFG) => 0; // assert mdir was dropped - assert(lfsr_mtree_weight(&lfs) == 0); + assert(lfsr_mtree_weight(&lfs) == 0*lfsr_mbidweight(&lfs)); // assert mroot still has no entries assert(lfs.mroot.u.m.weight == 0); @@ -2373,7 +2373,7 @@ code = ''' lfsr_mdir_commit(&lfs, &lfs.mroot, NULL, 0) => 0; // assert mdir was unininlined correctly - assert(lfsr_mtree_weight(&lfs) == 1); + assert(lfsr_mtree_weight(&lfs) == 1*lfsr_mbidweight(&lfs)); // assert mroot now has no entries assert(lfs.mroot.u.m.weight == 0); @@ -2387,7 +2387,7 @@ code = ''' // assert that our entry is still in the mtree lfsr_mdir_t mdir; - lfsr_mtree_lookup(&lfs, LFSR_MID(0, -1), &mdir) => 0; + lfsr_mtree_lookup(&lfs, LFSR_MID(0*lfsr_mbidweight(&lfs), -1), &mdir) => 0; assert(mdir.u.m.weight == 1); lfsr_mdir_get(&lfs, &mdir, 0, LFSR_TAG_REG, @@ -2401,7 +2401,7 @@ code = ''' lfsr_mount(&lfs, CFG) => 0; // assert mdir was unininlined correctly - assert(lfsr_mtree_weight(&lfs) == 1); + assert(lfsr_mtree_weight(&lfs) == 1*lfsr_mbidweight(&lfs)); // assert mroot now has no entries assert(lfs.mroot.u.m.weight == 0); @@ -2414,7 +2414,7 @@ code = ''' assert(memcmp(buffer, "a", 1) == 0); // assert that our entry is still in the mtree - lfsr_mtree_lookup(&lfs, LFSR_MID(0, -1), &mdir) => 0; + lfsr_mtree_lookup(&lfs, LFSR_MID(0*lfsr_mbidweight(&lfs), -1), &mdir) => 0; assert(mdir.u.m.weight == 1); lfsr_mdir_get(&lfs, &mdir, 0, LFSR_TAG_REG, @@ -2460,7 +2460,7 @@ code = ''' lfsr_mdir_commit(&lfs, &lfs.mroot, NULL, 0) => 0; // assert mdirs were unininlined and split - assert(lfsr_mtree_weight(&lfs) == 2); + assert(lfsr_mtree_weight(&lfs) == 2*lfsr_mbidweight(&lfs)); // assert mroot now has no entries assert(lfs.mroot.u.m.weight == 0); @@ -2469,13 +2469,13 @@ code = ''' // assert that our entries are still in the mtree lfsr_mdir_t mdir; - lfsr_mtree_lookup(&lfs, LFSR_MID(0, -1), &mdir) => 0; + lfsr_mtree_lookup(&lfs, LFSR_MID(0*lfsr_mbidweight(&lfs), -1), &mdir) => 0; assert(mdir.u.m.weight == 1); lfsr_mdir_get(&lfs, &mdir, 0, LFSR_TAG_REG, buffer, SIZE) => SIZE; assert(memcmp(buffer, "a", 1) == 0); - lfsr_mtree_lookup(&lfs, LFSR_MID(1, -1), &mdir) => 0; + lfsr_mtree_lookup(&lfs, LFSR_MID(1*lfsr_mbidweight(&lfs), -1), &mdir) => 0; assert(mdir.u.m.weight == 1); lfsr_mdir_get(&lfs, &mdir, 0, LFSR_TAG_REG, buffer, SIZE) => SIZE; @@ -2488,7 +2488,7 @@ code = ''' lfsr_mount(&lfs, CFG) => 0; // assert mdirs were unininlined and split - assert(lfsr_mtree_weight(&lfs) == 2); + assert(lfsr_mtree_weight(&lfs) == 2*lfsr_mbidweight(&lfs)); // assert mroot now has no entries assert(lfs.mroot.u.m.weight == 0); @@ -2496,13 +2496,13 @@ code = ''' assert(lfsr_mdir_cmp(old_mroot.u.m.blocks, lfs.mroot.u.m.blocks) != 0); // assert that our entries are still in the mtree - lfsr_mtree_lookup(&lfs, LFSR_MID(0, -1), &mdir) => 0; + lfsr_mtree_lookup(&lfs, LFSR_MID(0*lfsr_mbidweight(&lfs), -1), &mdir) => 0; assert(mdir.u.m.weight == 1); lfsr_mdir_get(&lfs, &mdir, 0, LFSR_TAG_REG, buffer, SIZE) => SIZE; assert(memcmp(buffer, "a", 1) == 0); - lfsr_mtree_lookup(&lfs, LFSR_MID(1, -1), &mdir) => 0; + lfsr_mtree_lookup(&lfs, LFSR_MID(1*lfsr_mbidweight(&lfs), -1), &mdir) => 0; assert(mdir.u.m.weight == 1); lfsr_mdir_get(&lfs, &mdir, 0, LFSR_TAG_REG, buffer, SIZE) => SIZE; @@ -2595,7 +2595,7 @@ code = ''' for (lfs_ssize_t mid = 0; mid < lfs_smax32(lfsr_mtree_weight(&lfs), 1); - mid++) { + mid += lfsr_mbidweight(&lfs)) { lfsr_mdir_t mdir; lfsr_mtree_lookup(&lfs, LFSR_MID(mid, -1), &mdir) => 0; @@ -2628,7 +2628,7 @@ code = ''' for (lfs_ssize_t mid = 0; mid < lfs_smax32(lfsr_mtree_weight(&lfs), 1); - mid++) { + mid += lfsr_mbidweight(&lfs)) { lfsr_mdir_t mdir; lfsr_mtree_lookup(&lfs, LFSR_MID(mid, -1), &mdir) => 0; @@ -2843,7 +2843,7 @@ code = ''' lfsr_mdir_commit(&lfs, &lfs.mroot, NULL, 0) => 0; // assert mdir was unininlined correctly - assert(lfsr_mtree_weight(&lfs) == 2); + assert(lfsr_mtree_weight(&lfs) == 2*lfsr_mbidweight(&lfs)); // assert mroot now has no entries assert(lfs.mroot.u.m.weight == 0); @@ -2854,7 +2854,7 @@ code = ''' // assert that our entry is still in the mtree lfsr_mdir_t mdir; - lfsr_mtree_lookup(&lfs, LFSR_MID(0, -1), &mdir) => 0; + lfsr_mtree_lookup(&lfs, LFSR_MID(0*lfsr_mbidweight(&lfs), -1), &mdir) => 0; assert(mdir.u.m.weight == 2); lfsr_mdir_get(&lfs, &mdir, 1, LFSR_TAG_REG, buffer, SIZE) => SIZE; @@ -2863,17 +2863,17 @@ code = ''' // note that our current implementation splits here, which is suboptimal // but saves on code size lfsr_mdir_t msibling; - lfsr_mtree_lookup(&lfs, LFSR_MID(1, -1), &msibling) => 0; + lfsr_mtree_lookup(&lfs, LFSR_MID(1*lfsr_mbidweight(&lfs), -1), &msibling) => 0; assert(msibling.u.m.weight == 1); // assert that our neighbors were updated correctly assert(!lfsr_mdir_isdropped(&left_neighbor.mdir)); - assert(left_neighbor.mdir.mid.bid == 0); + assert(left_neighbor.mdir.mid.bid == 0*lfsr_mbidweight(&lfs) | lfsr_mridmask(&lfs)); assert(left_neighbor.mdir.mid.rid == 0); assert(memcmp(&left_neighbor.mdir.u, &mdir.u, sizeof(mdir.u)) == 0); assert(!lfsr_mdir_isdropped(&right_neighbor.mdir)); - assert(right_neighbor.mdir.mid.bid == 1); + assert(right_neighbor.mdir.mid.bid == 1*lfsr_mbidweight(&lfs) | lfsr_mridmask(&lfs)); assert(right_neighbor.mdir.mid.rid == 0); assert(memcmp(&right_neighbor.mdir.u, &msibling.u, sizeof(msibling.u)) == 0); @@ -2925,20 +2925,20 @@ code = ''' lfsr_mdir_commit(&lfs, &lfs.mroot, NULL, 0) => 0; // assert mdirs were unininlined and split - assert(lfsr_mtree_weight(&lfs) == 2); + assert(lfsr_mtree_weight(&lfs) == 2*lfsr_mbidweight(&lfs)); // assert mroot now has no entries assert(lfs.mroot.u.m.weight == 0); // assert that our entries are still in the mtree lfsr_mdir_t mdir; - lfsr_mtree_lookup(&lfs, LFSR_MID(0, -1), &mdir) => 0; + lfsr_mtree_lookup(&lfs, LFSR_MID(0*lfsr_mbidweight(&lfs), -1), &mdir) => 0; assert(mdir.u.m.weight == 2); lfsr_mdir_get(&lfs, &mdir, 1, LFSR_TAG_REG, buffer, SIZE) => SIZE; assert(memcmp(buffer, "c", 1) == 0); lfsr_mdir_t msibling; - lfsr_mtree_lookup(&lfs, LFSR_MID(1, -1), &msibling) => 0; + lfsr_mtree_lookup(&lfs, LFSR_MID(1*lfsr_mbidweight(&lfs), -1), &msibling) => 0; assert(msibling.u.m.weight == 2); lfsr_mdir_get(&lfs, &msibling, 0, LFSR_TAG_REG, buffer, SIZE) => SIZE; @@ -2946,12 +2946,12 @@ code = ''' // assert that our neighbors were updated correctly assert(!lfsr_mdir_isdropped(&left_neighbor.mdir)); - assert(left_neighbor.mdir.mid.bid == 0); + assert(left_neighbor.mdir.mid.bid == 0*lfsr_mbidweight(&lfs) | lfsr_mridmask(&lfs)); assert(left_neighbor.mdir.mid.rid == 0); assert(memcmp(&left_neighbor.mdir.u, &mdir.u, sizeof(mdir.u)) == 0); assert(!lfsr_mdir_isdropped(&right_neighbor.mdir)); - assert(right_neighbor.mdir.mid.bid == 1); + assert(right_neighbor.mdir.mid.bid == 1*lfsr_mbidweight(&lfs) | lfsr_mridmask(&lfs)); assert(right_neighbor.mdir.mid.rid == 1); assert(memcmp(&right_neighbor.mdir.u, &msibling.u, sizeof(msibling.u)) == 0); @@ -2989,7 +2989,7 @@ code = ''' lfsr_mdir_commit(&lfs, &lfs.mroot, NULL, 0) => 0; // assert mdir was unininlined correctly - assert(lfsr_mtree_weight(&lfs) == 1); + assert(lfsr_mtree_weight(&lfs) == 1*lfsr_mbidweight(&lfs)); // assert mroot now has no entries assert(lfs.mroot.u.m.weight == 0); @@ -2998,14 +2998,14 @@ code = ''' // note we do this after uninlining! this is because uninlining may // aggresively split the mtree if there are already neighbors in the mdir lfsr_mdir_t mdir; - lfsr_mtree_lookup(&lfs, LFSR_MID(0, -1), &mdir) => 0; + lfsr_mtree_lookup(&lfs, LFSR_MID(0*lfsr_mbidweight(&lfs), -1), &mdir) => 0; assert(mdir.u.m.weight == 1); lfsr_mdir_commit(&lfs, &mdir, LFSR_ATTRS( LFSR_ATTR(0, REG, +1, BUF("a", 1)), LFSR_ATTR(2, REG, +1, BUF("b", 1)))) => 0; // this test only works if these all fit in the mdir - assert(lfsr_mtree_weight(&lfs) == 1); + assert(lfsr_mtree_weight(&lfs) == 1*lfsr_mbidweight(&lfs)); assert(mdir.u.m.weight == 3); lfsr_openedmdir_t left_neighbor = { @@ -3025,7 +3025,7 @@ code = ''' lfsr_mdir_commit(&lfs, &mdir, NULL, 0) => 0; // assert mdir was split correctly - assert(lfsr_mtree_weight(&lfs) == 2); + assert(lfsr_mtree_weight(&lfs) == 2*lfsr_mbidweight(&lfs)); // assert mroot still has no entries assert(lfs.mroot.u.m.weight == 0); @@ -3035,14 +3035,14 @@ code = ''' assert(memcmp(buffer, "c", 1) == 0); // assert that our entries are still in the mtree - lfsr_mtree_lookup(&lfs, LFSR_MID(0, -1), &mdir) => 0; + lfsr_mtree_lookup(&lfs, LFSR_MID(0*lfsr_mbidweight(&lfs), -1), &mdir) => 0; assert(mdir.u.m.weight == 2); lfsr_mdir_get(&lfs, &mdir, 1, LFSR_TAG_REG, buffer, SIZE) => SIZE; assert(memcmp(buffer, "d", 1) == 0); lfsr_mdir_t msibling; - lfsr_mtree_lookup(&lfs, LFSR_MID(1, -1), &msibling) => 0; + lfsr_mtree_lookup(&lfs, LFSR_MID(1*lfsr_mbidweight(&lfs), -1), &msibling) => 0; assert(msibling.u.m.weight == 2); lfsr_mdir_get(&lfs, &msibling, 0, LFSR_TAG_REG, buffer, SIZE) => SIZE; @@ -3050,12 +3050,12 @@ code = ''' // assert that our neighbors were updated correctly assert(!lfsr_mdir_isdropped(&left_neighbor.mdir)); - assert(left_neighbor.mdir.mid.bid == 0); + assert(left_neighbor.mdir.mid.bid == 0*lfsr_mbidweight(&lfs) | lfsr_mridmask(&lfs)); assert(left_neighbor.mdir.mid.rid == 0); assert(memcmp(&left_neighbor.mdir.u, &mdir.u, sizeof(mdir.u)) == 0); assert(!lfsr_mdir_isdropped(&right_neighbor.mdir)); - assert(right_neighbor.mdir.mid.bid == 1); + assert(right_neighbor.mdir.mid.bid == 1*lfsr_mbidweight(&lfs) | lfsr_mridmask(&lfs)); assert(right_neighbor.mdir.mid.rid == 1); assert(memcmp(&right_neighbor.mdir.u, &msibling.u, sizeof(msibling.u)) == 0); @@ -3165,7 +3165,7 @@ code = ''' lfsr_mdir_commit(&lfs, &lfs.mroot, NULL, 0) => 0; // assert mdir was unininlined correctly - assert(lfsr_mtree_weight(&lfs) == 1); + assert(lfsr_mtree_weight(&lfs) == 1*lfsr_mbidweight(&lfs)); // assert mroot now has no entries assert(lfs.mroot.u.m.weight == 0); @@ -3174,14 +3174,14 @@ code = ''' // note we do this after uninlining! this is because uninlining may // aggresively split the mtree if there are already neighbors in the mdir lfsr_mdir_t mdir; - lfsr_mtree_lookup(&lfs, LFSR_MID(0, -1), &mdir) => 0; + lfsr_mtree_lookup(&lfs, LFSR_MID(0*lfsr_mbidweight(&lfs), -1), &mdir) => 0; assert(mdir.u.m.weight == 1); lfsr_mdir_commit(&lfs, &mdir, LFSR_ATTRS( LFSR_ATTR(0, REG, +1, BUF("a", 1)), LFSR_ATTR(2, REG, +1, BUF("b", 1)))) => 0; // this test only works if these all fit in the mdir - assert(lfsr_mtree_weight(&lfs) == 1); + assert(lfsr_mtree_weight(&lfs) == 1*lfsr_mbidweight(&lfs)); assert(mdir.u.m.weight == 3); lfsr_openedmdir_t left_neighbor = { @@ -3210,7 +3210,7 @@ code = ''' assert(memcmp(buffer, "c", 1) == 0); // assert that our entry is still in the mtree - lfsr_mtree_lookup(&lfs, LFSR_MID(0, -1), &mdir) => 0; + lfsr_mtree_lookup(&lfs, LFSR_MID(0*lfsr_mbidweight(&lfs), -1), &mdir) => 0; assert(mdir.u.m.weight == 3); lfsr_mdir_get(&lfs, &mdir, 1, LFSR_TAG_REG, @@ -3219,11 +3219,11 @@ code = ''' // assert that our neighbors were updated correctly assert(!lfsr_mdir_isdropped(&left_neighbor.mdir)); - assert(left_neighbor.mdir.mid.bid == 0); + assert(left_neighbor.mdir.mid.bid == 0*lfsr_mbidweight(&lfs) | lfsr_mridmask(&lfs)); assert(left_neighbor.mdir.mid.rid == 0); assert(memcmp(&left_neighbor.mdir.u, &mdir.u, sizeof(mdir.u)) == 0); assert(!lfsr_mdir_isdropped(&right_neighbor.mdir)); - assert(right_neighbor.mdir.mid.bid == 0); + assert(right_neighbor.mdir.mid.bid == 0*lfsr_mbidweight(&lfs) | lfsr_mridmask(&lfs)); assert(right_neighbor.mdir.mid.rid == 2); assert(memcmp(&right_neighbor.mdir.u, &mdir.u, sizeof(mdir.u)) == 0); @@ -3263,11 +3263,11 @@ code = ''' lfsr_mdir_commit(&lfs, &lfs.mroot, NULL, 0) => 0; // we should now have 2 mdirs - assert(lfsr_mtree_weight(&lfs) == 2); + assert(lfsr_mtree_weight(&lfs) == 2*lfsr_mbidweight(&lfs)); // now force one of our siblings to split lfsr_mdir_t mdir; - lfsr_mtree_lookup(&lfs, LFSR_MID(1, -1), &mdir) => 0; + lfsr_mtree_lookup(&lfs, LFSR_MID(1*lfsr_mbidweight(&lfs), -1), &mdir) => 0; assert(mdir.u.m.weight == 1); memset(buffer, 'c', SIZE); lfsr_mdir_commit(&lfs, &mdir, LFSR_ATTRS( @@ -3278,19 +3278,19 @@ code = ''' lfsr_mdir_commit(&lfs, &mdir, NULL, 0) => 0; // we should now have 3 mdirs - assert(lfsr_mtree_weight(&lfs) == 3); + assert(lfsr_mtree_weight(&lfs) == 3*lfsr_mbidweight(&lfs)); //// Now test splitting updates mids correctly // setup our neighbors lfsr_openedmdir_t left_neighbor; - lfsr_mtree_lookup(&lfs, LFSR_MID(0, -1), &left_neighbor.mdir) => 0; + lfsr_mtree_lookup(&lfs, LFSR_MID(0*lfsr_mbidweight(&lfs), -1), &left_neighbor.mdir) => 0; assert(left_neighbor.mdir.u.m.weight == 1); left_neighbor.mdir.mid.rid = 0; lfsr_openedmdir_t right_neighbor; - lfsr_mtree_lookup(&lfs, LFSR_MID(2, -1), &right_neighbor.mdir) => 0; + lfsr_mtree_lookup(&lfs, LFSR_MID(2*lfsr_mbidweight(&lfs), -1), &right_neighbor.mdir) => 0; assert(right_neighbor.mdir.u.m.weight == 1); right_neighbor.mdir.mid.rid = 0; @@ -3298,7 +3298,7 @@ code = ''' lfsr_mdir_addopened(&lfs, LFS_TYPE_REG, &right_neighbor); // cause middle mdir to split - lfsr_mtree_lookup(&lfs, LFSR_MID(1, -1), &mdir) => 0; + lfsr_mtree_lookup(&lfs, LFSR_MID(1*lfsr_mbidweight(&lfs), -1), &mdir) => 0; assert(mdir.u.m.weight == 1); memset(buffer, 'd', SIZE); lfsr_mdir_commit(&lfs, &mdir, LFSR_ATTRS( @@ -3309,18 +3309,18 @@ code = ''' lfsr_mdir_commit(&lfs, &mdir, NULL, 0) => 0; // we should now have 4 mdirs - assert(lfsr_mtree_weight(&lfs) == 4); + assert(lfsr_mtree_weight(&lfs) == 4*lfsr_mbidweight(&lfs)); // assert that our neighbors were updated correctly assert(!lfsr_mdir_isdropped(&left_neighbor.mdir)); - assert(left_neighbor.mdir.mid.bid == 0); + assert(left_neighbor.mdir.mid.bid == 0*lfsr_mbidweight(&lfs) | lfsr_mridmask(&lfs)); assert(left_neighbor.mdir.mid.rid == 0); - lfsr_mtree_lookup(&lfs, LFSR_MID(0, -1), &mdir) => 0; + lfsr_mtree_lookup(&lfs, LFSR_MID(0*lfsr_mbidweight(&lfs), -1), &mdir) => 0; assert(memcmp(&left_neighbor.mdir.u, &mdir.u, sizeof(mdir.u)) == 0); - assert(right_neighbor.mdir.mid.bid == 3); + assert(right_neighbor.mdir.mid.bid == 3*lfsr_mbidweight(&lfs) | lfsr_mridmask(&lfs)); assert(right_neighbor.mdir.mid.rid == 0); - lfsr_mtree_lookup(&lfs, LFSR_MID(3, -1), &mdir) => 0; + lfsr_mtree_lookup(&lfs, LFSR_MID(3*lfsr_mbidweight(&lfs), -1), &mdir) => 0; assert(memcmp(&right_neighbor.mdir.u, &mdir.u, sizeof(mdir.u)) == 0); lfsr_mdir_removeopened(&lfs, LFS_TYPE_REG, &left_neighbor); @@ -3359,11 +3359,11 @@ code = ''' lfsr_mdir_commit(&lfs, &lfs.mroot, NULL, 0) => 0; // we should now have 2 mdirs - assert(lfsr_mtree_weight(&lfs) == 2); + assert(lfsr_mtree_weight(&lfs) == 2*lfsr_mbidweight(&lfs)); // now force one of our siblings to split lfsr_mdir_t mdir; - lfsr_mtree_lookup(&lfs, LFSR_MID(1, -1), &mdir) => 0; + lfsr_mtree_lookup(&lfs, LFSR_MID(1*lfsr_mbidweight(&lfs), -1), &mdir) => 0; assert(mdir.u.m.weight == 1); memset(buffer, 'c', SIZE); lfsr_mdir_commit(&lfs, &mdir, LFSR_ATTRS( @@ -3374,19 +3374,19 @@ code = ''' lfsr_mdir_commit(&lfs, &mdir, NULL, 0) => 0; // we should now have 3 mdirs - assert(lfsr_mtree_weight(&lfs) == 3); + assert(lfsr_mtree_weight(&lfs) == 3*lfsr_mbidweight(&lfs)); //// Now test dropping updates mids correctly // setup our neighbors lfsr_openedmdir_t left_neighbor; - lfsr_mtree_lookup(&lfs, LFSR_MID(0, -1), &left_neighbor.mdir) => 0; + lfsr_mtree_lookup(&lfs, LFSR_MID(0*lfsr_mbidweight(&lfs), -1), &left_neighbor.mdir) => 0; assert(left_neighbor.mdir.u.m.weight == 1); left_neighbor.mdir.mid.rid = 0; lfsr_openedmdir_t right_neighbor; - lfsr_mtree_lookup(&lfs, LFSR_MID(2, -1), &right_neighbor.mdir) => 0; + lfsr_mtree_lookup(&lfs, LFSR_MID(2*lfsr_mbidweight(&lfs), -1), &right_neighbor.mdir) => 0; assert(right_neighbor.mdir.u.m.weight == 1); right_neighbor.mdir.mid.rid = 0; @@ -3394,25 +3394,25 @@ code = ''' lfsr_mdir_addopened(&lfs, LFS_TYPE_REG, &right_neighbor); // cause middle mdir to drop - lfsr_mtree_lookup(&lfs, LFSR_MID(1, -1), &mdir) => 0; + lfsr_mtree_lookup(&lfs, LFSR_MID(1*lfsr_mbidweight(&lfs), -1), &mdir) => 0; assert(mdir.u.m.weight == 1); lfsr_mdir_commit(&lfs, &mdir, LFSR_ATTRS( LFSR_ATTR(0, RM, -1, NULL))) => 0; // we should now have 2 mdirs - assert(lfsr_mtree_weight(&lfs) == 2); + assert(lfsr_mtree_weight(&lfs) == 2*lfsr_mbidweight(&lfs)); // assert that our neighbors were updated correctly assert(!lfsr_mdir_isdropped(&left_neighbor.mdir)); - assert(left_neighbor.mdir.mid.bid == 0); + assert(left_neighbor.mdir.mid.bid == 0*lfsr_mbidweight(&lfs) | lfsr_mridmask(&lfs)); assert(left_neighbor.mdir.mid.rid == 0); - lfsr_mtree_lookup(&lfs, LFSR_MID(0, -1), &mdir) => 0; + lfsr_mtree_lookup(&lfs, LFSR_MID(0*lfsr_mbidweight(&lfs), -1), &mdir) => 0; assert(memcmp(&left_neighbor.mdir.u, &mdir.u, sizeof(mdir.u)) == 0); assert(!lfsr_mdir_isdropped(&right_neighbor.mdir)); - assert(right_neighbor.mdir.mid.bid == 1); + assert(right_neighbor.mdir.mid.bid == 1*lfsr_mbidweight(&lfs) | lfsr_mridmask(&lfs)); assert(right_neighbor.mdir.mid.rid == 0); - lfsr_mtree_lookup(&lfs, LFSR_MID(1, -1), &mdir) => 0; + lfsr_mtree_lookup(&lfs, LFSR_MID(1*lfsr_mbidweight(&lfs), -1), &mdir) => 0; assert(memcmp(&right_neighbor.mdir.u, &mdir.u, sizeof(mdir.u)) == 0); lfsr_mdir_removeopened(&lfs, LFS_TYPE_REG, &left_neighbor); @@ -3554,7 +3554,7 @@ code = ''' lfsr_mdir_commit(&lfs, &lfs.mroot, NULL, 0) => 0; // assert mdir was unininlined correctly - assert(lfsr_mtree_weight(&lfs) == 1); + assert(lfsr_mtree_weight(&lfs) == 1*lfsr_mbidweight(&lfs)); // assert mroot now has no entries assert(lfs.mroot.u.m.weight == 0); @@ -3565,7 +3565,7 @@ code = ''' // assert that our entry is still in the mtree lfsr_mdir_t mdir; - lfsr_mtree_lookup(&lfs, LFSR_MID(0, -1), &mdir) => 0; + lfsr_mtree_lookup(&lfs, LFSR_MID(0*lfsr_mbidweight(&lfs), -1), &mdir) => 0; assert(mdir.u.m.weight == 1); lfsr_mdir_get(&lfs, &mdir, 0, LFSR_TAG_REG, @@ -3639,7 +3639,7 @@ code = ''' // and the tree should still work // assert mdir was unininlined correctly - assert(lfsr_mtree_weight(&lfs) == 1); + assert(lfsr_mtree_weight(&lfs) == 1*lfsr_mbidweight(&lfs)); // assert mroot now has no entries assert(lfs.mroot.u.m.weight == 0); @@ -3649,7 +3649,7 @@ code = ''' assert(memcmp(buffer, "a", 1) == 0); // assert that our entry is still in the mtree - lfsr_mtree_lookup(&lfs, LFSR_MID(0, -1), &mdir) => 0; + lfsr_mtree_lookup(&lfs, LFSR_MID(0*lfsr_mbidweight(&lfs), -1), &mdir) => 0; assert(mdir.u.m.weight == 1); lfsr_mdir_get(&lfs, &mdir, 0, LFSR_TAG_REG, @@ -3688,20 +3688,20 @@ code = ''' lfsr_mdir_commit(&lfs, &lfs.mroot, NULL, 0) => 0; // assert mdirs were unininlined and split - assert(lfsr_mtree_weight(&lfs) == 2); + assert(lfsr_mtree_weight(&lfs) == 2*lfsr_mbidweight(&lfs)); // assert mroot now has no entries assert(lfs.mroot.u.m.weight == 0); // assert that our entries are still in the mtree lfsr_mdir_t mdir; - lfsr_mtree_lookup(&lfs, LFSR_MID(0, -1), &mdir) => 0; + lfsr_mtree_lookup(&lfs, LFSR_MID(0*lfsr_mbidweight(&lfs), -1), &mdir) => 0; assert(mdir.u.m.weight == 1); lfsr_mdir_get(&lfs, &mdir, 0, LFSR_TAG_REG, buffer, SIZE) => SIZE; assert(memcmp(buffer, "a", 1) == 0); lfsr_mdir_t msibling; - lfsr_mtree_lookup(&lfs, LFSR_MID(1, -1), &msibling) => 0; + lfsr_mtree_lookup(&lfs, LFSR_MID(1*lfsr_mbidweight(&lfs), -1), &msibling) => 0; assert(msibling.u.m.weight == 1); lfsr_mdir_get(&lfs, &msibling, 0, LFSR_TAG_REG, buffer, SIZE) => SIZE; @@ -3774,18 +3774,18 @@ code = ''' // and the tree should still work // assert mdirs were unininlined and split - assert(lfsr_mtree_weight(&lfs) == 2); + assert(lfsr_mtree_weight(&lfs) == 2*lfsr_mbidweight(&lfs)); // assert mroot now has no entries assert(lfs.mroot.u.m.weight == 0); // assert that our entries are still in the mtree - lfsr_mtree_lookup(&lfs, LFSR_MID(0, -1), &mdir) => 0; + lfsr_mtree_lookup(&lfs, LFSR_MID(0*lfsr_mbidweight(&lfs), -1), &mdir) => 0; assert(mdir.u.m.weight == 1); lfsr_mdir_get(&lfs, &mdir, 0, LFSR_TAG_REG, buffer, SIZE) => SIZE; assert(memcmp(buffer, "a", 1) == 0); - lfsr_mtree_lookup(&lfs, LFSR_MID(1, -1), &msibling) => 0; + lfsr_mtree_lookup(&lfs, LFSR_MID(1*lfsr_mbidweight(&lfs), -1), &msibling) => 0; assert(msibling.u.m.weight == 1); lfsr_mdir_get(&lfs, &msibling, 0, LFSR_TAG_REG, buffer, SIZE) => SIZE; @@ -3956,7 +3956,7 @@ code = ''' lfs_size_t i = 0; for (lfs_ssize_t mid = 0; mid < lfs_smax32(lfsr_mtree_weight(&lfs), 1); - mid++) { + mid += lfsr_mbidweight(&lfs)) { lfsr_mdir_t mdir; lfsr_mtree_lookup(&lfs, LFSR_MID(mid, -1), &mdir) => 0; for (mdir.mid.rid = 0; @@ -4041,7 +4041,7 @@ code = ''' i = 0; for (lfs_ssize_t mid = 0; mid < lfs_smax32(lfsr_mtree_weight(&lfs), 1); - mid++) { + mid += lfsr_mbidweight(&lfs)) { lfsr_mdir_t mdir; lfsr_mtree_lookup(&lfs, LFSR_MID(mid, -1), &mdir) => 0; for (mdir.mid.rid = 0; @@ -4115,7 +4115,7 @@ code = ''' for (lfs_ssize_t mid = 0; mid < lfs_smax32(lfsr_mtree_weight(&lfs), 1); - mid++) { + mid += lfsr_mbidweight(&lfs)) { lfsr_mdir_t mdir; lfsr_mtree_lookup(&lfs, LFSR_MID(mid, -1), &mdir) => 0; for (mdir.mid.rid = 0; @@ -4205,7 +4205,7 @@ code = ''' for (lfs_ssize_t mid = 0; mid < lfs_smax32(lfsr_mtree_weight(&lfs), 1); - mid++) { + mid += lfsr_mbidweight(&lfs)) { lfsr_mdir_t mdir; lfsr_mtree_lookup(&lfs, LFSR_MID(mid, -1), &mdir) => 0; for (mdir.mid.rid = 0;