• Alvaro Herrera's avatar
    Fix replay of create database records on standby · a3aacb7c
    Alvaro Herrera authored
    Crash recovery on standby may encounter missing directories
    when replaying database-creation WAL records.  Prior to this
    patch, the standby would fail to recover in such a case;
    however, the directories could be legitimately missing.
    Consider the following sequence of commands:
    
        CREATE DATABASE
        DROP DATABASE
        DROP TABLESPACE
    
    If, after replaying the last WAL record and removing the
    tablespace directory, the standby crashes and has to replay the
    create database record again, crash recovery must be able to continue.
    
    A fix for this problem was already attempted in 49d9cfc68bf4, but it
    was reverted because of design issues.  This new version is based
    on Robert Haas' proposal: any missing tablespaces are created
    during recovery before reaching consistency.  Tablespaces
    are created as real directories, and should be deleted
    by later replay.  CheckRecoveryConsistency ensures
    they have disappeared.
    
    The problems detected by this new code are reported as PANIC,
    except when allow_in_place_tablespaces is set to ON, in which
    case they are WARNING.  Apart from making tests possible, this
    gives users an escape hatch in case things don't go as planned.
    
    Author: Kyotaro Horiguchi <horikyota.ntt@gmail.com>
    Author: Asim R Praveen <apraveen@pivotal.io>
    Author: Paul Guo <paulguo@gmail.com>
    Reviewed-by: Anastasia Lubennikova <lubennikovaav@gmail.com> (older versions)
    Reviewed-by: Fujii Masao <masao.fujii@oss.nttdata.com> (older versions)
    Reviewed-by: default avatarMichaël Paquier <michael@paquier.xyz>
    Diagnosed-by: default avatarPaul Guo <paulguo@gmail.com>
    Discussion: https://postgr.es/m/CAEET0ZGx9AvioViLf7nbR_8tH9-=27DN5xWJ2P9-ROH16e4JUA@mail.gmail.com
    a3aacb7c
xlog.c 411 KB