mirror of
https://github.com/postgres/postgres.git
synced 2025-07-26 01:22:12 +03:00
Extend the output plugin API to allow decoding of prepared xacts.
This adds six methods to the output plugin API, adding support for streaming changes of two-phase transactions at prepare time. * begin_prepare * filter_prepare * prepare * commit_prepared * rollback_prepared * stream_prepare Most of this is a simple extension of the existing methods, with the semantic difference that the transaction is not yet committed and maybe aborted later. Until now two-phase transactions were translated into regular transactions on the subscriber, and the GID was not forwarded to it. None of the two-phase commands were communicated to the subscriber. This patch provides the infrastructure for logical decoding plugins to be informed of two-phase commands Like PREPARE TRANSACTION, COMMIT PREPARED and ROLLBACK PREPARED commands with the corresponding GID. This also extends the 'test_decoding' plugin, implementing these new methods. This commit simply adds these new APIs and the upcoming patch to "allow the decoding at prepare time in ReorderBuffer" will use these APIs. Author: Ajin Cherian and Amit Kapila based on previous work by Nikhil Sontakke and Stas Kelvich Reviewed-by: Amit Kapila, Peter Smith, Sawada Masahiko, and Dilip Kumar Discussion: https://postgr.es/m/02DA5F5E-CECE-4D9C-8B4B-418077E2C010@postgrespro.ru https://postgr.es/m/CAMGcDxeqEpWj3fTXwqhSwBdXd2RS9jzwWscO-XbeCfso6ts3+Q@mail.gmail.com
This commit is contained in:
@ -244,6 +244,12 @@ typedef struct ReorderBufferTXN
|
||||
/* Xid of top-level transaction, if known */
|
||||
TransactionId toplevel_xid;
|
||||
|
||||
/*
|
||||
* Global transaction id required for identification of prepared
|
||||
* transactions.
|
||||
*/
|
||||
char *gid;
|
||||
|
||||
/*
|
||||
* LSN of the first data carrying, WAL record with knowledge about this
|
||||
* xid. This is allowed to *not* be first record adorned with this xid, if
|
||||
@ -418,6 +424,26 @@ typedef void (*ReorderBufferMessageCB) (ReorderBuffer *rb,
|
||||
const char *prefix, Size sz,
|
||||
const char *message);
|
||||
|
||||
/* begin prepare callback signature */
|
||||
typedef void (*ReorderBufferBeginPrepareCB) (ReorderBuffer *rb,
|
||||
ReorderBufferTXN *txn);
|
||||
|
||||
/* prepare callback signature */
|
||||
typedef void (*ReorderBufferPrepareCB) (ReorderBuffer *rb,
|
||||
ReorderBufferTXN *txn,
|
||||
XLogRecPtr prepare_lsn);
|
||||
|
||||
/* commit prepared callback signature */
|
||||
typedef void (*ReorderBufferCommitPreparedCB) (ReorderBuffer *rb,
|
||||
ReorderBufferTXN *txn,
|
||||
XLogRecPtr commit_lsn);
|
||||
|
||||
/* rollback prepared callback signature */
|
||||
typedef void (*ReorderBufferRollbackPreparedCB) (ReorderBuffer *rb,
|
||||
ReorderBufferTXN *txn,
|
||||
XLogRecPtr prepare_end_lsn,
|
||||
TimestampTz prepare_time);
|
||||
|
||||
/* start streaming transaction callback signature */
|
||||
typedef void (*ReorderBufferStreamStartCB) (
|
||||
ReorderBuffer *rb,
|
||||
@ -436,6 +462,12 @@ typedef void (*ReorderBufferStreamAbortCB) (
|
||||
ReorderBufferTXN *txn,
|
||||
XLogRecPtr abort_lsn);
|
||||
|
||||
/* prepare streamed transaction callback signature */
|
||||
typedef void (*ReorderBufferStreamPrepareCB) (
|
||||
ReorderBuffer *rb,
|
||||
ReorderBufferTXN *txn,
|
||||
XLogRecPtr prepare_lsn);
|
||||
|
||||
/* commit streamed transaction callback signature */
|
||||
typedef void (*ReorderBufferStreamCommitCB) (
|
||||
ReorderBuffer *rb,
|
||||
@ -504,12 +536,21 @@ struct ReorderBuffer
|
||||
ReorderBufferCommitCB commit;
|
||||
ReorderBufferMessageCB message;
|
||||
|
||||
/*
|
||||
* Callbacks to be called when streaming a transaction at prepare time.
|
||||
*/
|
||||
ReorderBufferBeginCB begin_prepare;
|
||||
ReorderBufferPrepareCB prepare;
|
||||
ReorderBufferCommitPreparedCB commit_prepared;
|
||||
ReorderBufferRollbackPreparedCB rollback_prepared;
|
||||
|
||||
/*
|
||||
* Callbacks to be called when streaming a transaction.
|
||||
*/
|
||||
ReorderBufferStreamStartCB stream_start;
|
||||
ReorderBufferStreamStopCB stream_stop;
|
||||
ReorderBufferStreamAbortCB stream_abort;
|
||||
ReorderBufferStreamPrepareCB stream_prepare;
|
||||
ReorderBufferStreamCommitCB stream_commit;
|
||||
ReorderBufferStreamChangeCB stream_change;
|
||||
ReorderBufferStreamMessageCB stream_message;
|
||||
|
Reference in New Issue
Block a user