diff --git a/src/hnswinsert.c b/src/hnswinsert.c index 941afb1..685b0bf 100644 --- a/src/hnswinsert.c +++ b/src/hnswinsert.c @@ -548,7 +548,7 @@ 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 */ + /* Release lock */ UnlockPage(index, HNSW_UPDATE_LOCK, lockmode); return true; diff --git a/src/hnswvacuum.c b/src/hnswvacuum.c index 37b4ebe..01d60d1 100644 --- a/src/hnswvacuum.c +++ b/src/hnswvacuum.c @@ -263,12 +263,19 @@ RepairGraphEntryPoint(HnswVacuumState * vacuumstate) /* Repair graph for highest non-entry point */ if (highestPoint != NULL) { + LockPage(index, HNSW_UPDATE_LOCK, ShareLock); + HnswLoadElement(highestPoint, NULL, NULL, index, vacuumstate->procinfo, vacuumstate->collation, true); if (NeedsUpdated(vacuumstate, highestPoint)) RepairGraphElement(vacuumstate, highestPoint, HnswGetEntryPoint(index)); + + UnlockPage(index, HNSW_UPDATE_LOCK, ShareLock); } + /* Wait for inserts to complete */ + LockPage(index, HNSW_UPDATE_LOCK, ExclusiveLock); + /* See if entry point needs updated */ entryPoint = HnswGetEntryPoint(index); if (entryPoint != NULL) @@ -298,6 +305,9 @@ RepairGraphEntryPoint(HnswVacuumState * vacuumstate) } } + /* Release lock */ + UnlockPage(index, HNSW_UPDATE_LOCK, ExclusiveLock); + /* Reset memory context */ MemoryContextSwitchTo(oldCtx); MemoryContextReset(vacuumstate->tmpCtx); @@ -315,10 +325,6 @@ RepairGraph(HnswVacuumState * vacuumstate) RepairGraphEntryPoint(vacuumstate); - /* Wait for inserts to complete */ - LockPage(index, HNSW_UPDATE_LOCK, ExclusiveLock); - UnlockPage(index, HNSW_UPDATE_LOCK, ExclusiveLock); - while (BlockNumberIsValid(blkno)) { Buffer buf;