From cb1fe0847b1f9ad99496bf8e643aeceefddb0a82 Mon Sep 17 00:00:00 2001 From: nemunaire Date: Tue, 24 Jan 2017 02:19:49 +0100 Subject: [PATCH] frontend: move file (on the same partition) instead of open, write, close the final file --- frontend/main.go | 6 ++++-- frontend/save.go | 46 +++++++++++++++++----------------------------- 2 files changed, 21 insertions(+), 31 deletions(-) diff --git a/frontend/main.go b/frontend/main.go index 30c6cb31..3c939ef4 100644 --- a/frontend/main.go +++ b/frontend/main.go @@ -17,6 +17,7 @@ const startedFile = "started" var TeamsDir string var SubmissionDir string +var TmpSubmissionDir string var touchTimer *time.Timer = nil @@ -70,10 +71,11 @@ func main() { log.SetPrefix("[frontend] ") SubmissionDir = path.Clean(SubmissionDir) + TmpSubmissionDir = path.Join(SubmissionDir, ".tmp") log.Println("Creating submission directory...") - if _, err := os.Stat(SubmissionDir); os.IsNotExist(err) { - if err := os.MkdirAll(SubmissionDir, 0777); err != nil { + if _, err := os.Stat(TmpSubmissionDir); os.IsNotExist(err) { + if err := os.MkdirAll(TmpSubmissionDir, 0777); err != nil { log.Fatal("Unable to create submission directory: ", err) } } diff --git a/frontend/save.go b/frontend/save.go index 8e87cbc4..bb2009b9 100644 --- a/frontend/save.go +++ b/frontend/save.go @@ -1,6 +1,7 @@ package main import ( + "bufio" "io/ioutil" "log" "net/http" @@ -42,40 +43,27 @@ func saveFile(dirname string, filename string, r *http.Request) error { } } - var f *os.File + // Write content to temp file + tmpfile, err := ioutil.TempFile(TmpSubmissionDir, "") + if err != nil { + return err + } + + writer := bufio.NewWriter(tmpfile) + reader := bufio.NewReader(r.Body) + if _, err := reader.WriteTo(writer); err != nil { + return err + } + writer.Flush() + tmpfile.Close() if filename == "" { - if fd, err := ioutil.TempFile(dirname, ""); err != nil { - return err - } else { - defer f.Close() - f = fd - } - } else { - if fd, err := os.Create(path.Join(dirname, filename)); err != nil { - return err - } else { - defer f.Close() - f = fd - } + filename = path.Base(tmpfile.Name()) } - // Read request body - var body []byte - if r.ContentLength > 0 { - tmp := make([]byte, 1024) - for { - n, err := r.Body.Read(tmp) - for j := 0; j < n; j++ { - body = append(body, tmp[j]) - } - if err != nil || n <= 0 { - break - } - } + if err := os.Rename(tmpfile.Name(), path.Join(dirname, filename)); err != nil { + log.Println("[ERROR] Unable to move file: ", err) } - f.Write(body) - return nil }