Re: Fix logical decoding not track transaction during SNAPBUILD_BUILDING_SNAPSHOT - Mailing list pgsql-hackers

From Ajin Cherian
Subject Re: Fix logical decoding not track transaction during SNAPBUILD_BUILDING_SNAPSHOT
Date
Msg-id CAFPTHDZQJeiyNGCp51Vq3rnZt3FZ1spd+kjJgqkHDm2jCH8=mw@mail.gmail.com
Whole thread Raw
In response to Re: Fix logical decoding not track transaction during SNAPBUILD_BUILDING_SNAPSHOT  ("cca5507" <cca5507@qq.com>)
List pgsql-hackers
On Thu, Jan 29, 2026 at 5:29 PM cca5507 <cca5507@qq.com> wrote:
>
> > Looks like the assert in ReorderBufferForget failed because
> > ninvalidations is not 0.
>
> I think it can be fixed by this:
>
> ```
> @@ -282,18 +286,24 @@ xact_decode(LogicalDecodingContext *ctx, XLogRecordBuffer *buf)
>                         {
>                                 TransactionId xid;
>                                 xl_xact_invals *invals;
> +                               bool has_snapshot;
>
>                                 xid = XLogRecGetXid(r);
>                                 invals = (xl_xact_invals *) XLogRecGetData(r);
> +                               has_snapshot =
> +                                       SnapBuildCurrentState(builder) >= SNAPBUILD_FULL_SNAPSHOT;
>
>                                 /*
>                                  * Execute the invalidations for xid-less transactions,
>                                  * otherwise, accumulate them so that they can be processed at
>                                  * the commit time.
> +                                *
> +                                * Note that we only need to do this when we are not fast-forwarding
> +                                * and there is a snapshot.
>                                  */
>                                 if (TransactionIdIsValid(xid))
>                                 {
> -                                       if (!ctx->fast_forward)
> +                                       if (!ctx->fast_forward && has_snapshot)
>                                                 ReorderBufferAddInvalidations(reorder, xid,
>
buf->origptr,
>
invals->nmsgs,
> @@ -301,7 +311,7 @@ xact_decode(LogicalDecodingContext *ctx, XLogRecordBuffer *buf)
>                                         ReorderBufferXidSetCatalogChanges(ctx->reorder, xid,
>
buf->origptr);
>                                 }
> -                               else if (!ctx->fast_forward)
> +                               else if (!ctx->fast_forward && has_snapshot)
>                                         ReorderBufferImmediateInvalidation(ctx->reorder,
>
invals->nmsgs,
>
invals->msgs);
> ```
>
> --

Yes, this works.

regards,
Ajin Cherian
Fujitsu Australia



pgsql-hackers by date:

Previous
From: Ashutosh Bapat
Date:
Subject: Re: Import Statistics in postgres_fdw before resorting to sampling.
Next
From: Ilia Evdokimov
Date:
Subject: Re: Hash-based MCV matching for large IN-lists