postgres.git / summary / log / commit / refs
commit c5e86719b0eacce9950bb3d70ec28b0d9bfef008
Author: Neil Conway <neilc@samurai.com>
Date: Wed Aug 08 18:06:58 2007 +0000
First released in: 8.3.0, 7.4.18, 8.0.14, 8.1.10, 8.2.5
Fix a gradual memory leak in ExecReScanAgg(). Because the aggregation
hash table is allocated in a child context of the agg node's memory
context, MemoryContextReset() will reset but *not* delete the child
context. Since ExecReScanAgg() proceeds to build a new hash table
from scratch (in a new sub-context), this results in leaking the
header for the previous memory context. Therefore, use
MemoryContextResetAndDeleteChildren() instead.
Credit: My colleague Sailesh Krishnamurthy at Truviso for isolating
the cause of the leak.
src/backend/executor/nodeAgg.c | 12 +++++++++---
1 file changed, 9 insertions(+), 3 deletions(-)
diff --git a/src/backend/executor/nodeAgg.c b/src/backend/executor/nodeAgg.c
index d19b3f65185..5e3b115902b 100644
--- a/src/backend/executor/nodeAgg.c
+++ b/src/backend/executor/nodeAgg.c
@@ -45,7 +45,7 @@
* Portions Copyright (c) 1994, Regents of the University of California
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/executor/nodeAgg.c,v 1.126.4.2 2005/01/28 19:35:56 tgl Exp $
+ * $PostgreSQL: pgsql/src/backend/executor/nodeAgg.c,v 1.126.4.3 2007/08/08 18:06:58 neilc Exp $
*
*-------------------------------------------------------------------------
*/
@@ -1517,8 +1517,14 @@ ExecReScanAgg(AggState *node, ExprContext *exprCtxt)
MemSet(econtext->ecxt_aggvalues, 0, sizeof(Datum) * node->numaggs);
MemSet(econtext->ecxt_aggnulls, 0, sizeof(bool) * node->numaggs);
- /* Release all temp storage */
- MemoryContextReset(node->aggcontext);
+ /*
+ * Release all temp storage. Note that with AGG_HASHED, the hash table
+ * is allocated in a sub-context of the aggcontext. We're going to
+ * rebuild the hash table from scratch, so we need to use
+ * MemoryContextResetAndDeleteChildren() to avoid leaking the old hash
+ * table's memory context header.
+ */
+ MemoryContextResetAndDeleteChildren(node->aggcontext);
if (((Agg *) node->ss.ps.plan)->aggstrategy == AGG_HASHED)
{
[parent: fbf9179a2758]