From ec700693399a486daf80153881e57d57bfe9ddbe Mon Sep 17 00:00:00 2001
From: Heikki Linnakangas <heikki.linnakangas@iki.fi>
Date: Mon, 11 Mar 2019 15:41:07 +0200
Subject: [PATCH 5/6] Remove 'numEmptyPages'. it's not really needed v22

---
 src/backend/access/gist/gistvacuum.c | 19 ++++++++++++-------
 1 file changed, 12 insertions(+), 7 deletions(-)

diff --git a/src/backend/access/gist/gistvacuum.c b/src/backend/access/gist/gistvacuum.c
index 9439dfb49c..f530369f4e 100644
--- a/src/backend/access/gist/gistvacuum.c
+++ b/src/backend/access/gist/gistvacuum.c
@@ -28,7 +28,6 @@ typedef struct
 	IndexBulkDeleteResult stats;
 
 	IndexVacuumInfo *info;
-	BlockNumber numEmptyPages;
 	BlockSet	internalPagesMap;
 	BlockSet	emptyLeafPagesMap;
 } GistBulkDeleteResult;
@@ -141,7 +140,6 @@ gistdeletepage(GistBulkDeleteResult *stats,
 	GistPageSetDeleted(leafPage);
 	MarkBufferDirty(leafBuffer);
 	stats->stats.pages_deleted++;
-	stats->numEmptyPages--;
 
 	MarkBufferDirty(buffer);
 	/* Offsets are changed as long as we delete tuples from internal page */
@@ -405,7 +403,6 @@ restart:
 		if (nremain == 0)
 		{
 			stats->emptyLeafPagesMap = blockset_set(stats->emptyLeafPagesMap, blkno);
-			stats->numEmptyPages++;
 		}
 		else
 			stats->stats.num_index_tuples += nremain;
@@ -461,12 +458,18 @@ gistvacuum_recycle_pages(GistBulkDeleteResult *stats)
 {
 	IndexVacuumInfo *info = stats->info;
 	Relation	rel = info->index;
-	BlockNumber blkno;
+	BlockNumber	blkno;
+
+	/* quick exit if no empty pages */
+	/* HEIKKI: I'm assuming the blockset is always NULL if it's empty. That's true
+	 * for the current usage. But add comments, and maybe a blockset_isempty() macro
+	 * for clarity */
+	if (stats->emptyLeafPagesMap == NULL)
+		return;
 
 	/* rescan all inner pages to find those that have empty child pages */
 	blkno = InvalidBlockNumber;
-	while (stats->numEmptyPages > 0 &&
-		   (blkno = blockset_next(stats->internalPagesMap, blkno)) != InvalidBlockNumber)
+	while ((blkno = blockset_next(stats->internalPagesMap, blkno)) != InvalidBlockNumber)
 	{
 		Buffer		buffer;
 		Page		page;
@@ -491,7 +494,9 @@ gistvacuum_recycle_pages(GistBulkDeleteResult *stats)
 
 		maxoff = PageGetMaxOffsetNumber(page);
 		/* Check that leafs are still empty and decide what to delete */
-		for (off = FirstOffsetNumber; off <= maxoff && ntodelete < maxoff-1; off = OffsetNumberNext(off))
+		for (off = FirstOffsetNumber;
+			 off <= maxoff && ntodelete < maxoff-1;
+			 off = OffsetNumberNext(off))
 		{
 			Buffer		leafBuffer;
 			BlockNumber leafBlockNo;
-- 
2.20.1

