diff options
author | Amit Kapila | 2021-02-16 01:56:50 +0000 |
---|---|---|
committer | Amit Kapila | 2021-02-16 01:56:50 +0000 |
commit | f672df5fdd22dac14c98d0a0bf5bbaa6ab17f8a5 (patch) | |
tree | edc3729b1e4981906b3f2f0da522aa8a28f2fab8 /src/backend/replication/pgoutput/pgoutput.c | |
parent | 8001cb77ee6cb4f32632850d41f00206a86bac3e (diff) |
Remove the unnecessary PrepareWrite in pgoutput.
This issue exists from the inception of this code (PG-10) but got exposed
by the recent commit ce0fdbfe97 where we are using origins in tablesync
workers. The problem was that we were sometimes sending the prepare_write
('w') message but then the actual message was not being sent and on the
subscriber side, we always expect a message after prepare_write message
which led to this bug.
I refrained from backpatching this because there is no way in the core
code to hit this prior to commit ce0fdbfe97 and we haven't received any
complaints so far.
Reported-by: Erik Rijkers
Author: Amit Kapila and Vignesh C
Tested-by: Erik Rijkers
Discussion: https://postgr.es/m/[email protected]
Diffstat (limited to 'src/backend/replication/pgoutput/pgoutput.c')
-rw-r--r-- | src/backend/replication/pgoutput/pgoutput.c | 19 |
1 files changed, 11 insertions, 8 deletions
diff --git a/src/backend/replication/pgoutput/pgoutput.c b/src/backend/replication/pgoutput/pgoutput.c index 79765f96969..1b993fb032d 100644 --- a/src/backend/replication/pgoutput/pgoutput.c +++ b/src/backend/replication/pgoutput/pgoutput.c @@ -342,10 +342,6 @@ pgoutput_begin_txn(LogicalDecodingContext *ctx, ReorderBufferTXN *txn) { char *origin; - /* Message boundary */ - OutputPluginWrite(ctx, false); - OutputPluginPrepareWrite(ctx, true); - /*---------- * XXX: which behaviour do we want here? * @@ -357,7 +353,13 @@ pgoutput_begin_txn(LogicalDecodingContext *ctx, ReorderBufferTXN *txn) *---------- */ if (replorigin_by_oid(txn->origin_id, true, &origin)) + { + /* Message boundary */ + OutputPluginWrite(ctx, false); + OutputPluginPrepareWrite(ctx, true); logicalrep_write_origin(ctx->out, origin, txn->origin_lsn); + } + } OutputPluginWrite(ctx, true); @@ -780,12 +782,13 @@ pgoutput_stream_start(struct LogicalDecodingContext *ctx, { char *origin; - /* Message boundary */ - OutputPluginWrite(ctx, false); - OutputPluginPrepareWrite(ctx, true); - if (replorigin_by_oid(txn->origin_id, true, &origin)) + { + /* Message boundary */ + OutputPluginWrite(ctx, false); + OutputPluginPrepareWrite(ctx, true); logicalrep_write_origin(ctx->out, origin, InvalidXLogRecPtr); + } } OutputPluginWrite(ctx, true); |