aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAmit Kapila <akapila@postgresql.org>2021-04-01 07:57:34 +0530
committerAmit Kapila <akapila@postgresql.org>2021-04-01 07:57:34 +0530
commit4778826532a62fd6e4d3fdeef9532c943604c730 (patch)
treecf96646cc16b707fa40f6ca6046e12cdcaf5c7ce /src
parent0d1a33438d3a88938264e12e94c22818307d2f4d (diff)
downloadpostgresql-4778826532a62fd6e4d3fdeef9532c943604c730.tar.gz
postgresql-4778826532a62fd6e4d3fdeef9532c943604c730.zip
Ensure to send a prepare after we detect concurrent abort during decoding.
It is possible that while decoding a prepared transaction, it gets aborted concurrently via a ROLLBACK PREPARED command. In that case, we were skipping all the changes and directly sending Rollback Prepared when we find the same in WAL. However, the downstream has no idea of the GID of such a transaction. So, ensure to send prepare even when a concurrent abort is detected. Author: Ajin Cherian Reviewed-by: Markus Wanner, Amit Kapila Discussion: https://postgr.es/m/f82133c6-6055-b400-7922-97dae9f2b50b@enterprisedb.com
Diffstat (limited to 'src')
-rw-r--r--src/backend/replication/logical/reorderbuffer.c8
1 files changed, 8 insertions, 0 deletions
diff --git a/src/backend/replication/logical/reorderbuffer.c b/src/backend/replication/logical/reorderbuffer.c
index 127f2c4b168..52d06285a21 100644
--- a/src/backend/replication/logical/reorderbuffer.c
+++ b/src/backend/replication/logical/reorderbuffer.c
@@ -2664,6 +2664,14 @@ ReorderBufferPrepare(ReorderBuffer *rb, TransactionId xid,
ReorderBufferReplay(txn, rb, xid, txn->final_lsn, txn->end_lsn,
txn->commit_time, txn->origin_id, txn->origin_lsn);
+
+ /*
+ * We send the prepare for the concurrently aborted xacts so that later
+ * when rollback prepared is decoded and sent, the downstream should be
+ * able to rollback such a xact. See comments atop DecodePrepare.
+ */
+ if (txn->concurrent_abort)
+ rb->prepare(rb, txn, txn->final_lsn);
}
/*