From 3d866844d3f4b455325d235fbc07aa64c17e1d0c Mon Sep 17 00:00:00 2001 From: Andrew Kane Date: Sat, 26 Aug 2023 13:08:27 -0700 Subject: [PATCH] Added PrintGraph function for HNSW [skip ci] --- src/hnswvacuum.c | 65 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) diff --git a/src/hnswvacuum.c b/src/hnswvacuum.c index 597fd8e..2a62ca6 100644 --- a/src/hnswvacuum.c +++ b/src/hnswvacuum.c @@ -611,6 +611,67 @@ FreeVacuumState(HnswVacuumState * vacuumstate) MemoryContextDelete(vacuumstate->tmpCtx); } +/* + * Print graph + */ +#ifdef HNSW_DEBUG +static void +PrintGraph(HnswVacuumState * vacuumstate) +{ + BlockNumber blkno = HNSW_HEAD_BLKNO; + Relation index = vacuumstate->index; + + while (BlockNumberIsValid(blkno)) + { + Buffer buf; + Page page; + OffsetNumber offno; + OffsetNumber maxoffno; + + buf = ReadBuffer(index, blkno); + LockBuffer(buf, BUFFER_LOCK_SHARE); + page = BufferGetPage(buf); + maxoffno = PageGetMaxOffsetNumber(page); + + for (offno = FirstOffsetNumber; offno <= maxoffno; offno = OffsetNumberNext(offno)) + { + HnswElementTuple etup = (HnswElementTuple) PageGetItem(page, PageGetItemId(page, offno)); + HnswElement element; + + /* Skip neighbor tuples */ + if (!HnswIsElementTuple(etup)) + continue; + + /* Skip deleted tuples */ + if (etup->deleted) + continue; + + element = HnswInitElementFromBlock(blkno, offno); + HnswLoadElementFromTuple(element, etup, false, true); + HnswLoadNeighbors(element, index); + + elog(INFO, "element (%d,%d)", element->blkno, element->offno); + + for (int lc = element->level; lc >= 0; lc--) + { + HnswNeighborArray *neighbors = &element->neighbors[lc]; + + for (int i = 0; i < neighbors->length; i++) + { + HnswElement e = neighbors->items[i].element; + + elog(INFO, "%d: (%d,%d)", lc, e->blkno, e->offno); + } + } + } + + blkno = HnswPageGetOpaque(page)->nextblkno; + + UnlockReleaseBuffer(buf); + } +} +#endif + /* * Bulk delete tuples from the index */ @@ -631,6 +692,10 @@ hnswbulkdelete(IndexVacuumInfo *info, IndexBulkDeleteResult *stats, /* Pass 3: Mark as deleted */ MarkDeleted(&vacuumstate); +#ifdef HNSW_DEBUG + PrintGraph(&vacuumstate); +#endif + FreeVacuumState(&vacuumstate); return vacuumstate.stats;