• Heikki Linnakangas's avatar
    Fix bugs in the hot standby known-assigned-xids tracking logic. If there's · 5a031a55
    Heikki Linnakangas authored
    an old transaction running in the master, and a lot of transactions have
    started and finished since, and a WAL-record is written in the gap between
    the creating the running-xacts snapshot and WAL-logging it, recovery will fail
    with "too many KnownAssignedXids" error. This bug was reported by
    Joachim Wieland on Nov 19th.
    
    In the same scenario, when fewer transactions have started so that all the
    xids fit in KnownAssignedXids despite the first bug, a more serious bug
    arises. We incorrectly initialize the clog code with the oldest still running
    transaction, and when we see the WAL record belonging to a transaction with
    an XID larger than one that committed already before the checkpoint we're
    recovering from, we zero the clog page containing the already committed
    transaction, leading to data loss.
    
    In hindsight, trying to track xids in the known-assigned-xids array before
    seeing the running-xacts record was too complicated. To fix that, hold
    XidGenLock while the running-xacts snapshot is taken and WAL-logged. That
    ensures that no transaction can begin or end in that gap, so that in recvoery
    we know that the snapshot contains all transactions running at that point in
    WAL.
    5a031a55
standby.c 30.2 KB