Reuse all-zero pages in GIN.
authorHeikki Linnakangas
Mon, 27 Jul 2015 09:30:26 +0000 (12:30 +0300)
committerHeikki Linnakangas
Mon, 27 Jul 2015 09:32:08 +0000 (12:32 +0300)
In GIN, an all-zeros page would be leaked forever, and never reused. Just
add them to the FSM in vacuum, and they will be reinitialized when grabbed
from the FSM. On master and 9.5, attempting to access the page's opaque
struct also caused an assertion failure, although that was otherwise
harmless.

Reported by Jeff Janes. Backpatch to all supported versions.

src/backend/access/gin/ginvacuum.c

index 0ca6bf8d62d7abb2e24f293c50fe86d9cffbb7f6..cc440d93547396ebde95941ff2b5f52a18eef749 100644 (file)
@@ -777,7 +777,7 @@ ginvacuumcleanup(PG_FUNCTION_ARGS)
        LockBuffer(buffer, GIN_SHARE);
        page = (Page) BufferGetPage(buffer);
 
-       if (GinPageIsDeleted(page))
+       if (PageIsNew(page) || GinPageIsDeleted(page))
        {
            Assert(blkno != GIN_ROOT_BLKNO);
            RecordFreeIndexPage(index, blkno);