From 57fb706242edf1f843f8653bce4b21d6888931d7 Mon Sep 17 00:00:00 2001 From: Andrew Kane Date: Sun, 4 Aug 2024 11:27:51 -0700 Subject: [PATCH] Fixed locking for parallel HNSW index builds - fixes #635 --- CHANGELOG.md | 1 + src/hnswbuild.c | 9 +++++++-- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ff78eab..d9e49f0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,6 @@ ## 0.7.4 (unreleased) +- Fixed locking for parallel HNSW index builds - Fixed compilation error with GCC 14 on i386 when SSE2 is not enabled ## 0.7.3 (2024-07-22) diff --git a/src/hnswbuild.c b/src/hnswbuild.c index dcfb2bd..727eec3 100644 --- a/src/hnswbuild.c +++ b/src/hnswbuild.c @@ -379,7 +379,13 @@ UpdateNeighborsInMemory(char *base, FmgrInfo *procinfo, Oid collation, HnswEleme for (int lc = e->level; lc >= 0; lc--) { int lm = HnswGetLayerM(m, lc); - HnswNeighborArray *neighbors = HnswGetNeighbors(base, e, lc); + Size neighborsSize = HNSW_NEIGHBOR_ARRAY_SIZE(lm); + HnswNeighborArray *neighbors = palloc(neighborsSize); + + /* Copy neighbors to local memory */ + LWLockAcquire(&e->lock, LW_SHARED); + memcpy(neighbors, HnswGetNeighbors(base, e, lc), neighborsSize); + LWLockRelease(&e->lock); for (int i = 0; i < neighbors->length; i++) { @@ -389,7 +395,6 @@ UpdateNeighborsInMemory(char *base, FmgrInfo *procinfo, Oid collation, HnswEleme /* Keep scan-build happy on Mac x86-64 */ Assert(neighborElement); - /* Use element for lock instead of hc since hc can be replaced */ LWLockAcquire(&neighborElement->lock, LW_EXCLUSIVE); HnswUpdateConnection(base, e, hc, lm, lc, NULL, NULL, procinfo, collation); LWLockRelease(&neighborElement->lock);