Re: After 10 -> 15 upgrade getting "cannot commit while a portal is pinned" on one python function - Mailing list pgsql-general

From Jeff Ross
Subject Re: After 10 -> 15 upgrade getting "cannot commit while a portal is pinned" on one python function
Date
Msg-id 6a744d62-f286-4166-93f6-71610db579ad@openvistas.net
Whole thread Raw
In response to Re: After 10 -> 15 upgrade getting "cannot commit while a portal is pinned" on one python function  (Rob Sargent <robjsargent@gmail.com>)
Responses Re: After 10 -> 15 upgrade getting "cannot commit while a portal is pinned" on one python function  (Adrian Klaver <adrian.klaver@aklaver.com>)
List pgsql-general


On 3/27/24 17:35, Rob Sargent wrote:


On 3/27/24 17:05, Jeff Ross wrote:

On 3/27/24 15:44, Tom Lane wrote:

Perhaps "pinned" in the error message means "open"?
No, it means "pinned" ... but I see that plpython pins the portal
underlying any PLyCursor object it creates.  Most of our PLs do
that too, to prevent a portal from disappearing under them (e.g.
if you were to try to close the portal directly from SQL rather
than via whatever mechanism the PL wants you to use).

I added a cursor.close() as the last line called in that function and it 
works again.
It looks to me like PLy_cursor_close does pretty much exactly the same
cleanup as PLy_cursor_dealloc, including unpinning and closing the
underlying portal.  I'm far from a Python expert, but I suspect that
the docs you quote intend to say "cursors are disposed of when Python
garbage-collects them", and that the reason your code is failing is
that there's still a reference to the PLyCursor somewhere after the
plpython function exits, perhaps in a Python global variable.
			regards, tom lane


Thank you for your reply, as always, Tom!

Debugging at this level might well be over my paygrade ;-)

I just happy that the function works again, and that I was able to share a solution to this apparently rare error with the community.

Jeff

My read of Tom's reply suggests you still have work to do to find the other "reference" holding on to your cursor.

Yes, my read was the same.

There are exactly 3 references to that cursor now that I added the close() at the end. 

Here are the first 2 (cursor renamed from the code I posted):

        plpy_cursor = plpy.cursor(schemas_query)
        while True:
            schema_rows = plpy_cursor.fetch(100)

The last is:

        plpy_cursor.close()

I don't know how to proceed further.

pgsql-general by date:

Previous
From: Jeff Ross
Date:
Subject: Re: After 10 -> 15 upgrade getting "cannot commit while a portal is pinned" on one python function
Next
From: Adrian Klaver
Date:
Subject: Re: After 10 -> 15 upgrade getting "cannot commit while a portal is pinned" on one python function