From 8b0326726799cc16e039a107ff7afc3553ef445e Mon Sep 17 00:00:00 2001 From: Andrew Kane Date: Mon, 21 Aug 2023 16:24:55 -0700 Subject: [PATCH] Improved locking for HNSW vacuum [skip ci] --- src/hnswvacuum.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) 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))