Re: [PATCH] Release replication slot on error in SQL-callable slot functions

From: Ashutosh Sharma <ashu(dot)coek88(at)gmail(dot)com>
To: Bharath Rupireddy <bharath(dot)rupireddyforpostgres(at)gmail(dot)com>
Cc: shveta malik <shveta(dot)malik(at)gmail(dot)com>, "Zhijie Hou (Fujitsu)" <houzj(dot)fnst(at)fujitsu(dot)com>, Masahiko Sawada <sawada(dot)mshk(at)gmail(dot)com>, SATYANARAYANA NARLAPURAM <satyanarlapuram(at)gmail(dot)com>, Fujii Masao <masao(dot)fujii(at)gmail(dot)com>, vignesh C <vignesh21(at)gmail(dot)com>, PostgreSQL Hackers <pgsql-hackers(at)lists(dot)postgresql(dot)org>
Subject: Re: [PATCH] Release replication slot on error in SQL-callable slot functions
Date: 2026-08-10 07:00:14
Message-ID: CAE9k0P=9r_S=wv=sK_=Fe6OJAnSxVXN5sRGi3spv+qrbsCF6+A@mail.gmail.com
Views: Whole Thread | Raw Message | Download mbox | Resend email
Thread:
Lists: pgsql-hackers

Hi,

On Sun, Aug 9, 2026 at 2:48 AM Bharath Rupireddy
<bharath(dot)rupireddyforpostgres(at)gmail(dot)com> wrote:
>
> Hi,
>
> On Fri, Aug 7, 2026 at 4:31 AM Ashutosh Sharma <ashu(dot)coek88(at)gmail(dot)com> wrote:
> >
> > + if (MyReplicationSlot != NULL)
> > + ReplicationSlotRelease();
> >
> > From this if-condition in AtEOSubXact_ReplicationSlot(), it appears
> > that even when 'acquiredInSubId == mySubid', 'MyReplicationSlot' could
> > be NULL and if that ever happens we may/will return from this function
> > without clearing 'acquiredInSubId'. That matters because
> > 'currentSubTransactionId' is reset to TopSubTransactionId at each
> > StartTransaction(), so subxact ids are reused across top-level
> > transactions; a stale id left behind here could later match an
> > unrelated subxact.
> >
> > AFAIU, in practice this should be unreachable: 'acquiredInSubId' is
> > only ever set together with 'MyReplicationSlot', and both
> > ReplicationSlotRelease() and ReplicationSlotDropAcquired() clear it,
> > so "MyReplicationSlot == NULL" implies "acquiredInSubId ==
> > InvalidSubTransactionId", which can never equal a real `mySubid`. But
> > the guard's existence suggests you think "MyReplicationSlot == NULL"
> > is possible.
> >
> > So either the reasoning above deserves a comment atop the
> > if-condition, or, if the NULL case really is impossible, an
> > 'Assert(MyReplicationSlot != NULL)' would document it more directly
> > than a silent 'if'.
>
> I get your point. Would something like the below work?
>
> + /*
> + * The aborting subxact is the one that acquired the slot, and its id is
> + * never invalid, so acquiredInSubId is valid here. It is set only when a
> + * slot is held, and cleared when the slot is released, so the slot must
> + * still be held.
> + */
> + Assert(acquiredInSubId != InvalidSubTransactionId);
> + Assert(MyReplicationSlot != NULL);
> + ReplicationSlotRelease();
>

Thanks for the updated patch.

I feel "Assert(MyReplicationSlot != NULL);" is redundant here, because
ReplicationSlotRelease() already asserts this at the very beginning of
its function body, so it isn't strictly required.

--
With Regards,
Ashutosh Sharma.

In response to

Browse pgsql-hackers by date

  From Date Subject
Next Message Kirill Reshke 2026-08-10 07:03:04 check_circularity does not prevent from creating circular grants
Previous Message Daniel Gustafsson 2026-08-10 06:52:24 Re: Improve errmsg for publication membership