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
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