• Heikki Linnakangas's avatar
    If recovery.conf is created after "pg_ctl stop -m i", do crash recovery. · abf5c5c9
    Heikki Linnakangas authored
    If you create a base backup using an atomic filesystem snapshot, and try to
    perform PITR starting from that base backup, or if you just kill a master
    server and create recovery.conf to put it into standby mode, we don't know
    how far we need to recover before reaching consistency. Normally in crash
    recovery, we replay all the WAL present in pg_xlog, and assume that we're
    consistent after that. And normally in archive recovery, minRecoveryPoint,
    backupEndRequired, or backupEndPoint is set in the control file, indicating
    how far we need to replay to reach consistency. But if the server was
    previously up and running normally, and you kill -9 it or take an atomic
    filesystem snapshot, none of those fields are set in the control file.
    
    The solution is to perform crash recovery first, replaying all the WAL in
    pg_xlog. After that's done, we assume that the system is consistent like in
    normal crash recovery, and switch to archive recovery mode after that.
    
    Per report from Kyotaro HORIGUCHI. In his scenario, recovery.conf was
    created after "pg_ctl stop -m i". I'm not sure we need to support that exact
    scenario, but we should support backing up using a filesystem snapshot,
    which looks identical.
    
    This issue goes back to at least 9.0, where hot standby was introduced and
    we started to track when consistency is reached. In 9.1 and 9.2, we would
    open up for hot standby too early, and queries could briefly see an
    inconsistent state. But 9.2 made it more visible, as we started to PANIC if
    we see a reference to a non-existing page during recovery, if we've already
    reached consistency. This is a fairly big patch, so back-patch to 9.2 only,
    where the issue is more visible. We can consider back-patching further after
    this has received some more testing in 9.2 and master.
    abf5c5c9
xlog.c 301 KB