diff --git a/CHANGELOG.md b/CHANGELOG.md index 00c8be1..af75e5b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ ## 0.5.1 (unreleased) - Improved performance of index scans for IVFFlat after updates and deletes +- Fixed locking for index scans for HNSW ## 0.5.0 (2023-08-28) diff --git a/src/hnswscan.c b/src/hnswscan.c index d12e697..a7f6997 100644 --- a/src/hnswscan.c +++ b/src/hnswscan.c @@ -114,6 +114,12 @@ hnswbeginscan(Relation index, int nkeys, int norderbys) scan->opaque = so; + /* + * Get a shared lock. This allows vacuum to ensure no in-flight scans + * before marking tuples as deleted. + */ + LockPage(scan->indexRelation, HNSW_SCAN_LOCK, ShareLock); + return scan; } @@ -164,17 +170,8 @@ hnswgettuple(IndexScanDesc scan, ScanDirection dir) /* Get scan value */ value = GetScanValue(scan); - /* - * Get a shared lock. This allows vacuum to ensure no in-flight scans - * before marking tuples as deleted. - */ - LockPage(scan->indexRelation, HNSW_SCAN_LOCK, ShareLock); - so->w = GetScanItems(scan, value); - /* Release shared lock */ - UnlockPage(scan->indexRelation, HNSW_SCAN_LOCK, ShareLock); - so->first = false; } @@ -236,6 +233,9 @@ hnswendscan(IndexScanDesc scan) if (BufferIsValid(so->buf)) ReleaseBuffer(so->buf); + /* Release shared lock */ + UnlockPage(scan->indexRelation, HNSW_SCAN_LOCK, ShareLock); + MemoryContextDelete(so->tmpCtx); pfree(so);