From: Teodor Sigaev Date: Sat, 2 Apr 2016 11:20:46 +0000 (+0300) Subject: Prevent mark as deleted and as 'has free space' page in bloom module X-Git-Tag: REL9_6_BETA1~309 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=e9e441c9fac6cbc0510cded6abb9d0e6b646ecaf;p=postgresql Prevent mark as deleted and as 'has free space' page in bloom module Vacuum might put page into list of pages with some free space and mark as deleted at the same time. --- diff --git a/contrib/bloom/blvacuum.c b/contrib/bloom/blvacuum.c index 9fee3c1294..d2703b02b2 100644 --- a/contrib/bloom/blvacuum.c +++ b/contrib/bloom/blvacuum.c @@ -108,7 +108,12 @@ blbulkdelete(IndexVacuumInfo *info, IndexBulkDeleteResult *stats, Assert(itupPtr == BloomPageGetTuple(&state, page, OffsetNumberNext(BloomPageGetMaxOffset(page)))); - if (BloomPageGetFreeSpace(&state, page) > state.sizeOfBloomTuple && + /* + * Add page to notFullPage list if we will not mark page as deleted and + * there is a free space on it + */ + if (BloomPageGetMaxOffset(page) == 0 && + BloomPageGetFreeSpace(&state, page) > state.sizeOfBloomTuple && countPage < BloomMetaBlockN) notFullPage[countPage++] = blkno; @@ -116,7 +121,7 @@ blbulkdelete(IndexVacuumInfo *info, IndexBulkDeleteResult *stats, if (itupPtr != itup) { /* Is it empty page now? */ - if (itupPtr == BloomPageGetData(page)) + if (BloomPageGetMaxOffset(page) == 0) BloomPageSetDeleted(page); /* Adjust pg_lower */ ((PageHeader) page)->pd_lower = (Pointer) itupPtr - page;