diff --git a/src/hnswinsert.c b/src/hnswinsert.c index f461963..19f2fee 100644 --- a/src/hnswinsert.c +++ b/src/hnswinsert.c @@ -561,6 +561,12 @@ HnswInsertTuple(Relation index, Datum *values, bool *isnull, ItemPointer heap_ti element = HnswInitElement(heap_tid, m, ml, HnswGetMaxLevel(m)); element->vec = DatumGetVector(value); + /* + * Get a shared lock for the duration of the insert. Use a page lock so it + * does not interfere with buffer lock (or reads when vacuuming). + */ + LockPage(index, HNSW_METAPAGE_BLKNO, ShareLock); + /* Get entry point */ entryPoint = HnswGetEntryPoint(index); @@ -568,7 +574,10 @@ HnswInsertTuple(Relation index, Datum *values, bool *isnull, ItemPointer heap_ti if (entryPoint == NULL) { if (HnswAddEntryPoint(index, element, m, &entryPoint)) + { + UnlockPage(index, HNSW_METAPAGE_BLKNO, ShareLock); return true; + } } /* Insert element in graph */ @@ -580,6 +589,9 @@ HnswInsertTuple(Relation index, Datum *values, bool *isnull, ItemPointer heap_ti /* Write to disk */ WriteElement(index, procinfo, collation, element, m, efConstruction, dup, entryPoint); + /* Release shared lock */ + UnlockPage(index, HNSW_METAPAGE_BLKNO, ShareLock); + return true; } diff --git a/src/hnswvacuum.c b/src/hnswvacuum.c index e4db3e8..ee34039 100644 --- a/src/hnswvacuum.c +++ b/src/hnswvacuum.c @@ -5,6 +5,7 @@ #include "commands/vacuum.h" #include "hnsw.h" #include "storage/bufmgr.h" +#include "storage/lmgr.h" #include "utils/memutils.h" /* @@ -256,6 +257,10 @@ RepairGraphEntryPoint(HnswVacuumState * vacuumstate) * ideal. */ + /* Wait for inserts to complete */ + LockPage(index, HNSW_METAPAGE_BLKNO, ExclusiveLock); + UnlockPage(index, HNSW_METAPAGE_BLKNO, ExclusiveLock); + if (!BlockNumberIsValid(highestPoint->blkno)) highestPoint = NULL;