diff options
author | Amit Kapila <akapila@postgresql.org> | 2021-05-06 08:26:42 +0530 |
---|---|---|
committer | Amit Kapila <akapila@postgresql.org> | 2021-05-06 08:26:42 +0530 |
commit | 2ce353fc19024d62e59ad99850d7592ebc9abecf (patch) | |
tree | 6459423472c6dfdd8626ac8f53b80bec562db802 /src | |
parent | c250062df42ffd3e252471f6205bfb6cbef67b7b (diff) | |
download | postgresql-2ce353fc19024d62e59ad99850d7592ebc9abecf.tar.gz postgresql-2ce353fc19024d62e59ad99850d7592ebc9abecf.zip |
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.
Reported-by: Tom Lane
Author: Amit Kapila
Reviewed-by: Dilip Kumar
Discussion: https://postgr.es/m/CAA4eK1KCjPRS4aZHB48QMM4J8XOC1+TD8jo-4Yu84E+MjwqVhA@mail.gmail.com
Diffstat (limited to 'src')
-rw-r--r-- | src/backend/replication/logical/reorderbuffer.c | 19 |
1 files changed, 10 insertions, 9 deletions
diff --git a/src/backend/replication/logical/reorderbuffer.c b/src/backend/replication/logical/reorderbuffer.c index ee680e5e1b4..c79425fbb73 100644 --- a/src/backend/replication/logical/reorderbuffer.c +++ b/src/backend/replication/logical/reorderbuffer.c @@ -2492,17 +2492,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(); |