From 1ba7219e8ff26148c14cdef6b54bfa480adf5cf0 Mon Sep 17 00:00:00 2001
From: Ajin Cherian <ajinc@fast.au.fujitsu.com>
Date: Tue, 30 Mar 2021 00:16:35 -0400
Subject: [PATCH v1] Make sure a prepare is sent when decoder detects a
 concurrent abort.

While decoding a prepared transaction, and a concurrent abort of the transaction
being decoded is detected, the decoding is stopped. But this fix makes sure that
even if the decoding is aborted, the PREPARE is sent out. This ensures that
when the ROLLBACK PREPARED is eventually sent downstream, there is a corresponding
prepared transaction to rollback.
---
 src/backend/replication/logical/reorderbuffer.c | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/src/backend/replication/logical/reorderbuffer.c b/src/backend/replication/logical/reorderbuffer.c
index 127f2c4..1442af1 100644
--- a/src/backend/replication/logical/reorderbuffer.c
+++ b/src/backend/replication/logical/reorderbuffer.c
@@ -2664,6 +2664,13 @@ ReorderBufferPrepare(ReorderBuffer *rb, TransactionId xid,
 
 	ReorderBufferReplay(txn, rb, xid, txn->final_lsn, txn->end_lsn,
 						txn->commit_time, txn->origin_id, txn->origin_lsn);
+
+	/*
+	 * If the transaction has been concurrently aborted, make sure we send
+	 * prepare here.
+	 */
+	if (txn->concurrent_abort)
+		rb->prepare(rb, txn, txn->final_lsn);
 }
 
 /*
-- 
1.8.3.1

