• Andres Freund's avatar
    Fix ALTER TABLE ... SET TABLESPACE for unlogged relations. · f54d0629
    Andres Freund authored
    Changing the tablespace of an unlogged relation did not WAL log the
    creation and content of the init fork. Thus, after a standby is
    promoted, unlogged relation cannot be accessed anymore, with errors
    like:
    ERROR:  58P01: could not open file "pg_tblspc/...": No such file or directory
    Additionally the init fork was not synced to disk, independent of the
    configured wal_level, a relatively small durability risk.
    
    Investigation of that problem also brought to light that, even for
    permanent relations, the creation of !main forks was not WAL logged,
    i.e. no XLOG_SMGR_CREATE record were emitted. That mostly turns out not
    to be a problem, because these files were created when the actual
    relation data is copied; nonexistent files are not treated as an error
    condition during replay. But that doesn't work for empty files, and
    generally feels a bit haphazard. Luckily, outside init and main forks,
    empty forks don't occur often or are not a problem.
    
    Add the required WAL logging and syncing to disk.
    
    Reported-By: Michael Paquier
    Author: Michael Paquier and Andres Freund
    Discussion: 20151210163230.GA11331@alap3.anarazel.de
    Backpatch: 9.1, where unlogged relations were introduced
    f54d0629
tablecmds.c 361 KB