mirror of
https://github.com/postgres/postgres.git
synced 2025-12-21 05:21:08 +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:
@@ -145,7 +145,8 @@ logicalrep_read_begin_prepare(StringInfo in, LogicalRepPreparedTxnData *begin_da
|
||||
}
|
||||
|
||||
/*
|
||||
* The core functionality for logicalrep_write_prepare.
|
||||
* The core functionality for logicalrep_write_prepare and
|
||||
* logicalrep_write_stream_prepare.
|
||||
*/
|
||||
static void
|
||||
logicalrep_write_prepare_common(StringInfo out, LogicalRepMsgType type,
|
||||
@@ -188,7 +189,8 @@ logicalrep_write_prepare(StringInfo out, ReorderBufferTXN *txn,
|
||||
}
|
||||
|
||||
/*
|
||||
* The core functionality for logicalrep_read_prepare.
|
||||
* The core functionality for logicalrep_read_prepare and
|
||||
* logicalrep_read_stream_prepare.
|
||||
*/
|
||||
static void
|
||||
logicalrep_read_prepare_common(StringInfo in, char *msgtype,
|
||||
@@ -209,6 +211,8 @@ logicalrep_read_prepare_common(StringInfo in, char *msgtype,
|
||||
elog(ERROR, "end_lsn is not set in %s message", msgtype);
|
||||
prepare_data->prepare_time = pq_getmsgint64(in);
|
||||
prepare_data->xid = pq_getmsgint(in, 4);
|
||||
if (prepare_data->xid == InvalidTransactionId)
|
||||
elog(ERROR, "invalid two-phase transaction ID in %s message", msgtype);
|
||||
|
||||
/* read gid (copy it into a pre-allocated buffer) */
|
||||
strlcpy(prepare_data->gid, pq_getmsgstring(in), sizeof(prepare_data->gid));
|
||||
@@ -339,6 +343,27 @@ logicalrep_read_rollback_prepared(StringInfo in,
|
||||
strlcpy(rollback_data->gid, pq_getmsgstring(in), sizeof(rollback_data->gid));
|
||||
}
|
||||
|
||||
/*
|
||||
* Write STREAM PREPARE to the output stream.
|
||||
*/
|
||||
void
|
||||
logicalrep_write_stream_prepare(StringInfo out,
|
||||
ReorderBufferTXN *txn,
|
||||
XLogRecPtr prepare_lsn)
|
||||
{
|
||||
logicalrep_write_prepare_common(out, LOGICAL_REP_MSG_STREAM_PREPARE,
|
||||
txn, prepare_lsn);
|
||||
}
|
||||
|
||||
/*
|
||||
* Read STREAM PREPARE from the stream.
|
||||
*/
|
||||
void
|
||||
logicalrep_read_stream_prepare(StringInfo in, LogicalRepPreparedTxnData *prepare_data)
|
||||
{
|
||||
logicalrep_read_prepare_common(in, "stream prepare", prepare_data);
|
||||
}
|
||||
|
||||
/*
|
||||
* Write ORIGIN to the output stream.
|
||||
*/
|
||||
|
||||
Reference in New Issue
Block a user