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