mirror of
https://github.com/postgres/postgres.git
synced 2025-10-28 11:55:03 +03:00
Add option to enable two_phase commits via pg_create_logical_replication_slot.
Commit 0aa8a01d04 extends the output plugin API to allow decoding of
prepared xacts and allowed the user to enable/disable the two-phase option
via pg_logical_slot_get_changes(). This can lead to a problem such that
the first time when it gets changes via pg_logical_slot_get_changes()
without two_phase option enabled it will not get the prepared even though
prepare is after consistent snapshot. Now next time during getting changes,
if the two_phase option is enabled it can skip prepare because by that
time start decoding point has been moved. So the user will only get commit
prepared.
Allow to enable/disable this option at the create slot time and default
will be false. It will break the existing slots which is fine in a major
release.
Author: Ajin Cherian
Reviewed-by: Amit Kapila and Vignesh C
Discussion: https://postgr.es/m/d0f60d60-133d-bf8d-bd70-47784d8fabf3@enterprisedb.com
This commit is contained in:
@@ -216,10 +216,17 @@ ReplicationSlotValidateName(const char *name, int elevel)
|
||||
* name: Name of the slot
|
||||
* db_specific: logical decoding is db specific; if the slot is going to
|
||||
* be used for that pass true, otherwise false.
|
||||
* two_phase: Allows decoding of prepared transactions. We allow this option
|
||||
* to be enabled only at the slot creation time. If we allow this option
|
||||
* to be changed during decoding then it is quite possible that we skip
|
||||
* prepare first time because this option was not enabled. Now next time
|
||||
* during getting changes, if the two_phase option is enabled it can skip
|
||||
* prepare because by that time start decoding point has been moved. So the
|
||||
* user will only get commit prepared.
|
||||
*/
|
||||
void
|
||||
ReplicationSlotCreate(const char *name, bool db_specific,
|
||||
ReplicationSlotPersistency persistency)
|
||||
ReplicationSlotPersistency persistency, bool two_phase)
|
||||
{
|
||||
ReplicationSlot *slot = NULL;
|
||||
int i;
|
||||
@@ -277,6 +284,7 @@ ReplicationSlotCreate(const char *name, bool db_specific,
|
||||
namestrcpy(&slot->data.name, name);
|
||||
slot->data.database = db_specific ? MyDatabaseId : InvalidOid;
|
||||
slot->data.persistency = persistency;
|
||||
slot->data.two_phase = two_phase;
|
||||
|
||||
/* and then data only present in shared memory */
|
||||
slot->just_dirtied = false;
|
||||
|
||||
Reference in New Issue
Block a user