• Andres Freund's avatar
    Introduce durable_rename() and durable_link_or_rename(). · 606e0f98
    Andres Freund authored
    Renaming a file using rename(2) is not guaranteed to be durable in face
    of crashes; especially on filesystems like xfs and ext4 when mounted
    with data=writeback. To be certain that a rename() atomically replaces
    the previous file contents in the face of crashes and different
    filesystems, one has to fsync the old filename, rename the file, fsync
    the new filename, fsync the containing directory.  This sequence is not
    generally adhered to currently; which exposes us to data loss risks. To
    avoid having to repeat this arduous sequence, introduce
    durable_rename(), which wraps all that.
    
    Also add durable_link_or_rename(). Several places use link() (with a
    fallback to rename()) to rename a file, trying to avoid replacing the
    target file out of paranoia. Some of those rename sequences need to be
    durable as well. There seems little reason extend several copies of the
    same logic, so centralize the link() callers.
    
    This commit does not yet make use of the new functions; they're used in
    a followup commit.
    
    Author: Michael Paquier, Andres Freund
    Discussion: 56583BDD.9060302@2ndquadrant.com
    Backpatch: All supported branches
    606e0f98
origin.c 39.2 KB