diff --git a/src/hnswinsert.c b/src/hnswinsert.c index b039b5c..d11e3eb 100644 --- a/src/hnswinsert.c +++ b/src/hnswinsert.c @@ -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); } diff --git a/test/t/011_hnsw_vacuum.pl b/test/t/011_hnsw_vacuum.pl index cc0a8be..67379e1 100644 --- a/test/t/011_hnsw_vacuum.pl +++ b/test/t/011_hnsw_vacuum.pl @@ -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();