From 956a533c5ec3171485624461cc13f786dbfc15e5 Mon Sep 17 00:00:00 2001 From: Siva R 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