skip-compression-of-pre-9.4-empty-gin-data-leaf-page-replay_v1.patch

application/octet-stream

Filename: skip-compression-of-pre-9.4-empty-gin-data-leaf-page-replay_v1.patch
Type: application/octet-stream
Part: 0
Message: Bug in gin insert redo code path during re-compression of empty gin data leaf pages

Patch

Format: format-patch
Series: patch v1
Subject: Skip compression of pre-9.4 empty gin data leaf pages during replay
File+
src/backend/access/gin/ginxlog.c 19 6
From 956a533c5ec3171485624461cc13f786dbfc15e5 Mon Sep 17 00:00:00 2001
From: Siva R <sivasubr@amazon.com>
Date: Tue, 17 Jul 2018 22:01:42 +0000
Subject: [PATCH] Skip compression of pre-9.4 empty gin data leaf pages during
 replay

---
 src/backend/access/gin/ginxlog.c | 25 +++++++++++++++++++------
 1 file changed, 19 insertions(+), 6 deletions(-)

diff --git a/src/backend/access/gin/ginxlog.c b/src/backend/access/gin/ginxlog.c
index a40f168..0797b92 100644
--- a/src/backend/access/gin/ginxlog.c
+++ b/src/backend/access/gin/ginxlog.c
@@ -151,15 +151,28 @@ ginRedoRecompress(Page page, ginxlogRecompressDataLeaf *data)
 		ItemPointer uncompressed = (ItemPointer) GinDataPageGetData(page);
 		int			nuncompressed = GinPageGetOpaque(page)->maxoff;
 		int			npacked;
-		GinPostingList *plist;
 
-		plist = ginCompressPostingList(uncompressed, nuncompressed,
-									   BLCKSZ, &npacked);
-		Assert(npacked == nuncompressed);
+		totalsize = 0;
 
-		totalsize = SizeOfGinPostingList(plist);
+		/*
+		 * In 9.3, when we delete data leaf pages as part of vacuum, we skip
+		 * deletion of the leftmost and rightmost pages even when they are
+		 * empty. So try to compress the posting list only if there are items
+		 * in it.
+		 */
+		if (nuncompressed > 0)
+		{
+			GinPostingList *plist;
+
+			plist = ginCompressPostingList(uncompressed, nuncompressed,
+										   BLCKSZ, &npacked);
+			totalsize = SizeOfGinPostingList(plist);
+
+			Assert(npacked == nuncompressed);
+
+			memcpy(GinDataLeafPageGetPostingList(page), plist, totalsize);
+		}
 
-		memcpy(GinDataLeafPageGetPostingList(page), plist, totalsize);
 		GinDataPageSetDataSize(page, totalsize);
 		GinPageSetCompressed(page);
 		GinPageGetOpaque(page)->maxoff = InvalidOffsetNumber;
-- 
2.7.3.AMZN