Re: dblink memory leak

Takahiro Itagaki <itagaki.takahiro@oss.ntt.co.jp>

From: Itagaki Takahiro <itagaki.takahiro@oss.ntt.co.jp>
To: Tom Lane <tgl@sss.pgh.pa.us>
Cc: Joe Conway <mail@joeconway.com>, Robert Haas <robertmhaas@gmail.com>, pgsql-hackers@postgresql.org
Date: 2009-10-05T03:12:55Z
Lists: pgsql-hackers
Tom Lane <tgl@sss.pgh.pa.us> wrote:

> I think what you want to do instead is use PG_TRY blocks to ensure that
> transient results are cleaned up.

I think PG_TRY blocks are not enough, too. PG_TRY requires a statement
block, but we need to return from dblink functions per tuple.
Error and interruption can occur at the caller:

    ExecMakeTableFunctionResult()
    {
        for (;;)
        {
*here*      CHECK_FOR_INTERRUPTS();
            result = FunctionCallInvoke(&fcinfo);  => { PG_TRY ... END }
            if (rsinfo.isDone == ExprEndResult)
                break;
            tuplestore_puttuple(tupstore, &tmptup);
        }
    }

Also, we should think SRF-functions might not be called repeatedly
until max_calls whether the transaction is committed or rollbacked
because we might have some optimization in FunctionScan in the future.
For example:
    SELECT * FROM dblink() LIMIT 3
might call dblink() only 3 times if we optimize executor logic
(it should not occur for now, though).

Regards,
---
ITAGAKI Takahiro
NTT Open Source Software Center