Moved rid into the mdir struct

When updating any opened mdirs to keep things in sync, we need to know
what rid the mdir is targeting in order to know which on-disk mdir it
should follow in the case of splits. Making this rid an actual member of
the mdir struct simplifies things.

This adds some RAM cost, though the plan is to merge the mid/rid into a
single integer, which requires this change and should actually save RAM
in the long run.

            code          stack
  before:  22342
  after:   22204 (-0.6%)   2144 (+1.1%)
This commit is contained in:
Christopher Haster
2023-07-31 18:15:24 -05:00
parent 7387e7f2bb
commit 18e1eb0b41
4 changed files with 963 additions and 936 deletions
+197 -199
View File
File diff suppressed because it is too large Load Diff
+7 -6
View File
@@ -373,14 +373,15 @@ typedef struct lfsr_mdir {
// -1 => mroot
// >=0 => bid in the mtree
lfs_ssize_t mid;
lfsr_rbyd_t rbyd;
lfs_block_t redund_block;
lfs_ssize_t rid;
struct {
lfsr_rbyd_t rbyd;
lfs_block_t redund_block;
} m;
} lfsr_mdir_t;
typedef struct lfsr_openedmdir {
struct lfsr_openedmdir *next;
// this rid is followed during splits
lfs_ssize_t rid;
lfsr_mdir_t mdir;
} lfsr_openedmdir_t;
@@ -395,7 +396,7 @@ typedef struct lfsr_openedmdir {
typedef struct lfsr_grm {
struct {
lfs_ssize_t mid;
lfs_size_t rid;
lfs_ssize_t rid;
} rms[2];
} lfsr_grm_t;
@@ -423,7 +424,7 @@ typedef struct lfs_dir {
} lfs_dir_t;
typedef struct lfsr_dir {
lfsr_openedmdir_t mdir;
lfsr_openedmdir_t m;
lfs_size_t did;
lfs_ssize_t dstart_mid;
lfs_ssize_t dstart_rid;
+747 -719
View File
File diff suppressed because it is too large Load Diff
+12 -12
View File
@@ -104,12 +104,12 @@ code = '''
lfsr_mount(&lfs, cfg) => 0;
lfs_alloc_ack(&lfs);
// remove root dstart for now
lfsr_mdir_commit(&lfs, &lfs.mroot, &(lfs_ssize_t){-1}, LFSR_ATTRS(
lfsr_mdir_commit(&lfs, &lfs.mroot, LFSR_ATTRS(
LFSR_ATTR(0, UNR, -1, NULL, 0))) => 0;
lfsr_mdir_t mdir;
lfsr_mtree_lookup(&lfs, lfsr_mtree_weight(&lfs)-1, &mdir) => 0;
lfs_ssize_t rid = 0;
lfsr_mtree_lookup(&lfs, lfsr_mtree_weight(&lfs)-1, -1, &mdir) => 0;
mdir.rid = 0;
lfs_size_t count = 0;
while (true) {
@@ -120,20 +120,20 @@ code = '''
lfs_alloc_ack(&lfs);
// keep creating new metadata entries until we run out of space
int err = lfsr_mdir_commit(&lfs, &mdir, &rid, LFSR_ATTRS(
LFSR_ATTR(rid, INLINED, +1, &alphas[count % 26], 1)));
int err = lfsr_mdir_commit(&lfs, &mdir, LFSR_ATTRS(
LFSR_ATTR(mdir.rid, INLINED, +1, &alphas[count % 26], 1)));
assert(!err || err == LFS_ERR_NOSPC);
if (err == LFS_ERR_NOSPC) {
break;
}
uint8_t buffer[4];
lfsr_mdir_get(&lfs, &mdir, rid, LFSR_TAG_INLINED,
lfsr_mdir_get(&lfs, &mdir, mdir.rid, LFSR_TAG_INLINED,
buffer, 4) => 1;
assert(memcmp(buffer, &alphas[count % 26], 1) == 0);
count += 1;
rid += 1;
mdir.rid += 1;
}
printf("alloced %d metadata entries in %d blocks\n",
@@ -145,12 +145,12 @@ code = '''
mid < (lfs_ssize_t)lfsr_mtree_weight(&lfs);
mid++) {
lfsr_mdir_t mdir;
lfsr_mtree_lookup(&lfs, mid, &mdir) => 0;
for (lfs_ssize_t rid = 0;
rid < (lfs_ssize_t)lfsr_mdir_weight(&mdir);
rid++) {
lfsr_mtree_lookup(&lfs, mid, -1, &mdir) => 0;
for (mdir.rid = 0;
mdir.rid < (lfs_ssize_t)lfsr_mdir_weight(&mdir);
mdir.rid++) {
uint8_t buffer[4];
lfsr_mdir_get(&lfs, &mdir, rid, LFSR_TAG_INLINED,
lfsr_mdir_get(&lfs, &mdir, mdir.rid, LFSR_TAG_INLINED,
buffer, 4) => 1;
assert(memcmp(buffer, &alphas[i % 26], 1) == 0);
i += 1;