From 2175029c9e6ba3a9ecc2a7e13ba8fb335e08c709 Mon Sep 17 00:00:00 2001 From: Michael Eischer Date: Fri, 29 Jan 2021 19:02:22 +0100 Subject: [PATCH] Sync directory to disk after upload After a file was uploaded, also sync its containing directory to disk to make sure that also the directory entry is persisted after a system crash. --- repo/repo.go | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/repo/repo.go b/repo/repo.go index fc8e908..8fe1dae 100644 --- a/repo/repo.go +++ b/repo/repo.go @@ -627,9 +627,28 @@ func (h *Handler) saveBlob(w http.ResponseWriter, r *http.Request) { return } + if err := syncDir(filepath.Dir(path)); err != nil { + // Don't call os.Remove(path) as this is prone to race conditions with parallel upload retries + h.internalServerError(w, err) + return + } + h.sendMetric(objectType, BlobWrite, uint64(written)) } +func syncDir(dirname string) error { + dir, err := os.Open(dirname) + if err != nil { + return err + } + err = dir.Sync() + if err != nil { + _ = dir.Close() + return err + } + return dir.Close() +} + // deleteBlob deletes a blob from the repository. func (h *Handler) deleteBlob(w http.ResponseWriter, r *http.Request) { if h.opt.Debug {