Merge pull request #206 from urbit/barter-simsum/flist-infinite-loop-bugfix

pma: fix file growth infinite loop
This commit is contained in:
Edward Amsden 2024-02-29 13:48:05 -06:00 committed by GitHub
commit 3654703992
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 32 additions and 3 deletions

View File

@ -156,6 +156,9 @@ int main(int argc, char *argv[])
BT_findpath path = {0};
int rc = 0;
/* broken with recent changes. Maybe because we aren't mmapping the data
ranges (pure _bt_insert) */
#if 0
DPUTS("== test 1: insert");
@ -175,6 +178,7 @@ int main(int argc, char *argv[])
}
bt_state_close(state1);
#endif
DPUTS("== test 2: malloc");

View File

@ -732,6 +732,19 @@ _bt_dirtychild(BT_page *parent, size_t child_idx)
return BT_SUCC;
}
static int
_bt_dirtydata(BT_page *leaf, size_t child_idx)
/* effectively the same as _bt_dirtychild (setting the dirty bit at child_idx in
the given node), with the exception that we don't assert the dirty bit isn't
set. (Data may be written to the same fileoffset multiple times (a
malloc-free-malloc cycle) */
{
assert(child_idx < 2048);
uint8_t *flag = &leaf->head.dirty[child_idx >> 3];
*flag |= 1 << (child_idx & 0x7);
return BT_SUCC;
}
static int
_bt_cleanchild(BT_page *parent, size_t child_idx)
{
@ -1100,6 +1113,14 @@ _flist_insert(BT_flistnode **dst, pgno_t lo, pgno_t hi)
*dst = new;
return;
}
/* otherwise, insert discontinuous node */
BT_flistnode *new = calloc(1, sizeof *new);
new->lo = lo;
new->hi = hi;
new->next = *dst;
*dst = new;
return;
}
static void
@ -1417,6 +1438,8 @@ _bt_insert2(BT_state *state, vaof_t lo, vaof_t hi, pgno_t fo,
/* nullcond: node is a leaf */
if (meta->depth == depth) {
/* dirty the data range */
_bt_dirtydata(node, childidx);
/* guaranteed non-full and dirty by n-1 recursive call, so just insert */
return _bt_insertdat(lo, hi, fo, node, childidx);
}
@ -2731,8 +2754,6 @@ bt_free(BT_state *state, void *lo, void *hi)
abort();
}
/* insert null into btree */
_bt_insert(state, looff, hioff, 0);
/* insert freed range into mlist */
_mlist_insert(state, lo, hi);
/* insert freed range into flist */
@ -2742,7 +2763,11 @@ bt_free(BT_state *state, void *lo, void *hi)
BT_kv kv = leaf->datk[childidx];
vaof_t offset = looff - kv.va;
lopg = kv.fo + offset;
hipg = lopg + (looff - hioff);
hipg = lopg + (hioff - looff);
/* insert null into btree */
_bt_insert(state, looff, hioff, 0);
if (isdirty) {
_flist_insert(&state->flist, lopg, hipg);
}