v1-0001-Tighten-the-concurrent-abort-check-during-decodin.patch
application/octet-stream
Filename: v1-0001-Tighten-the-concurrent-abort-check-during-decodin.patch
Type: application/octet-stream
Part: 0
Patch
Same data as JSON:
GET /api/v1/attachments/:id/patch
the parsed metadata as JSON — format, series position, per-file stats; never the diff bytes.
API reference →
Format: format-patch
Series: patch v1-0001
Subject: Tighten the concurrent abort check during decoding.
| File | + | − |
|---|---|---|
| src/backend/replication/logical/reorderbuffer.c | 10 | 9 |
From 127bacc3c20dc35fcb874ae76d11ec006784075b Mon Sep 17 00:00:00 2001
From: Amit Kapila <akapila@postgresql.org>
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