Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Reuse all-zero pages in GIN.
authorHeikki Linnakangas <heikki.linnakangas@iki.fi>
Mon, 27 Jul 2015 09:30:26 +0000 (12:30 +0300)
committerHeikki Linnakangas <heikki.linnakangas@iki.fi>
Mon, 27 Jul 2015 09:32:30 +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 e6241850e1ff8d90e8e2aa0c9b6a5bf0c3820bac..31b765287f6ac9da798d2637046e706f67bdac7a 100644 (file)
@@ -756,7 +756,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);