Re: BUG #19040: Memory leak in hashed subplan node due to missing hashtempcxt reset

From: Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us>
To: feichanghong <feichanghong(at)qq(dot)com>
Cc: "李海洋(陌痕)" <mohen(dot)lhy(at)alibaba-inc(dot)com>, ocean_li_996 <ocean_li_996(at)163(dot)com>, "pgsql-bugs(at)lists(dot)postgresql(dot)org" <pgsql-bugs(at)lists(dot)postgresql(dot)org>
Subject: Re: BUG #19040: Memory leak in hashed subplan node due to missing hashtempcxt reset
Date: 2025-09-08 17:23:12
Message-ID: 507583.1757352192@sss.pgh.pa.us
Views: Whole Thread | Raw Message | Download mbox | Resend email
Thread:
Lists: pgsql-bugs

feichanghong <feichanghong(at)qq(dot)com> writes:
>> On Sep 7, 2025, at 16:24, 李海洋(陌痕) <mohen(dot)lhy(at)alibaba-inc(dot)com> wrote:
>> On 2025-09-06 20:31:53 Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us> writes:
>>> After contemplating things for awhile, I think that feichanghong’s
>>> idea is the right one after all: in each of the functions that switch
>>> into hashtable->tempcxt, let's do a reset on the way out, as attached.

>> I have considered this approach as well, but my concern is that "tempcxt"
>> is not always an independent memory context. In some cases, it references
>> another context — for example, in nodeSetOp.c’s "build_hash_table", “tempcxt"
>> points to "setopstate->ps.ps_ExprContext->ecxt_per_tuple_memory". There is
>> similar usage in nodeAgg.c as well. I’m not entirely sure that this approach would
>> not discard data we still need, because the lifespan of
>> "ps_ExprContext->ecxt_per_tuple_memory" seems to be longer than “tempcxt”.

> Yes, I agree with that.

Yeah, that is a fair point. The existing API is that the caller is
responsible for resetting tempcxt sufficiently often, and it looks
like nodeSubplan.c is the only place that gets this wrong. Let's
just fix nodeSubplan.c, add a comment documenting this requirement,
and call it good.

>> Should we make tempcxt a completely independent memory context?

> It looks fine. Perhaps we don't need to pass tempcxt to BuildTupleHashTable,
> but rather create a new one within it. After each switch to tempcxt, we should
> clean it up using MemoryContextReset.

I thought about that too, but that would result in two short-lived
contexts and two reset operations per tuple cycle where only one
is needed. I'm rather tempted to fix nodeSubplan.c by making it
use innerecontext->ecxt_per_tuple_memory instead of a separate
hash tmpcontext. That context is getting reset already, at least in
buildSubPlanHash(). That's probably too risky for the back branches
but we could do it in HEAD.

regards, tom lane

In response to

Responses

Browse pgsql-bugs by date

  From Date Subject
Next Message Tom Lane 2025-09-08 20:46:10 Re: BUG #19040: Memory leak in hashed subplan node due to missing hashtempcxt reset
Previous Message David G. Johnston 2025-09-08 15:10:11 Re: BUG #19034: Recursive function with sql_body can replace an existing function but can not be created on it's own