Improved insert logic [skip ci]

This commit is contained in:
Andrew Kane
2023-08-11 12:39:22 -07:00
parent e7a913f361
commit 573a336f53

View File

@@ -128,6 +128,7 @@ WriteNewElementPages(Relation index, HnswElement e, int m, BlockNumber insertPag
OffsetNumber freeOffno = InvalidOffsetNumber;
OffsetNumber freeNeighborOffno = InvalidOffsetNumber;
BlockNumber firstFreePage = InvalidBlockNumber;
bool lastPage;
/* Calculate sizes */
etupSize = HNSW_ELEMENT_TUPLE_SIZE(dimensions);
@@ -152,9 +153,14 @@ WriteNewElementPages(Relation index, HnswElement e, int m, BlockNumber insertPag
state = GenericXLogStart(index);
page = GenericXLogRegisterBuffer(state, buf, 0);
/* First, try the fastest path */
/* Space for both tuples on the current page */
if (PageGetFreeSpace(page) >= combinedSize)
lastPage = !BlockNumberIsValid(HnswPageGetOpaque(page)->nextblkno);
/*
* First, try the fastest path: space for both tuples on the current
* page. Only check on last page to avoid splitting existing tuples in
* rare cases (even though this is technically fine).
*/
if (lastPage && PageGetFreeSpace(page) >= combinedSize)
{
nbuf = buf;
npage = page;
@@ -172,7 +178,7 @@ WriteNewElementPages(Relation index, HnswElement e, int m, BlockNumber insertPag
/* Finally, try space for element only if last page */
/* Skip if both tuples can fit on the same page */
if (combinedSize > maxSize && PageGetFreeSpace(page) >= etupSize && !BlockNumberIsValid(HnswPageGetOpaque(page)->nextblkno))
if (lastPage && combinedSize > maxSize && PageGetFreeSpace(page) >= etupSize)
{
HnswInsertAppendPage(index, &nbuf, &npage, state, page);
break;