• unknown's avatar
    Maria - various fixes around durability of files: · a41ac15b
    unknown authored
    1) on Mac OS X >=10.3, fcntl() is recommended over fsync (from the
    man page: "[With fsync()] the disk drive may also re-order the data
    so that later writes may be present while earlier writes are not.
    Applications such as databases that require a strict ordering of writes
    should use F_FULLFSYNC to ensure their data is written in the order
    they expect"). I have seen two other pieces of software changing from
    fsync to F_FULLFSYNC on Mac OS X.
    2) to make a file creation/deletion/renaming durable on Linux (at least
    ext2 as I have tested) (see "man fsync"), a fsync() on the directory
    is needed: new functions to do that, and a flag MY_SYNC_DIR to do
    it in my_create/my_delete/my_rename.
    3) now using this directory syncing when creating he frm if
    opt_sync_frm, and for Maria's control file when it is created.
    
    
    include/my_sys.h:
      new flag to my_create/my_delete/my_rename, which asks to sync the
      directory after the operation is done (currently does nothing except
      on Linux)
    libmysql/CMakeLists.txt:
      my_create() now depends on my_sync() so my_sync is needed for libmysql
    libmysql/Makefile.shared:
      my_create() now depends on my_sync() so my_sync is needed for libmysql
    mysys/my_create.c:
      my_create() can now sync the directory if asked for
    mysys/my_delete.c:
      my_delete() can now sync the directory if asked for
    mysys/my_open.c:
      it was a bug that my_close() is done on fd but a positive fd would
      still be returned, by my_register_filename().
    mysys/my_rename.c:
      my_rename() can now sync the two directories (the one of "from" and
      the one of "to") if asked for.
    mysys/my_sync.c:
      On recent Mac OS X, fcntl(F_FULLFSYNC) is recommended over fsync()
      (see "man fsync" on Mac OS X 10.3).
      my_sync_dir(): to sync a directory after a file creation/deletion/
      renaming; can be called directly or via MY_SYNC_DIR in my_create/
      my_delete/my_rename(). No-op except on Linux (see "man fsync" on Linux).
      my_sync_dir_from_file(): same as above, just more practical when the
      caller has a file name but no directory name ready.
      Should the #warning even be a #error? I mean do we want to release
      binaries which don't guarantee any durability?
    sql/log.cc:
      a TODO for the future.
    sql/unireg.cc:
      If we sync the frm it makes sense to also sync its creation in the
      directory.
    storage/maria/ma_control_file.c:
      control file is vital, try to make it to disk
    a41ac15b
my_sys.h 35.9 KB