]> git.proxmox.com Git - libgit2.git/commitdiff
odb_loose: actually honor the fsync option
authorEdward Thomson <ethomson@github.com>
Tue, 13 Dec 2016 15:35:05 +0000 (10:35 -0500)
committerEdward Thomson <ethomson@github.com>
Tue, 28 Feb 2017 13:27:49 +0000 (13:27 +0000)
We've had an fsync option for a long time, but it was "ignored".
Stop ignoring it.

include/git2/odb_backend.h
src/odb_loose.c

index b17cfd8bab823986b42db79ca51f65d5ff86bc97..9199538cebfb2c8c9344ecb57b01f5865e2b180b 100644 (file)
@@ -39,7 +39,7 @@ GIT_EXTERN(int) git_odb_backend_pack(git_odb_backend **out, const char *objects_
  * @param out location to store the odb backend pointer
  * @param objects_dir the Git repository's objects directory
  * @param compression_level zlib compression level to use
- * @param do_fsync whether to do an fsync() after writing (currently ignored)
+ * @param do_fsync whether to do an fsync() after writing
  * @param dir_mode permissions to use creating a directory or 0 for defaults
  * @param file_mode permissions to use creating a file or 0 for defaults
  *
index b2e2f1fb7bed82e9a46ce11f03c40e5b83bd95a6..8796f4baebc4ce66e25b37eca4c5d302f1976dc3 100644 (file)
@@ -838,6 +838,17 @@ static void loose_backend__stream_free(git_odb_stream *_stream)
        git__free(stream);
 }
 
+static int filebuf_flags(loose_backend *backend)
+{
+       int flags = GIT_FILEBUF_TEMPORARY |
+               (backend->object_zlib_level << GIT_FILEBUF_DEFLATE_SHIFT);
+
+       if (backend->fsync_object_files)
+               flags |= GIT_FILEBUF_FSYNC;
+
+       return flags;
+}
+
 static int loose_backend__stream(git_odb_stream **stream_out, git_odb_backend *_backend, git_off_t length, git_otype type)
 {
        loose_backend *backend;
@@ -864,9 +875,7 @@ static int loose_backend__stream(git_odb_stream **stream_out, git_odb_backend *_
        stream->stream.mode = GIT_STREAM_WRONLY;
 
        if (git_buf_joinpath(&tmp_path, backend->objects_dir, "tmp_object") < 0 ||
-               git_filebuf_open(&stream->fbuf, tmp_path.ptr,
-                       GIT_FILEBUF_TEMPORARY |
-                       (backend->object_zlib_level << GIT_FILEBUF_DEFLATE_SHIFT),
+               git_filebuf_open(&stream->fbuf, tmp_path.ptr, filebuf_flags(backend),
                        backend->object_file_mode) < 0 ||
                stream->stream.write((git_odb_stream *)stream, hdr, hdrlen) < 0)
        {
@@ -894,9 +903,7 @@ static int loose_backend__write(git_odb_backend *_backend, const git_oid *oid, c
        header_len = git_odb__format_object_header(header, sizeof(header), len, type);
 
        if (git_buf_joinpath(&final_path, backend->objects_dir, "tmp_object") < 0 ||
-               git_filebuf_open(&fbuf, final_path.ptr,
-                       GIT_FILEBUF_TEMPORARY |
-                       (backend->object_zlib_level << GIT_FILEBUF_DEFLATE_SHIFT),
+               git_filebuf_open(&fbuf, final_path.ptr, filebuf_flags(backend),
                        backend->object_file_mode) < 0)
        {
                error = -1;