Ported over most rbyd+btree tests to new attr-list format

Found a bug, and maybe a fundamental issue:

- The lfs_btree_lookupnext_ in lfsr_btree_commit_ no longer needs the
  min32, since we never commit with bid pointing past the end of the
  btree anymore.

  This was mixing the unsigned min32 with our now-signed bid type,
  causing the wrong btree leaf to be fetched when inserting at bid=-1 in
  a non-empty btree.

  Easy fix.

- lfsr_btree_commit_ with bid!=-1, rid=-1 (inserting at the beginning of
  not-the-first rbyd) now actually appends to the leaf to the left of
  the rbyd instead of inserting into the expected rbyd because of how
  lfs_btree_lookup_ works.

  Initially, this doesn't seem like it would be an issue, these should
  be more-or-less equivalent, but this doesn't match
  lfsr_btree_namelookup! This is a big problem!

  This wasn't noticed because it's rare for the high-level tests to
  trigger that many btree splits with names. Named btrees are only used
  for the mtree, and we need mdirs to split before the mtree even splits
  once.

  Not an easy fix.

On the upside, these low-level tests continue to prove themselves
valuable, if tedious to maintain...
This commit is contained in:
Christopher Haster
2024-01-26 13:16:36 -06:00
parent f323ea1bda
commit 7868ec7122
3 changed files with 1260 additions and 1963 deletions
+61 -66
View File
@@ -28,8 +28,8 @@ code = '''
lfs_size_t bid, lfsr_tag_t tag, lfs_size_t weight,
lfsr_data_t data) {
LFS_ASSERT(bid <= btree->weight);
return lfsr_btree_commit(lfs, btree, LFSR_ATTRS(
LFSR_ATTR(bid, TAG(tag), +weight, DATA(data))));
return lfsr_btree_commit(lfs, btree, bid-1, LFSR_ATTRS(
LFSR_ATTR(TAG(tag), +weight, DATA(data))));
}
static int lfsr_btree_set(lfs_t *lfs, lfsr_btree_t *btree,
@@ -49,9 +49,9 @@ code = '''
// note we need a second tag here in case our entry has a
// name attributes, the name attribute holds the weight not
// the struct tag
return lfsr_btree_commit(lfs, btree, LFSR_ATTRS(
LFSR_ATTR(bid, SUBMASK(TAG(tag)), 0, DATA(data)),
LFSR_ATTR(bid, GROW, weight - weight_, NULL())));
return lfsr_btree_commit(lfs, btree, bid, LFSR_ATTRS(
LFSR_ATTR(SUBMASK(TAG(tag)), 0, DATA(data)),
LFSR_ATTR(GROW, weight - weight_, NULL())));
}
static int lfsr_btree_pop(lfs_t *lfs, lfsr_btree_t *btree, lfs_size_t bid) {
@@ -66,8 +66,8 @@ code = '''
return err;
}
return lfsr_btree_commit(lfs, btree, LFSR_ATTRS(
LFSR_ATTR(bid, RM, -weight_, NULL())));
return lfsr_btree_commit(lfs, btree, bid, LFSR_ATTRS(
LFSR_ATTR(RM, -weight_, NULL())));
}
static int lfsr_btree_split(lfs_t *lfs, lfsr_btree_t *btree,
@@ -88,21 +88,17 @@ code = '''
lfsr_attr_t attrs[4];
lfs_size_t attr_count = 0;
attrs[attr_count++] = LFSR_ATTR(bid, GROW, +weight1-weight_, NULL());
attrs[attr_count++] = LFSR_ATTR(bid-(weight_-1)+weight1-1,
TAG(tag1), 0, DATA(data1));
attrs[attr_count++] = LFSR_ATTR(GROW, +weight1-weight_, NULL());
attrs[attr_count++] = LFSR_ATTR(TAG(tag1), 0, DATA(data1));
if (lfsr_data_size(&name) > 0) {
attrs[attr_count++] = LFSR_ATTR(bid-(weight_-1)+weight1,
NAME, +weight2, DATA(name));
attrs[attr_count++] = LFSR_ATTR(bid-(weight_-1)+weight1+weight2-1,
TAG(tag2), 0, DATA(data2));
attrs[attr_count++] = LFSR_ATTR(NAME, +weight2, DATA(name));
attrs[attr_count++] = LFSR_ATTR(TAG(tag2), 0, DATA(data2));
} else {
attrs[attr_count++] = LFSR_ATTR(bid-(weight_-1)+weight1,
TAG(tag2), +weight2, DATA(data2));
attrs[attr_count++] = LFSR_ATTR(TAG(tag2), +weight2, DATA(data2));
}
LFS_ASSERT(attr_count <= sizeof(attrs)/sizeof(lfsr_attr_t));
return lfsr_btree_commit(lfs, btree, attrs, attr_count);
return lfsr_btree_commit(lfs, btree, bid, attrs, attr_count);
}
'''
@@ -3188,10 +3184,10 @@ code = '''
// create a single-entry tree
lfsr_btree_t btree;
lfsr_btree_alloc(&lfs, &btree) => 0;
lfsr_btree_commit(&lfs, &btree, LFSR_ATTRS(
LFSR_ATTR(0,
NAME, +1, CAT(LFSR_DATA_LEB128(0), LFSR_DATA_BUF("aaa", 3))),
LFSR_ATTR(0, DATA, 0, BUF("0", 1)))) => 0;
lfsr_btree_commit(&lfs, &btree, -1, LFSR_ATTRS(
LFSR_ATTR(NAME, +1,
CAT(LFSR_DATA_LEB128(0), LFSR_DATA_BUF("aaa", 3))),
LFSR_ATTR(DATA, 0, BUF("0", 1)))) => 0;
printf("btree: w%d 0x%x.%x\n",
btree.weight,
btree.blocks[0],
@@ -3240,10 +3236,10 @@ code = '''
// create a two-entry tree
lfsr_btree_t btree;
lfsr_btree_alloc(&lfs, &btree) => 0;
lfsr_btree_commit(&lfs, &btree, LFSR_ATTRS(
LFSR_ATTR(0,
NAME, +1, CAT(LFSR_DATA_LEB128(0), LFSR_DATA_BUF("aaa", 3))),
LFSR_ATTR(0, DATA, 0, BUF("0", 1)))) => 0;
lfsr_btree_commit(&lfs, &btree, -1, LFSR_ATTRS(
LFSR_ATTR(NAME, +1,
CAT(LFSR_DATA_LEB128(0), LFSR_DATA_BUF("aaa", 3))),
LFSR_ATTR(DATA, 0, BUF("0", 1)))) => 0;
lfsr_btree_split(&lfs, &btree, 0,
LFSR_DATA_CAT(LFSR_DATA_LEB128(0), LFSR_DATA_BUF("aab", 3)),
LFSR_TAG_DATA, 1, LFSR_DATA_BUF("0", 1),
@@ -3304,10 +3300,10 @@ code = '''
// create a two-entry tree
lfsr_btree_t btree;
lfsr_btree_alloc(&lfs, &btree) => 0;
lfsr_btree_commit(&lfs, &btree, LFSR_ATTRS(
LFSR_ATTR(0,
NAME, +1, CAT(LFSR_DATA_LEB128(0), LFSR_DATA_BUF("aaa", 3))),
LFSR_ATTR(0, DATA, 0, BUF("0", 1)))) => 0;
lfsr_btree_commit(&lfs, &btree, -1, LFSR_ATTRS(
LFSR_ATTR(NAME, +1,
CAT(LFSR_DATA_LEB128(0), LFSR_DATA_BUF("aaa", 3))),
LFSR_ATTR(DATA, 0, BUF("0", 1)))) => 0;
lfsr_btree_split(&lfs, &btree, 0,
LFSR_DATA_CAT(LFSR_DATA_LEB128(1*DID), LFSR_DATA_BUF("aab", 3)),
LFSR_TAG_DATA, 1, LFSR_DATA_BUF("0", 1),
@@ -3380,10 +3376,10 @@ code = '''
// create a two-entry tree
lfsr_btree_t btree;
lfsr_btree_alloc(&lfs, &btree) => 0;
lfsr_btree_commit(&lfs, &btree, LFSR_ATTRS(
LFSR_ATTR(0,
NAME, +1, CAT(LFSR_DATA_LEB128(0), LFSR_DATA_BUF("aaa", 3))),
LFSR_ATTR(0, DATA, 0, BUF("0", 1)))) => 0;
lfsr_btree_commit(&lfs, &btree, -1, LFSR_ATTRS(
LFSR_ATTR(NAME, +1,
CAT(LFSR_DATA_LEB128(0), LFSR_DATA_BUF("aaa", 3))),
LFSR_ATTR( DATA, 0, BUF("0", 1)))) => 0;
lfsr_btree_split(&lfs, &btree, 0,
LFSR_DATA_CAT(LFSR_DATA_LEB128(2*DID), LFSR_DATA_BUF("aac", 3)),
LFSR_TAG_DATA, 1, LFSR_DATA_BUF("1", 1),
@@ -3462,10 +3458,10 @@ code = '''
char name[3] = {
alphas[(0/26/26) % 26], alphas[(0/26) % 26], alphas[0 % 26]
};
lfsr_btree_commit(&lfs, &btree, LFSR_ATTRS(
LFSR_ATTR(0,
NAME, +1, CAT(LFSR_DATA_LEB128(0), LFSR_DATA_BUF(name, 3))),
LFSR_ATTR(0, DATA, 0, BUF(&nums[0 % 10], 1)))) => 0;
lfsr_btree_commit(&lfs, &btree, -1, LFSR_ATTRS(
LFSR_ATTR(NAME, +1,
CAT(LFSR_DATA_LEB128(0), LFSR_DATA_BUF(name, 3))),
LFSR_ATTR(DATA, 0, BUF(&nums[0 % 10], 1)))) => 0;
lfs_size_t n = 1;
for (lfs_size_t i = 1; i < N; i++) {
char name[3] = {
@@ -3531,10 +3527,10 @@ code = '''
// create a btree
lfsr_btree_t btree;
lfsr_btree_alloc(&lfs, &btree) => 0;
lfsr_btree_commit(&lfs, &btree, LFSR_ATTRS(
LFSR_ATTR(0,
NAME, +1, CAT(LFSR_DATA_LEB128(0), LFSR_DATA_BUF("___", 3))),
LFSR_ATTR(0, DATA, 0, BUF("_", 1)))) => 0;
lfsr_btree_commit(&lfs, &btree, -1, LFSR_ATTRS(
LFSR_ATTR(NAME, +1,
CAT(LFSR_DATA_LEB128(0), LFSR_DATA_BUF("___", 3))),
LFSR_ATTR(DATA, 0, BUF("_", 1)))) => 0;
// set up a simulation to compare against
//
@@ -3649,10 +3645,10 @@ code = '''
char name[3] = {
alphas[(0/26/26) % 26], alphas[(0/26) % 26], alphas[0 % 26]
};
lfsr_btree_commit(&lfs, &btree, LFSR_ATTRS(
LFSR_ATTR(0,
NAME, +W, CAT(LFSR_DATA_LEB128(0), LFSR_DATA_BUF(name, 3))),
LFSR_ATTR(W-1, DATA, 0, BUF(&nums[0 % 10], 1)))) => 0;
lfsr_btree_commit(&lfs, &btree, -1, LFSR_ATTRS(
LFSR_ATTR(NAME, +W,
CAT(LFSR_DATA_LEB128(0), LFSR_DATA_BUF(name, 3))),
LFSR_ATTR(DATA, 0, BUF(&nums[0 % 10], 1)))) => 0;
lfs_size_t n = 1;
for (lfs_size_t i = 1; i < N; i++) {
char name[3] = {
@@ -3719,10 +3715,10 @@ code = '''
// create a btree
lfsr_btree_t btree;
lfsr_btree_alloc(&lfs, &btree) => 0;
lfsr_btree_commit(&lfs, &btree, LFSR_ATTRS(
LFSR_ATTR(0,
NAME, +W, CAT(LFSR_DATA_LEB128(0), LFSR_DATA_BUF("___", 3))),
LFSR_ATTR(W-1, DATA, 0, BUF("_", 1)))) => 0;
lfsr_btree_commit(&lfs, &btree, -1, LFSR_ATTRS(
LFSR_ATTR(NAME, +W,
CAT(LFSR_DATA_LEB128(0), LFSR_DATA_BUF("___", 3))),
LFSR_ATTR(DATA, 0, BUF("_", 1)))) => 0;
// set up a simulation to compare against
//
@@ -3873,10 +3869,10 @@ code = '''
// create a btree
lfsr_btree_t btree;
lfsr_btree_alloc(&lfs, &btree) => 0;
lfsr_btree_commit(&lfs, &btree, LFSR_ATTRS(
LFSR_ATTR(0,
NAME, +1, CAT(LFSR_DATA_LEB128(0), LFSR_DATA_BUF("___", 3))),
LFSR_ATTR(0, DATA, 0, BUF("_", 1)))) => 0;
lfsr_btree_commit(&lfs, &btree, -1, LFSR_ATTRS(
LFSR_ATTR(NAME, +1,
CAT(LFSR_DATA_LEB128(0), LFSR_DATA_BUF("___", 3))),
LFSR_ATTR(DATA, 0, BUF("_", 1)))) => 0;
// set up a simulation to compare against
//
@@ -3922,12 +3918,12 @@ code = '''
assert(cmp >= 0);
assert(lfs_cmp(cmp) != 0);
if (lfs_cmp(cmp) > 0) {
int err = lfsr_btree_commit(&lfs, &btree, LFSR_ATTRS(
LFSR_ATTR(split_bid,
NAME, +1, CAT(
int err = lfsr_btree_commit(&lfs, &btree,
split_bid-1, LFSR_ATTRS(
LFSR_ATTR(NAME, +1, CAT(
LFSR_DATA_LEB128(0),
LFSR_DATA_BUF(name, 3))),
LFSR_ATTR(split_bid, DATA, 0, BUF(&nums[i % 10], 1))));
LFSR_ATTR(DATA, 0, BUF(&nums[i % 10], 1))));
// ignore space issues
if (err == LFS_ERR_NOSPC) {
break;
@@ -4043,10 +4039,10 @@ code = '''
// create a btree
lfsr_btree_t btree;
lfsr_btree_alloc(&lfs, &btree) => 0;
lfsr_btree_commit(&lfs, &btree, LFSR_ATTRS(
LFSR_ATTR(0,
NAME, +W, CAT(LFSR_DATA_LEB128(0), LFSR_DATA_BUF("___", 3))),
LFSR_ATTR(W-1, DATA, 0, BUF("_", 1)))) => 0;
lfsr_btree_commit(&lfs, &btree, -1, LFSR_ATTRS(
LFSR_ATTR(NAME, +W,
CAT(LFSR_DATA_LEB128(0), LFSR_DATA_BUF("___", 3))),
LFSR_ATTR(DATA, 0, BUF("_", 1)))) => 0;
// set up a simulation to compare against
//
@@ -4104,13 +4100,12 @@ code = '''
assert(cmp >= 0);
assert(lfs_cmp(cmp) != 0);
if (lfs_cmp(cmp) > 0) {
int err = lfsr_btree_commit(&lfs, &btree, LFSR_ATTRS(
LFSR_ATTR(split_bid-(split_weight-1),
NAME, +weight, CAT(
int err = lfsr_btree_commit(&lfs, &btree,
split_bid-(split_weight-1)-1, LFSR_ATTRS(
LFSR_ATTR(NAME, +weight, CAT(
LFSR_DATA_LEB128(0),
LFSR_DATA_BUF(name, 3))),
LFSR_ATTR(split_bid-(split_weight-1)+(weight-1),
DATA, 0, BUF(&nums[i % 10], 1))));
LFSR_ATTR(DATA, 0, BUF(&nums[i % 10], 1))));
// ignore space issues
if (err == LFS_ERR_NOSPC) {
break;
+1198 -1895
View File
File diff suppressed because it is too large Load Diff