RE: Missing empty transaction optimization in pgoutput plugin

From: "Zhijie Hou (Fujitsu)" <houzj(dot)fnst(at)fujitsu(dot)com>
To: Ashutosh Bapat <ashutosh(dot)bapat(dot)oss(at)gmail(dot)com>
Cc: pgsql-hackers <pgsql-hackers(at)postgresql(dot)org>, Amit Kapila <amit(dot)kapila16(at)gmail(dot)com>, Tomas Vondra <tomas(at)vondra(dot)me>, Dilip Kumar <dilipbalaut(at)gmail(dot)com>
Subject: RE: Missing empty transaction optimization in pgoutput plugin
Date: 2025-12-10 03:47:28
Message-ID: TY4PR01MB169074FC4348F414EFF0D8AF294A0A@TY4PR01MB16907.jpnprd01.prod.outlook.com
Views: Whole Thread | Raw Message | Download mbox | Resend email
Thread:
Lists: pgsql-hackers

On Monday, December 8, 2025 2:49 PM Ashutosh Bapat <ashutosh(dot)bapat(dot)oss(at)gmail(dot)com> wrote:
>
> Hi All,
> test_decoding output plugin skips sending stream_start and stream_end if no
> change from a segment of a streamed transaction is sent downstream. If no
> change has been sent downstream across all the streamed segments it
> doesn't send commit or abort for that streamed transaction. But I don't see
> similar changes in stream related callbacks in pgoutput output plugin.
>
> While the changes discussed in thread [1] were committed, those didn't
> include this optimization for test_decoding plugin as well. The optimization
> was discussed in [2] separately as a bug fix. Maybe because it wasn't
> considered as an optimization that time, we may not have considered it for
> pgoutput plugin which doesn't have explicit skip-empty-xacts option. I think
> the optimization would be useful in setups where multiple publications and
> long transactions are common.
> Any reason not to have it.

One possible reason we did not implement the optimization to avoid sending empty stream
blocks along with commit d5a9d86 is the handling of prepared transactions, for
which STREAM PREPARE is sent. The logical replication worker currently relies on
receiving at least one STREAM START/STREAM STOP prior to this; otherwise, it
might encounter errors when applying STREAM PREPARE. Although the optimization
is feasible, it requires some modifications to ensure the replication worker works
correctly, such as sending an empty stream block before issuing STREAM PREPARE.

One might think that we could avoid sending STREAM PREPARE for empty txn as
well, but that could be tricky, see the comment atop of (typedef struct
PGOutputTxnData) for details.

>
> [1] https://www.postgresql.org/message-id/flat/688b0b7f-2f6c-d827-c27b-
> 216a8e3ea700%402ndquadrant.com
> [2] https://www.postgresql.org/message-
> id/flat/CAA4eK1%2BOqgFNZkf7%3DETe_y5ntjgDk3T0wcdkd4Sot_u1hySGfw%
> 40mail.gmail.com

Best Regards,
Hou zj

In response to

Responses

Browse pgsql-hackers by date

  From Date Subject
Next Message shveta malik 2025-12-10 04:05:01 Re: Improve pg_sync_replication_slots() to wait for primary to advance
Previous Message Tatsuya Kawata 2025-12-10 03:44:19 Re: [PATCH] Add memory usage reporting to VACUUM VERBOSE