frontend: move file (on the same partition) instead of open, write, close the final file

This commit is contained in:
nemunaire 2017-01-24 02:19:49 +01:00 committed by Pierre-Olivier Mercier
parent cab95b7985
commit cb1fe0847b
2 changed files with 21 additions and 31 deletions

View file

@ -17,6 +17,7 @@ const startedFile = "started"
var TeamsDir string var TeamsDir string
var SubmissionDir string var SubmissionDir string
var TmpSubmissionDir string
var touchTimer *time.Timer = nil var touchTimer *time.Timer = nil
@ -70,10 +71,11 @@ func main() {
log.SetPrefix("[frontend] ") log.SetPrefix("[frontend] ")
SubmissionDir = path.Clean(SubmissionDir) SubmissionDir = path.Clean(SubmissionDir)
TmpSubmissionDir = path.Join(SubmissionDir, ".tmp")
log.Println("Creating submission directory...") log.Println("Creating submission directory...")
if _, err := os.Stat(SubmissionDir); os.IsNotExist(err) { if _, err := os.Stat(TmpSubmissionDir); os.IsNotExist(err) {
if err := os.MkdirAll(SubmissionDir, 0777); err != nil { if err := os.MkdirAll(TmpSubmissionDir, 0777); err != nil {
log.Fatal("Unable to create submission directory: ", err) log.Fatal("Unable to create submission directory: ", err)
} }
} }

View file

@ -1,6 +1,7 @@
package main package main
import ( import (
"bufio"
"io/ioutil" "io/ioutil"
"log" "log"
"net/http" "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 filename == "" {
if fd, err := ioutil.TempFile(dirname, ""); err != nil { filename = path.Base(tmpfile.Name())
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
}
} }
// Read request body if err := os.Rename(tmpfile.Name(), path.Join(dirname, filename)); err != nil {
var body []byte log.Println("[ERROR] Unable to move file: ", err)
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
}
}
} }
f.Write(body)
return nil return nil
} }