diff --git a/src/hnswvacuum.c b/src/hnswvacuum.c index 1e25f13..67304a8 100644 --- a/src/hnswvacuum.c +++ b/src/hnswvacuum.c @@ -263,6 +263,7 @@ RepairGraphEntryPoint(HnswVacuumState * vacuumstate) /* Repair graph for highest non-entry point */ if (highestPoint != NULL) { + /* Get a shared lock */ LockPage(index, HNSW_UPDATE_LOCK, ShareLock); HnswLoadElement(highestPoint, NULL, NULL, index, vacuumstate->procinfo, vacuumstate->collation, true); @@ -270,13 +271,13 @@ RepairGraphEntryPoint(HnswVacuumState * vacuumstate) if (NeedsUpdated(vacuumstate, highestPoint)) RepairGraphElement(vacuumstate, highestPoint, HnswGetEntryPoint(index)); + /* Release lock */ UnlockPage(index, HNSW_UPDATE_LOCK, ShareLock); } - /* Wait for inserts to complete */ + /* Prevent concurrent inserts when possibly updating entry point */ LockPage(index, HNSW_UPDATE_LOCK, ExclusiveLock); - /* See if entry point needs updated */ entryPoint = HnswGetEntryPoint(index); if (entryPoint != NULL) { @@ -323,6 +324,10 @@ RepairGraph(HnswVacuumState * vacuumstate) BufferAccessStrategy bas = vacuumstate->bas; BlockNumber blkno = HNSW_HEAD_BLKNO; + /* Wait for inserts to complete */ + LockPage(index, HNSW_UPDATE_LOCK, ExclusiveLock); + UnlockPage(index, HNSW_UPDATE_LOCK, ExclusiveLock); + RepairGraphEntryPoint(vacuumstate); while (BlockNumberIsValid(blkno))