Re: [RFC PATCH 1/2] sha1-file: fsync() loose dir entry when core.fsyncObjectFiles
From: Junio C Hamano <hidden>
Date: 2020-09-17 19:54:30
Also in:
linux-fsdevel
Christoph Hellwig [off-list ref] writes:
On Thu, Sep 17, 2020 at 10:55:23AM -0400, Jeff King wrote:quoted
On Thu, Sep 17, 2020 at 04:09:12PM +0200, Christoph Hellwig wrote:quoted
On Thu, Sep 17, 2020 at 01:28:29PM +0200, Ævar Arnfjörð Bjarmason wrote:quoted
Change the behavior of core.fsyncObjectFiles to also sync the directory entry. I don't have a case where this broke, just going by paranoia and the fsync(2) manual page's guarantees about its behavior.It is not just paranoia, but indeed what is required from the standards POV. At least for many Linux file systems your second fsync will be very cheap (basically a NULL syscall) as the log has alredy been forced all the way by the first one, but you can't rely on that.Is it sufficient to fsync() just the surrounding directory? I.e., if I do: mkdir("a"); mkdir("a/b"); open("a/b/c", O_WRONLY); is it enough to fsync() a descriptor pointing to "a/b", or should I also do "a"?You need to fsync both to be fully compliant, even if just fsyncing b will work for most but not all file systems. The good news is that for those common file systems the extra fsync of a is almost free.
Back to Ævar's patch, when creating a new loose object, we do these
things:
1. create temporary file and write the compressed contents to it
while computing its object name
2. create the fan-out directory under .git/objects/ if needed
3. mv temporary file to its final name
and the patch adds open+fsync+close on the fan-out directory. In
the above exchange with Peff, we learned that open+fsync+close needs
to be done on .git/objects if we created the fan-out directory, too.
Am I reading the above correctly?
Thanks.