mirror of
https://github.com/postgres/postgres.git
synced 2025-09-02 04:21:28 +03:00
Add prepare API support for streaming transactions in logical replication.
Commit a8fd13cab0
added support for prepared transactions to built-in
logical replication via a new option "two_phase" for a subscription. The
"two_phase" option was not allowed with the existing streaming option.
This commit permits the combination of "streaming" and "two_phase"
subscription options. It extends the pgoutput plugin and the subscriber
side code to add the prepare API for streaming transactions which will
apply the changes accumulated in the spool-file at prepare time.
Author: Peter Smith and Ajin Cherian
Reviewed-by: Vignesh C, Amit Kapila, Greg Nancarrow
Tested-By: Haiying Tang
Discussion: https://postgr.es/m/02DA5F5E-CECE-4D9C-8B4B-418077E2C010@postgrespro.ru
Discussion: https://postgr.es/m/CAMGcDxeqEpWj3fTXwqhSwBdXd2RS9jzwWscO-XbeCfso6ts3+Q@mail.gmail.com
This commit is contained in:
@@ -71,6 +71,8 @@ static void pgoutput_stream_abort(struct LogicalDecodingContext *ctx,
|
||||
static void pgoutput_stream_commit(struct LogicalDecodingContext *ctx,
|
||||
ReorderBufferTXN *txn,
|
||||
XLogRecPtr commit_lsn);
|
||||
static void pgoutput_stream_prepare_txn(LogicalDecodingContext *ctx,
|
||||
ReorderBufferTXN *txn, XLogRecPtr prepare_lsn);
|
||||
|
||||
static bool publications_valid;
|
||||
static bool in_streaming;
|
||||
@@ -175,7 +177,7 @@ _PG_output_plugin_init(OutputPluginCallbacks *cb)
|
||||
cb->stream_message_cb = pgoutput_message;
|
||||
cb->stream_truncate_cb = pgoutput_truncate;
|
||||
/* transaction streaming - two-phase commit */
|
||||
cb->stream_prepare_cb = NULL;
|
||||
cb->stream_prepare_cb = pgoutput_stream_prepare_txn;
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -280,17 +282,6 @@ parse_output_parameters(List *options, PGOutputData *data)
|
||||
}
|
||||
else
|
||||
elog(ERROR, "unrecognized pgoutput option: %s", defel->defname);
|
||||
|
||||
/*
|
||||
* Do additional checking for the disallowed combination of two_phase
|
||||
* and streaming. While streaming and two_phase can theoretically be
|
||||
* supported, it needs more analysis to allow them together.
|
||||
*/
|
||||
if (data->two_phase && data->streaming)
|
||||
ereport(ERROR,
|
||||
(errcode(ERRCODE_SYNTAX_ERROR),
|
||||
errmsg("%s and %s are mutually exclusive options",
|
||||
"two_phase", "streaming")));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1029,6 +1020,24 @@ pgoutput_stream_commit(struct LogicalDecodingContext *ctx,
|
||||
cleanup_rel_sync_cache(txn->xid, true);
|
||||
}
|
||||
|
||||
/*
|
||||
* PREPARE callback (for streaming two-phase commit).
|
||||
*
|
||||
* Notify the downstream to prepare the transaction.
|
||||
*/
|
||||
static void
|
||||
pgoutput_stream_prepare_txn(LogicalDecodingContext *ctx,
|
||||
ReorderBufferTXN *txn,
|
||||
XLogRecPtr prepare_lsn)
|
||||
{
|
||||
Assert(rbtxn_is_streamed(txn));
|
||||
|
||||
OutputPluginUpdateProgress(ctx);
|
||||
OutputPluginPrepareWrite(ctx, true);
|
||||
logicalrep_write_stream_prepare(ctx->out, txn, prepare_lsn);
|
||||
OutputPluginWrite(ctx, true);
|
||||
}
|
||||
|
||||
/*
|
||||
* Initialize the relation schema sync cache for a decoding session.
|
||||
*
|
||||
|
Reference in New Issue
Block a user