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;