Wait for inserts to complete when vacuuming HNSW

This commit is contained in:
Andrew Kane
2023-08-21 00:36:32 -07:00
parent ef1209eaf4
commit 40a013a622
2 changed files with 17 additions and 0 deletions

View File

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

View File

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