Skip to content

Commit 0f9195a

Browse files
committed
fix(avapager): Fix evict_page bug with low cache capacities
1 parent 042dbaa commit 0f9195a

3 files changed

Lines changed: 8 additions & 7 deletions

File tree

src/avapager.c

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -63,8 +63,6 @@ void ava_pager_deinit(AvaPager* pager) {
6363
static AvaPagerSlot* find_slot(AvaPager* pager, ava_pgid_t pgid) {
6464
uint32_t index = hash_pgid(pgid) % pager->hash_map_size;
6565
/* TODO: Improve worse-case, currently O(n) due to linear probing */
66-
if (!pager->hash_map[index])
67-
return NULL;
6866
for (uint32_t i=0; i < pager->hash_map_size; i++) {
6967
uint32_t cur = (index + i) % pager->hash_map_size;
7068
if (pager->hash_map[cur] && pager->hash_map[cur]->pgid == pgid) {
@@ -161,10 +159,11 @@ bool ava_pager_allocate(AvaPager* pager, ava_pgid_t* new_pgid) {
161159
ava_pager_unpin(pager, 0);
162160
return false;
163161
}
164-
header->free_page_start = page->header.free.next_free;
165162
ava_pager_mark_dirty(pager,index);
166-
page->header.free.next_free = 0;
167163
ava_pager_mark_dirty(pager,0);
164+
165+
header->free_page_start = page->header.free.next_free;
166+
page->header.free.next_free = 0;
168167
*new_pgid = index;
169168
ava_pager_unpin(pager, index);
170169
ava_pager_unpin(pager, 0);

src/avatree.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ static ava_pgid_t create_overflow_chain(AvaPager* pager, char* data, uint32_t si
1313
ava_pgid_t new_page;
1414
ava_pager_allocate(pager, &new_page);
1515
AvaTreePageHeader* page = ava_pager_get(pager, new_page);
16+
ava_pager_mark_dirty(pager, new_page);
1617
page->type = AVA_PAGE_TYPE_OVERFLOW;
1718

1819
if (first_page == 0)
@@ -30,7 +31,6 @@ static ava_pgid_t create_overflow_chain(AvaPager* pager, char* data, uint32_t si
3031
uint32_t to_write = (size-written > pager->page_size - sizeof(AvaTreePageHeader)) ? (pager->page_size - sizeof(AvaTreePageHeader)) : (size-written);
3132

3233
memcpy((uint8_t*)page + sizeof(AvaTreePageHeader), data + written, to_write);
33-
ava_pager_mark_dirty(pager, current_page);
3434
written += to_write;
3535
ava_pager_unpin(pager, new_page);
3636
}

tests/test_avatree.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,9 @@ class AvaTreeTest : public ::testing::Test {
6363

6464
p_interface = &mock_interface;
6565
p_file = (AvaFile*)&mock_file;
66-
66+
67+
/* Test with a low cache capacity to ensure that we don't have page leaks */
68+
pager.cache_capacity = 16;
6769
ava_pager_init(&pager, &p_interface, &p_file);
6870
}
6971

@@ -256,7 +258,7 @@ TEST_F(AvaTreeTest, InsertOverflowTest) {
256258

257259
while (page_id != 0) {
258260
AvaTreePageHeader* ovf = (AvaTreePageHeader*)ava_pager_get(&pager, page_id);
259-
EXPECT_EQ(ovf->type,AVA_PAGE_TYPE_OVERFLOW) << "Page #" << page_id << "was not set as type AVA_PAGE_TYPE_OVERFLOW!";
261+
EXPECT_EQ(ovf->type,AVA_PAGE_TYPE_OVERFLOW) << "Page #" << page_id << " was not set as type AVA_PAGE_TYPE_OVERFLOW!";
260262
size_t header_sz = sizeof(AvaTreePageHeader);
261263
size_t cap = pager.page_size - header_sz;
262264
size_t remaining = large_size - read_back.size();

0 commit comments

Comments
 (0)