From 37facf3dde161d2df4d430896dc87ebb5740cc64 Mon Sep 17 00:00:00 2001 From: Sergey Matveev Date: Fri, 24 Sep 2021 22:38:23 +0300 Subject: [PATCH] Ability to turn off filesystem sync --- contrib/pyshop2packages.sh | 3 ++- doc/usage.texi | 4 ++++ fileutils.go | 15 +++++++++++---- refresh.go | 14 ++++++++------ upload.go | 14 ++++++++------ 5 files changed, 33 insertions(+), 17 deletions(-) diff --git a/contrib/pyshop2packages.sh b/contrib/pyshop2packages.sh index e247ce8..efdfbb3 100755 --- a/contrib/pyshop2packages.sh +++ b/contrib/pyshop2packages.sh @@ -52,7 +52,8 @@ done ######################################################################## cd packages for pkg in * ; do - # Assume gocheese -gpgupdate /gpgupdate/ + # Assume running: + # GOCHEESE_NO_SYNC=1 gocheese -bind "[::1]:8080" -gpgupdate /gpgupdate/ curl http://localhost:8080/gpgupdate/$pkg/ > /dev/null done diff --git a/doc/usage.texi b/doc/usage.texi index e60fdd0..a116bc9 100644 --- a/doc/usage.texi +++ b/doc/usage.texi @@ -44,3 +44,7 @@ flagged as internal package. It is advisable to run GoCheese under some kind of @url{http://cr.yp.to/daemontools.html, daemontools}. + +@env{$GOCHEESE_NO_SYNC=1} environment variable turns off filesystem +synchronization calls, that could be useful when massively updating the +database. diff --git a/fileutils.go b/fileutils.go index ba18ee9..03b852e 100644 --- a/fileutils.go +++ b/fileutils.go @@ -24,6 +24,8 @@ import ( "time" ) +var NoSync = os.Getenv("GOCHEESE_NO_SYNC") == "1" + func TempFile(dir string) (*os.File, error) { // Assume that probability of suffix collision is negligible suffix := strconv.FormatInt(time.Now().UnixNano()+int64(os.Getpid()), 16) @@ -32,6 +34,9 @@ func TempFile(dir string) (*os.File, error) { } func DirSync(dirPath string) error { + if NoSync { + return nil + } fd, err := os.Open(dirPath) if err != nil { return err @@ -54,10 +59,12 @@ func WriteFileSync(dirPath, filePath string, data []byte) error { dst.Close() return err } - if err = dst.Sync(); err != nil { - os.Remove(dst.Name()) - dst.Close() - return err + if !NoSync { + if err = dst.Sync(); err != nil { + os.Remove(dst.Name()) + dst.Close() + return err + } } dst.Close() if err = os.Rename(dst.Name(), filePath); err != nil { diff --git a/refresh.go b/refresh.go index 11325e2..d41f122 100644 --- a/refresh.go +++ b/refresh.go @@ -207,12 +207,14 @@ func refreshDir( http.Error(w, "digest mismatch", http.StatusBadGateway) return false } - if err = dst.Sync(); err != nil { - os.Remove(dst.Name()) - dst.Close() - log.Println("error", r.RemoteAddr, "pypi", filename, err) - http.Error(w, err.Error(), http.StatusInternalServerError) - return false + if !NoSync { + if err = dst.Sync(); err != nil { + os.Remove(dst.Name()) + dst.Close() + log.Println("error", r.RemoteAddr, "pypi", filename, err) + http.Error(w, err.Error(), http.StatusInternalServerError) + return false + } } if err = dst.Close(); err != nil { log.Println("error", r.RemoteAddr, "pypi", filename, err) diff --git a/upload.go b/upload.go index e958108..cd98df5 100644 --- a/upload.go +++ b/upload.go @@ -121,12 +121,14 @@ func serveUpload(w http.ResponseWriter, r *http.Request) { http.Error(w, err.Error(), http.StatusInternalServerError) return } - if err = dst.Sync(); err != nil { - log.Println("error", r.RemoteAddr, filename, err) - os.Remove(dst.Name()) - dst.Close() - http.Error(w, err.Error(), http.StatusInternalServerError) - return + if !NoSync { + if err = dst.Sync(); err != nil { + log.Println("error", r.RemoteAddr, filename, err) + os.Remove(dst.Name()) + dst.Close() + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } } dst.Close() digest := hasher.Sum(nil) -- 2.44.0