Search code examples
linuxrenameext4fsync

Is rename() without fsync() safe?


Is it safe to call rename(tmppath, path) without calling fsync(tmppath_fd) first?

I want the path to always point to a complete file. I care mainly about Ext4. Is the rename() promised to be safe in all future Linux kernel versions?

A usage example in Python:

def store_atomically(path, data):
    tmppath = path + ".tmp"
    output = open(tmppath, "wb")
    output.write(data)

    output.flush()
    os.fsync(output.fileno())  # The needed fsync().
    output.close()
    os.rename(tmppath, path)

Solution

  • No.

    Look at libeatmydata, and this presentation:

    Eat My Data: How Everybody Gets File IO Wrong

    http://www.oscon.com/oscon2008/public/schedule/detail/3172

    by Stewart Smith from MySql.

    In case it is offline/no longer available, I keep a copy of it: