From 90a042e5aa0379263b57c76de726285af73ce495 Mon Sep 17 00:00:00 2001 From: Andrew Kane Date: Mon, 21 Aug 2023 02:24:53 -0700 Subject: [PATCH] Wait for selects to complete --- src/hnswscan.c | 3 +++ src/hnswutils.c | 4 +--- src/hnswvacuum.c | 4 ++++ 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/src/hnswscan.c b/src/hnswscan.c index 4a5c7f9..040738b 100644 --- a/src/hnswscan.c +++ b/src/hnswscan.c @@ -4,6 +4,7 @@ #include "hnsw.h" #include "pgstat.h" #include "storage/bufmgr.h" +#include "storage/lmgr.h" #include "utils/memutils.h" /* @@ -144,7 +145,9 @@ hnswgettuple(IndexScanDesc scan, ScanDirection dir) HnswNormValue(so->normprocinfo, so->collation, &value, NULL); } + LockPage(scan->indexRelation, HNSW_HEAD_BLKNO, ShareLock); so->w = GetScanItems(scan, value); + UnlockPage(scan->indexRelation, HNSW_HEAD_BLKNO, ShareLock); so->first = false; } diff --git a/src/hnswutils.c b/src/hnswutils.c index 4e7f7eb..e1bd17c 100644 --- a/src/hnswutils.c +++ b/src/hnswutils.c @@ -625,9 +625,7 @@ HnswSearchLayer(Datum q, List *ep, int ef, int lc, Relation index, FmgrInfo *pro else HnswLoadElement(e->element, &eDistance, &q, index, procinfo, collation, inserting); - /* Skip if fully deleted */ - if (e->element->deleted) - continue; + Assert(!e->element->deleted); /* Skip self for vacuuming update */ if (skipElement != NULL && e->element->neighborPage == skipElement->neighborPage && e->element->neighborOffno == skipElement->neighborOffno) diff --git a/src/hnswvacuum.c b/src/hnswvacuum.c index 43b63de..425e737 100644 --- a/src/hnswvacuum.c +++ b/src/hnswvacuum.c @@ -404,6 +404,10 @@ MarkDeleted(HnswVacuumState * vacuumstate) Relation index = vacuumstate->index; BufferAccessStrategy bas = vacuumstate->bas; + /* Wait for selects to complete */ + LockPage(index, HNSW_HEAD_BLKNO, ExclusiveLock); + UnlockPage(index, HNSW_HEAD_BLKNO, ExclusiveLock); + while (BlockNumberIsValid(blkno)) { Buffer buf;