From 127bacc3c20dc35fcb874ae76d11ec006784075b Mon Sep 17 00:00:00 2001 From: Amit Kapila Date: Fri, 30 Apr 2021 14:56:43 +0530 Subject: [PATCH v1] Tighten the concurrent abort check during decoding. During decoding of an in-progress or prepared transaction, we detect concurrent abort with an error code ERRCODE_TRANSACTION_ROLLBACK. That is not sufficient because a callback can decide to throw that error code at other times as well. --- .../replication/logical/reorderbuffer.c | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/src/backend/replication/logical/reorderbuffer.c b/src/backend/replication/logical/reorderbuffer.c index e1e17962e7d..7ebfb3007f4 100644 --- a/src/backend/replication/logical/reorderbuffer.c +++ b/src/backend/replication/logical/reorderbuffer.c @@ -2491,17 +2491,18 @@ ReorderBufferProcessTXN(ReorderBuffer *rb, ReorderBufferTXN *txn, * abort of the (sub)transaction we are streaming or preparing. We * need to do the cleanup and return gracefully on this error, see * SetupCheckXidLive. + * + * This error code can be thrown by one of the callbacks we call during + * decoding so we need to ensure that we return gracefully only when we are + * sending the data in streaming mode and the streaming is not finished yet + * or when we are sending the data out on a PREPARE during a two-phase + * commit. */ - if (errdata->sqlerrcode == ERRCODE_TRANSACTION_ROLLBACK) + if (errdata->sqlerrcode == ERRCODE_TRANSACTION_ROLLBACK && + (stream_started || rbtxn_prepared(txn))) { - /* - * This error can occur either when we are sending the data in - * streaming mode and the streaming is not finished yet or when we - * are sending the data out on a PREPARE during a two-phase - * commit. - */ - Assert(streaming || rbtxn_prepared(txn)); - Assert(stream_started || rbtxn_prepared(txn)); + /* curtxn must be set for streaming or prepared transactions */ + Assert(curtxn); /* Cleanup the temporary error state. */ FlushErrorState(); -- 2.28.0.windows.1