Avoid sending prepare multiple times while decoding.

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. For 'streaming' case (when we send changes for
in-progress transactions), we were sending prepare twice when concurrent
abort was detected.

Author: Peter Smith
Reviewed-by: Amit Kapila
Discussion: https://postgr.es/m/f82133c6-6055-b400-7922-97dae9f2b50b@enterprisedb.com
This commit is contained in:
Amit Kapila 2021-04-26 11:27:44 +05:30
parent 3cbea581c7
commit f25a4584c6

View File

@ -2690,8 +2690,11 @@ ReorderBufferPrepare(ReorderBuffer *rb, TransactionId xid,
* 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.
*
* Note, for the concurrent_abort + streaming case a stream_prepare was
* already sent within the ReorderBufferReplay call above.
*/
if (txn->concurrent_abort)
if (txn->concurrent_abort && !rbtxn_is_streamed(txn))
rb->prepare(rb, txn, txn->final_lsn);
}