Only update insert page if first free element

This commit is contained in:
Andrew Kane
2023-08-04 09:47:32 -07:00
parent e8a6becff7
commit fe934c1465
2 changed files with 8 additions and 5 deletions

View File

@@ -34,7 +34,7 @@ GetInsertPage(Relation index)
* Check for a free offset
*/
static bool
HnswFreeOffset(Relation index, Buffer buf, Page page, HnswElement element, Size ntupSize, Buffer *nbuf, Page *npage, OffsetNumber *freeOffno, OffsetNumber *freeNeighborOffno)
HnswFreeOffset(Relation index, Buffer buf, Page page, HnswElement element, Size ntupSize, Buffer *nbuf, Page *npage, OffsetNumber *freeOffno, OffsetNumber *freeNeighborOffno, BlockNumber *firstFreePage)
{
OffsetNumber offno;
OffsetNumber maxoffno = PageGetMaxOffsetNumber(page);
@@ -53,6 +53,9 @@ HnswFreeOffset(Relation index, Buffer buf, Page page, HnswElement element, Size
OffsetNumber neighborOffno = ItemPointerGetOffsetNumber(&etup->neighbortid);
ItemId itemid;
if (!BlockNumberIsValid(*firstFreePage))
*firstFreePage = BufferGetBlockNumber(buf);
if (neighborPage == BufferGetBlockNumber(buf))
{
*nbuf = buf;
@@ -124,6 +127,7 @@ WriteNewElementPages(Relation index, HnswElement e, int m)
Page npage;
OffsetNumber freeOffno = InvalidOffsetNumber;
OffsetNumber freeNeighborOffno = InvalidOffsetNumber;
BlockNumber firstFreePage = InvalidBlockNumber;
/* Calculate sizes */
etupSize = HNSW_ELEMENT_TUPLE_SIZE(dimensions);
@@ -163,7 +167,7 @@ WriteNewElementPages(Relation index, HnswElement e, int m)
}
/* Space from deleted item */
if (HnswFreeOffset(index, buf, page, e, ntupSize, &nbuf, &npage, &freeOffno, &freeNeighborOffno))
if (HnswFreeOffset(index, buf, page, e, ntupSize, &nbuf, &npage, &freeOffno, &freeNeighborOffno, &firstFreePage))
{
if (nbuf != buf)
npage = GenericXLogRegisterBuffer(state, nbuf, 0);
@@ -261,7 +265,7 @@ WriteNewElementPages(Relation index, HnswElement e, int m)
UnlockReleaseBuffer(nbuf);
/* Update the insert page */
if (insertPage != originalInsertPage)
if (insertPage != originalInsertPage && (!OffsetNumberIsValid(freeOffno) || firstFreePage == insertPage))
UpdateMetaPage(index, false, NULL, insertPage, MAIN_FORKNUM);
}

View File

@@ -38,7 +38,6 @@ $node->safe_psql("postgres",
# Check size
my $new_size = $node->safe_psql("postgres", "SELECT pg_total_relation_size('tst_v_idx');");
# TODO Improve
cmp_ok($new_size, "<=", $size * 2, "size does not increase too much");
cmp_ok($new_size, "<=", $size * 1.01, "size does not increase too much");
done_testing();