From d99294e77f1df0a68cefe5ce17930b02f9b82c4f Mon Sep 17 00:00:00 2001 From: Michael Paquier Date: Tue, 12 Dec 2023 17:05:34 +0100 Subject: [PATCH] Prevent tuples to be marked as dead in subtransactions on standbys Dead tuples are ignored and are not marked as dead during recovery, as it can lead to MVCC issues on a standby because its xmin may not match with the primary. This information is tracked by a field called "xactStartedInRecovery" in the transaction state data, switched on when starting a transaction in recovery. Unfortunately, this information was not correctly tracked when starting a subtransaction, because the transaction state used for the subtransaction did not update "xactStartedInRecovery" based on the state of its parent. This would cause index scans done in subtransactions to return inconsistent data, depending on how the xmin of the primary and/or the standby evolved. This is broken since the introduction of hot standby in efc16ea52067, so backpatch all the way down. Author: Fei Changhong Reviewed-by: Kyotaro Horiguchi Discussion: https://postgr.es/m/tencent_C4D907A5093C071A029712E73B43C6512706@qq.com Backpatch-through: 12 --- src/backend/access/transam/xact.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/backend/access/transam/xact.c b/src/backend/access/transam/xact.c index 2a89141b5e0..ffe26e26f66 100644 --- a/src/backend/access/transam/xact.c +++ b/src/backend/access/transam/xact.c @@ -5180,6 +5180,7 @@ PushTransaction(void) s->blockState = TBLOCK_SUBBEGIN; GetUserIdAndSecContext(&s->prevUser, &s->prevSecContext); s->prevXactReadOnly = XactReadOnly; + s->startedInRecovery = p->startedInRecovery; s->parallelModeLevel = 0; CurrentTransactionState = s;