diff --git a/src/hnswutils.c b/src/hnswutils.c index 6603289..4261130 100644 --- a/src/hnswutils.c +++ b/src/hnswutils.c @@ -846,15 +846,22 @@ HnswInsertElement(HnswElement element, HnswElement entryPoint, Relation index, F HnswElement dup; BlockNumber *skipPage = vacuuming ? &element->neighborPage : NULL; OffsetNumber *skipOffno = vacuuming ? &element->neighborOffno : NULL; + bool removeEntryPoint; + HnswCandidate *entryCandidate; /* Get entry point and level */ if (entryPoint != NULL) { - ep = lappend(ep, EntryCandidate(entryPoint, q, index, procinfo, collation, true)); + entryCandidate = EntryCandidate(entryPoint, q, index, procinfo, collation, true); + ep = lappend(ep, entryCandidate); entryLevel = entryPoint->level; + removeEntryPoint = vacuuming && list_length(entryPoint->heaptids) == 0; } else + { entryLevel = -1; + removeEntryPoint = false; + } for (int lc = entryLevel; lc >= level + 1; lc--) { @@ -870,6 +877,8 @@ HnswInsertElement(HnswElement element, HnswElement entryPoint, Relation index, F int lm = GetLayerM(m, lc); w = SearchLayer(q, ep, efConstruction, lc, index, procinfo, collation, true, skipPage, skipOffno); + if (removeEntryPoint) + w = list_delete_ptr(w, entryCandidate); newNeighbors[lc] = SelectNeighbors(w, lm, lc, procinfo, collation, NULL); ep = w; } diff --git a/src/hnswvacuum.c b/src/hnswvacuum.c index adac563..78f57c1 100644 --- a/src/hnswvacuum.c +++ b/src/hnswvacuum.c @@ -214,6 +214,7 @@ RepairGraphElement(HnswVacuumState * vacuumstate, HnswElement element) return; entryPoint = &vacuumstate->highestPoint; + entryPoint->neighbors = NULL; } else entryPoint = NULL;