]> granicus.if.org Git - postgresql/commitdiff
Prevent mark as deleted and as 'has free space' page in bloom module
authorTeodor Sigaev <teodor@sigaev.ru>
Sat, 2 Apr 2016 11:20:46 +0000 (14:20 +0300)
committerTeodor Sigaev <teodor@sigaev.ru>
Sat, 2 Apr 2016 11:20:46 +0000 (14:20 +0300)
Vacuum might put page into list of pages with some free space and mark as
deleted at the same time.

contrib/bloom/blvacuum.c

index 9fee3c1294fbeb99637f7c48e08942a5e2b5f2c5..d2703b02b2c82eb72d462cec88b369e25d3e9a7b 100644 (file)
@@ -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;