2023-12-07 02:17:51 +03:00
|
|
|
|
#include "btree.h"
|
|
|
|
|
#include "btree.c"
|
|
|
|
|
|
2023-12-14 05:32:45 +03:00
|
|
|
|
#include <stdlib.h>
|
|
|
|
|
#include <stdio.h>
|
2023-12-07 02:17:51 +03:00
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
|
_test_nodeinteg(BT_state *state, BT_findpath *path,
|
|
|
|
|
vaof_t lo, vaof_t hi, pgno_t pg)
|
|
|
|
|
{
|
|
|
|
|
size_t childidx = 0;
|
|
|
|
|
BT_page *parent = 0;
|
|
|
|
|
|
|
|
|
|
assert(SUCC(_bt_find(state, path, lo, hi)));
|
|
|
|
|
parent = path->path[path->depth];
|
|
|
|
|
childidx = path->idx[path->depth];
|
|
|
|
|
assert(parent->datk[childidx].fo == pg);
|
|
|
|
|
assert(parent->datk[childidx].va == lo);
|
|
|
|
|
assert(parent->datk[childidx+1].va == hi);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int main(int argc, char *argv[])
|
|
|
|
|
{
|
|
|
|
|
DPUTS("PMA Tests");
|
|
|
|
|
|
2023-12-09 02:15:31 +03:00
|
|
|
|
BT_state *state1;
|
2023-12-07 02:17:51 +03:00
|
|
|
|
BT_findpath path = {0};
|
|
|
|
|
int rc = 0;
|
|
|
|
|
|
2023-12-09 02:15:31 +03:00
|
|
|
|
|
2023-12-07 02:17:51 +03:00
|
|
|
|
DPUTS("== test 1: insert");
|
|
|
|
|
|
2023-12-09 02:15:31 +03:00
|
|
|
|
bt_state_new(&state1);
|
2023-12-14 02:25:35 +03:00
|
|
|
|
if (mkdir("./pmatest1", 0774) == -1)
|
|
|
|
|
return errno;
|
2023-12-09 02:15:31 +03:00
|
|
|
|
assert(SUCC(bt_state_open(state1, "./pmatest1", 0, 0644)));
|
|
|
|
|
|
|
|
|
|
#define LOWEST_ADDR 0x200000;
|
|
|
|
|
vaof_t lo = LOWEST_ADDR;
|
2023-12-07 02:17:51 +03:00
|
|
|
|
vaof_t hi = 0xDEADBEEF;
|
|
|
|
|
pgno_t pg = 1; /* dummy value */
|
|
|
|
|
for (size_t i = 0; i < BT_DAT_MAXKEYS * 4; ++i) {
|
2023-12-09 02:15:31 +03:00
|
|
|
|
DPRINTF("== i: %zu", i);
|
|
|
|
|
_bt_insert(state1, lo, hi, pg);
|
|
|
|
|
_test_nodeinteg(state1, &path, lo, hi, pg);
|
2023-12-07 02:17:51 +03:00
|
|
|
|
lo++; pg++;
|
|
|
|
|
}
|
|
|
|
|
|
2023-12-09 02:15:31 +03:00
|
|
|
|
bt_state_close(state1);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
DPUTS("== test 2: malloc");
|
|
|
|
|
BT_state *state2;
|
|
|
|
|
|
|
|
|
|
bt_state_new(&state2);
|
2023-12-14 02:25:35 +03:00
|
|
|
|
if (mkdir("./pmatest2", 0774) == -1)
|
|
|
|
|
return errno;
|
2023-12-09 02:15:31 +03:00
|
|
|
|
assert(SUCC(bt_state_open(state2, "./pmatest2", 0, 0644)));
|
|
|
|
|
|
|
|
|
|
void *t2a = bt_malloc(state2, 10);
|
|
|
|
|
bt_free(state2, t2a, (BT_page*)t2a + 10);
|
2023-12-09 02:40:15 +03:00
|
|
|
|
void *t2b = bt_malloc(state2, 10);
|
|
|
|
|
/* should have pulled the same pointer due to eager mlist coalescing */
|
2023-12-09 02:58:24 +03:00
|
|
|
|
assert(t2a == t2b);
|
2023-12-09 02:40:15 +03:00
|
|
|
|
ZERO(&path, sizeof path);
|
|
|
|
|
_bt_find(state2, &path, addr2off(t2b), addr2off((BT_page *)t2b + 10));
|
2023-12-09 03:40:37 +03:00
|
|
|
|
#define T2P1_PRNT0 (path.path[path.depth])
|
|
|
|
|
#define T2P1_CIDX0 (path.idx[path.depth])
|
|
|
|
|
#define T2P1_CIDX1 (path.idx[path.depth] + 1)
|
|
|
|
|
/* check length as represented in btree */
|
|
|
|
|
assert(T2P1_PRNT0->datk[T2P1_CIDX1].va
|
|
|
|
|
- T2P1_PRNT0->datk[T2P1_CIDX0].va
|
|
|
|
|
== 10);
|
2023-12-09 02:40:15 +03:00
|
|
|
|
bt_free(state2, t2b, (BT_page*)t2b + 10);
|
|
|
|
|
ZERO(&path, sizeof path);
|
|
|
|
|
_bt_find(state2, &path, addr2off(t2b), addr2off((BT_page *)t2b + 10));
|
2023-12-09 03:40:37 +03:00
|
|
|
|
/* fo should be zero (free) */
|
|
|
|
|
assert(path.path[path.depth]->datk[path.idx[path.depth]].fo == 0);
|
2023-12-09 02:40:15 +03:00
|
|
|
|
/* should invoke deletion coalescing - 10 page free range in btree */
|
|
|
|
|
void *t2c = bt_malloc(state2, 20);
|
2023-12-09 02:15:31 +03:00
|
|
|
|
|
2023-12-14 05:32:45 +03:00
|
|
|
|
bt_state_close(state2);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
DPUTS("== test 3: ephemeral structure restoration");
|
|
|
|
|
BT_state *state3;
|
|
|
|
|
|
|
|
|
|
bt_state_new(&state3);
|
|
|
|
|
if (mkdir("./pmatest3", 0774) == -1)
|
|
|
|
|
return errno;
|
|
|
|
|
assert(SUCC(bt_state_open(state3, "./pmatest3", 0, 0644)));
|
|
|
|
|
|
|
|
|
|
typedef struct lohi_pair lohi_pair;
|
|
|
|
|
struct lohi_pair
|
|
|
|
|
{
|
|
|
|
|
BT_page *lo;
|
|
|
|
|
BT_page *hi;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/* ;;: getting strange abort in bt_malloc precisely when i = 131
|
|
|
|
|
|
|
|
|
|
bt_malloc:2632 mmap: failed to map at addr 0x100811538000, errno: Invalid argument
|
|
|
|
|
|
|
|
|
|
* obviously the addr is arbitrary
|
|
|
|
|
*/
|
|
|
|
|
#define ITERATIONS 1000
|
|
|
|
|
#define MAXALLOCPG 0xFF
|
|
|
|
|
lohi_pair allocs[ITERATIONS] = {0};
|
|
|
|
|
for (size_t i = 0; i < ITERATIONS; i++) {
|
|
|
|
|
/* malloc a random number of pages < 256 and store in the allocs array */
|
|
|
|
|
int pages = rand();
|
|
|
|
|
pages &= MAXALLOCPG;
|
|
|
|
|
allocs[i].lo = bt_malloc(state3, pages);
|
|
|
|
|
allocs[i].hi = allocs[i].lo + pages;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* sync the state */
|
|
|
|
|
bt_sync(state3);
|
|
|
|
|
|
2023-12-07 02:17:51 +03:00
|
|
|
|
return 0;
|
|
|
|
|
}
|