Implemented incremental mtree traversal
Just like lfsr_btree_traversal_t, lfsr_mtree_traversal_t provides a mechanism for traversing the mtree incrementally, including any inner btree nodes. This is one level more complex than btree traversal because we also need to handle the mroot chain and traversal of rids in each mdir. Again, mtree traversal returns temporary decoded rbyd structs for inner nodes. Actually, mtree traversal only returns inner nodes... so maybe using lfsr_data_t here is the wrong choice: - tag=LFSR_TAG_BTREE => lfsr_rbyd_t - tag=LFSR_TAG_MDIR => lfsr_mdir_t
This commit is contained in:
+8
-15
@@ -4117,11 +4117,10 @@ code = '''
|
||||
uint8_t *seen = malloc((BLOCK_COUNT+7)/8);
|
||||
memset(seen, 0, (BLOCK_COUNT+7)/8);
|
||||
|
||||
lfsr_btree_traversal_t traversal;
|
||||
lfsr_btree_traversal_start(&lfs, &btree, &traversal) => 0;
|
||||
lfsr_btree_traversal_t traversal = LFSR_BTREE_TRAVERSAL_INIT;
|
||||
|
||||
for (lfs_block_t i = 0;; i++) {
|
||||
// a bit hacky, but catch infinite loops
|
||||
// a bit hacky, but this catches infinite loops
|
||||
assert(i < 2*N);
|
||||
|
||||
lfs_size_t bid_;
|
||||
@@ -4136,7 +4135,7 @@ code = '''
|
||||
}
|
||||
|
||||
if (tag_ == LFSR_TAG_BTREE) {
|
||||
const lfsr_rbyd_t *branch = (const lfsr_rbyd_t *)data_.buf.buffer;
|
||||
lfsr_rbyd_t *branch = (lfsr_rbyd_t *)data_.buf.buffer;
|
||||
printf("traversal: %d 0x%x w%d btree 0x%x.%x\n",
|
||||
bid_,
|
||||
tag_,
|
||||
@@ -4163,6 +4162,7 @@ code = '''
|
||||
cfg->prog(cfg, block, 0, buffer_, BLOCK_SIZE) => 0;
|
||||
}
|
||||
}
|
||||
free(seen);
|
||||
|
||||
// and the tree should still work
|
||||
|
||||
@@ -4180,9 +4180,6 @@ code = '''
|
||||
lfsr_btree_get(&lfs, &btree, n,
|
||||
&tag_, &weight_,
|
||||
buffer, 4, false) => LFS_ERR_NOENT;
|
||||
|
||||
// clean up traversal stuff
|
||||
free(seen);
|
||||
'''
|
||||
|
||||
[cases.test_btree_traversal_fuzz]
|
||||
@@ -4282,11 +4279,10 @@ code = '''
|
||||
uint8_t *seen = malloc((BLOCK_COUNT+7)/8);
|
||||
memset(seen, 0, (BLOCK_COUNT+7)/8);
|
||||
|
||||
lfsr_btree_traversal_t traversal;
|
||||
lfsr_btree_traversal_start(&lfs, &btree, &traversal) => 0;
|
||||
lfsr_btree_traversal_t traversal = LFSR_BTREE_TRAVERSAL_INIT;
|
||||
|
||||
for (lfs_block_t i = 0;; i++) {
|
||||
// a bit hacky, but catch infinite loops
|
||||
// a bit hacky, but this catches infinite loops
|
||||
assert(i < 2*N);
|
||||
|
||||
lfs_size_t bid_;
|
||||
@@ -4301,8 +4297,7 @@ code = '''
|
||||
}
|
||||
|
||||
if (tag_ == LFSR_TAG_BTREE) {
|
||||
const lfsr_rbyd_t *branch = (
|
||||
(const lfsr_rbyd_t *)data_.buf.buffer);
|
||||
lfsr_rbyd_t *branch = (lfsr_rbyd_t *)data_.buf.buffer;
|
||||
printf("traversal: %d 0x%x w%d btree 0x%x.%x\n",
|
||||
bid_,
|
||||
tag_,
|
||||
@@ -4329,6 +4324,7 @@ code = '''
|
||||
cfg->prog(cfg, block, 0, buffer_, BLOCK_SIZE) => 0;
|
||||
}
|
||||
}
|
||||
free(seen);
|
||||
|
||||
// and the tree should still work
|
||||
|
||||
@@ -4363,9 +4359,6 @@ code = '''
|
||||
&tag_, &weight_,
|
||||
buffer, 4, false) => LFS_ERR_NOENT;
|
||||
|
||||
// clean up traversal stuff
|
||||
free(seen);
|
||||
|
||||
// clean up sim
|
||||
free(sim);
|
||||
lfs_deinit(&lfs) => 0;
|
||||
|
||||
Reference in New Issue
Block a user