• Noah Misch's avatar
    Fix data loss in wal_level=minimal crash recovery of CREATE TABLESPACE. · 5513c09c
    Noah Misch authored
    If the system crashed between CREATE TABLESPACE and the next checkpoint,
    the result could be some files in the tablespace unexpectedly containing
    no rows.  Affected files would be those for which the system did not
    write WAL; see the wal_skip_threshold documentation.  Before v13, a
    different set of conditions governed the writing of WAL; see v12's
    <sect2 id="populate-pitr">.  (The v12 conditions were broader in some
    ways and narrower in others.)  Users may want to audit non-default
    tablespaces for unexpected short files.  The bug could have truncated an
    index without affecting the associated table, and reindexing the index
    would fix that particular problem.
    
    This fixes the bug by making create_tablespace_directories() more like
    TablespaceCreateDbspace().  create_tablespace_directories() was
    recursively removing tablespace contents, reasoning that WAL redo would
    recreate everything removed that way.  That assumption holds for other
    wal_level values.  Under wal_level=minimal, the old approach could
    delete files for which no other copy existed.  Back-patch to 9.6 (all
    supported versions).
    
    Reviewed by Robert Haas and Prabhat Sahu.  Reported by Robert Haas.
    
    Discussion: https://postgr.es/m/CA+TgmoaLO9ncuwvr2nN-J4VEP5XyAcy=zKiHxQzBbFRxxGxm0w@mail.gmail.com
    5513c09c
018_wal_optimize.pl 12.7 KB