From: | Noah Misch <noah(at)leadboat(dot)com> |
---|---|
To: | Chad Wagner <chad(dot)wagner(at)gmail(dot)com> |
Cc: | Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us>, pgsql-hackers(at)postgresql(dot)org |
Subject: | Re: Preventing tuple-table leakage in plpgsql |
Date: | 2013-07-21 14:59:23 |
Message-ID: | 20130721145923.GA126339@tornado.leadboat.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-hackers |
On Thu, Jul 11, 2013 at 09:14:38PM -0400, Chad Wagner wrote:
> It looks like to me when AtEOSubXact_SPI is called the
> _SPI_current->connectSubId is always 1 (since it is only set when
> SPI_connect is called, which is only once for plpgsql), but the
> CurrentSubTransactionId is incremented each time a subtransaction is
> started.
Right. AtEOSubXact_SPI() cleans up any SPI connections originating in the
ending subtransaction. It leaves alone connections from higher subtransaction
levels; SPI has no general expectation that those have lost relevance.
> As a result, the memory for procCxt is only freed when I presume the
> TopTransaction is aborted or committed.
In your code from bug #8279, I expect it to be freed when the DO block exits.
The backend might not actually shrink then, but repeated calls to a similar DO
block within the same transaction should not cause successive increases in the
process's memory footprint.
> Should SPI_connect be called again after the subtransaction is created? And
> SPI_finish before the subtransaction is committed or aborted?
Hmm. An SPI_push()+SPI_connect() every time PL/pgSQL starts a subtransaction
would be another way to fix it, yes.
--
Noah Misch
EnterpriseDB http://www.enterprisedb.com
From | Date | Subject | |
---|---|---|---|
Next Message | Tom Lane | 2013-07-21 15:13:09 | Re: Preventing tuple-table leakage in plpgsql |
Previous Message | Миша Тюрин | 2013-07-21 14:42:26 | Auto explain target tables |