]> granicus.if.org Git - postgresql/commitdiff
Fix memory leak introduced in commit 7df159a620.
authorAmit Kapila <akapila@postgresql.org>
Thu, 17 Oct 2019 03:15:43 +0000 (08:45 +0530)
committerAmit Kapila <akapila@postgresql.org>
Mon, 21 Oct 2019 03:27:32 +0000 (08:57 +0530)
We memorize all internal and empty leaf pages in the 1st vacuum stage for
gist indexes.  They are used in the 2nd stage, to delete all the empty
pages.  There was a memory context page_set_context for this purpose, but
we never used it.

Reported-by: Amit Kapila
Author: Dilip Kumar
Reviewed-by: Amit Kapila
Backpatch-through: 12, where it got introduced
Discussion: https://postgr.es/m/CAA4eK1LGr+MN0xHZpJ2dfS8QNQ1a_aROKowZB+MPNep8FVtwAA@mail.gmail.com

src/backend/access/gist/gistvacuum.c

index bf754ea6d0d98de696090376b64588bd93d9a0cc..710e4015b3d86ab457acbce7de9eaf6d4d662987 100644 (file)
@@ -169,6 +169,7 @@ gistvacuumscan(IndexVacuumInfo *info, GistBulkDeleteResult *stats,
        BlockNumber num_pages;
        bool            needLock;
        BlockNumber blkno;
+       MemoryContext oldctx;
 
        /*
         * Reset counts that will be incremented during the scan; needed in case
@@ -179,8 +180,17 @@ gistvacuumscan(IndexVacuumInfo *info, GistBulkDeleteResult *stats,
        stats->stats.pages_deleted = 0;
        stats->stats.pages_free = 0;
        MemoryContextReset(stats->page_set_context);
+
+       /*
+        * Create the integer sets to remember all the internal and the empty leaf
+        * pages in page_set_context.  Internally, the integer set will remember
+        * this context so that the subsequent allocations for these integer sets
+        * will be done from the same context.
+        */
+       oldctx = MemoryContextSwitchTo(stats->page_set_context);
        stats->internal_page_set = intset_create();
        stats->empty_leaf_set = intset_create();
+       MemoryContextSwitchTo(oldctx);
 
        /* Set up info to pass down to gistvacuumpage */
        vstate.info = info;