Improved locking for HNSW vacuum

This commit is contained in:
Andrew Kane
2023-08-21 16:06:32 -07:00
parent ca2be5be6e
commit 782a1051e3
2 changed files with 11 additions and 5 deletions

View File

@@ -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;

View File

@@ -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;