Fdw cleanup

Started by Feng Tianabout 10 years ago3 messages
#1Feng Tian
ftian@vitessedata.com

Hi, Hackers,

I need some help to understand foreign table error handling.

For a query on foreign table, ExecInitForeignScan is called, which in turn
calls the BeginForeignScan hook. Inside this hook, I allocated some
resource,

node->fdw_state = allocate_resource(...);

If everything goes well, ExecEndForeignScan will call call my
EndForeignScan hook, inside the hook, I free the resource.

free_resource(node->fdw_state);

However, if during the execution an error happened, seems to me that
EndForeignScan will not be called (traced using gdb). So my question is,
is Begin/End the right place for allocate/free resources? If it is not,
what is the right way to do this?

Thank you very much,
Feng

#2Albe Laurenz
laurenz.albe@wien.gv.at
In reply to: Feng Tian (#1)
Re: Fdw cleanup

Feng Tian wrote:

I need some help to understand foreign table error handling.

For a query on foreign table, ExecInitForeignScan is called, which in turn calls the BeginForeignScan
hook. Inside this hook, I allocated some resource,

node->fdw_state = allocate_resource(...);

If everything goes well, ExecEndForeignScan will call call my EndForeignScan hook, inside the hook, I
free the resource.

free_resource(node->fdw_state);

However, if during the execution an error happened, seems to me that EndForeignScan will not be called
(traced using gdb). So my question is, is Begin/End the right place for allocate/free resources?
If it is not, what is the right way to do this?

If the resource is memory, use "palloc" to allocate it, and PostgreSQL
will take care of it automatically.

Other than that, you could call RegisterXactCallback() and register a callback
that will be called upon transaction end. In the callback function you can
free the resource if it was not already freed by EndForeignScan.

Yours,
Laurenz Albe

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#3Feng Tian
ftian@vitessedata.com
In reply to: Albe Laurenz (#2)
Re: Fdw cleanup

Hi, Albe,

Thank you.

The resource is not memory, I have something like a file descriptor or
network connection, which I believe is the common case for foreign table.
Using RegisterXactCallback exposes an API at a much deep level to foreign
table writer, and I need to find a place to anchor the context (fdw_state).
I took a look at postgres_fdw and found that xact callback is exactly
what is done. So I will take this approach.

Again, thank you Albe, for pointing me to it.
Feng

On Mon, Dec 14, 2015 at 12:30 AM, Albe Laurenz <laurenz.albe@wien.gv.at>
wrote:

Show quoted text

Feng Tian wrote:

I need some help to understand foreign table error handling.

For a query on foreign table, ExecInitForeignScan is called, which in

turn calls the BeginForeignScan

hook. Inside this hook, I allocated some resource,

node->fdw_state = allocate_resource(...);

If everything goes well, ExecEndForeignScan will call call my

EndForeignScan hook, inside the hook, I

free the resource.

free_resource(node->fdw_state);

However, if during the execution an error happened, seems to me that

EndForeignScan will not be called

(traced using gdb). So my question is, is Begin/End the right place

for allocate/free resources?

If it is not, what is the right way to do this?

If the resource is memory, use "palloc" to allocate it, and PostgreSQL
will take care of it automatically.

Other than that, you could call RegisterXactCallback() and register a
callback
that will be called upon transaction end. In the callback function you can
free the resource if it was not already freed by EndForeignScan.

Yours,
Laurenz Albe