• Tom Lane's avatar
    Add fsync capability to initdb, and use sync_file_range() if available. · b966dd6c
    Tom Lane authored
    Historically we have not worried about fsync'ing anything during initdb
    (in fact, initdb intentionally passes -F to each backend launch to prevent
    it from fsync'ing).  But with filesystems getting more aggressive about
    caching data, that's not such a good plan anymore.  Make initdb do a pass
    over the finished data directory tree to fsync everything.  For testing
    purposes, the -N/--nosync flag can be used to restore the old behavior.
    
    Also, testing shows that on Linux, sync_file_range() is much faster than
    posix_fadvise() for hinting to the kernel that an fsync is coming,
    apparently because the latter blocks on a rather small request queue while
    the former doesn't.  So use this function if available in initdb, and also
    in the backend's pg_flush_data() (where it currently will affect only the
    speed of CREATE DATABASE's cloning step).
    
    We will later make pg_regress invoke initdb with the --nosync flag
    to avoid slowing down cases such as "make check" in contrib.  But
    let's not do so until we've shaken out any portability issues in this
    patch.
    
    Jeff Davis, reviewed by Andres Freund
    b966dd6c
fd.c 54.1 KB