postgres.git / summary / log / commit / refs

commit    8a7cbfce13d476a3e9782111c45a7b3335646ee4
Author:   Michael Paquier <michael@paquier.xyz>
Date:     Tue Dec 12 16:05:18 2023 +0000
First released in: 17.0, 12.18, 13.14, 14.11, 15.6, 16.2

    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 536edb3792f..8442c5e6a7a 100644 --- a/src/backend/access/transam/xact.c +++ b/src/backend/access/transam/xact.c @@ -5299,6 +5299,7 @@ PushTransaction(void) s->blockState = TBLOCK_SUBBEGIN; GetUserIdAndSecContext(&s->prevUser, &s->prevSecContext); s->prevXactReadOnly = XactReadOnly; + s->startedInRecovery = p->startedInRecovery; s->parallelModeLevel = 0; s->topXidLogged = false; [parent: c5962ad21a6e]