Reorderbuffer: handle catalog-change-bearing aborted subxacts better When constructing a historic snapshot for logical decoding, reorderbuffer needs to keep track of movement of tuples in catalog tables. For the most part this works correctly, except that when a subtransaction that wrote a catalog tuple aborts, we failed to "forget" about that change. There's no known reports of anything actually breaking except assertion failures, but it is likely possible to construct cases where historical snapshots produce bogus visibility answers, potentially causing incorrect decoding output.
To fix, have the decode of a subtransaction abort go over the TUPLECID list that has been accumulated on the ReorderBufferTXN for its topmost parent transaction, and remove all the entries that were marked as originating from the aborted subtransaction or its children. There are some little details in which various devils lie, which the added code comments explain (we hope). Add a couple of isolation test cases that trip the assertions with the original coding. They're not ideal test design, because they pass in non-assert builds without the fix. But we'd rather have the fix be verified in that limited scenario than nowhere at all, and they are cheap enough. This bug is sibling to the one fixed in commit 8c67d29fd51c and, like that one, it goes all the way back to the introduction of reorderbuffers, so backpatch to all live branches. While reviewing this, I (Álvaro) was bothered by the snapmgr.c tuplecid_data file-scoped variable, as it's easily confused with a function parameter used widely in reorderbuffer.c. In branches 19 and master, rename that to avoid confusion. Reported-by: Arseny Sher <[email protected]> Reported-by: Mark Dilger <[email protected]> Reported-by: Alexander Kozhemyakin <[email protected]> Author: Bingshuai Li <[email protected]> Author: Hayato Kuroda <[email protected]> Author: Zhijie Hou <[email protected]> Backpatch-through: 14 Bug: #19555 Discussion: https://postgr.es/m/87r2c8xocq.fsf@ars-thinkpad Discussion: https://postgr.es/m/cahghdku5e3xy5e90tuaxq_r4wrkxsv734q%[email protected] Discussion: https://postgr.es/m/[email protected] Branch ------ master Details ------- https://git.postgresql.org/pg/commitdiff/beff3cd00989e2d532cde376da05be42eeb98577 Modified Files -------------- contrib/test_decoding/Makefile | 3 +- contrib/test_decoding/expected/tuplecid_nested.out | 32 ++++++ .../test_decoding/expected/tuplecid_restart.out | 68 +++++++++++++ contrib/test_decoding/meson.build | 2 + contrib/test_decoding/specs/tuplecid_nested.spec | 77 ++++++++++++++ contrib/test_decoding/specs/tuplecid_restart.spec | 74 ++++++++++++++ src/backend/replication/logical/decode.c | 11 +- src/backend/replication/logical/reorderbuffer.c | 111 ++++++++++++++++++++- src/backend/replication/logical/snapbuild.c | 2 +- src/backend/utils/time/snapmgr.c | 8 +- src/include/replication/reorderbuffer.h | 14 ++- 11 files changed, 389 insertions(+), 13 deletions(-)
