summaryrefslogtreecommitdiff
path: root/system/admin/upload/backup.go
diff options
context:
space:
mode:
authorErwin Ticzon <eticzongh@gmail.com>2017-04-21 22:48:08 +1000
committerErwin Ticzon <eticzongh@gmail.com>2017-04-21 22:48:08 +1000
commit64f2a5bd9223826afe0869813385f6b925a13fb5 (patch)
tree89de4e310cc07b40d3bf8face14a638b92e6cbd2 /system/admin/upload/backup.go
parentd014fa69c51be5fa880d8ee5ae0ddbf4b2f5fd81 (diff)
add context cancellation to backup routines
Diffstat (limited to 'system/admin/upload/backup.go')
-rw-r--r--system/admin/upload/backup.go25
1 files changed, 23 insertions, 2 deletions
diff --git a/system/admin/upload/backup.go b/system/admin/upload/backup.go
index 28b1b8e..b4f6393 100644
--- a/system/admin/upload/backup.go
+++ b/system/admin/upload/backup.go
@@ -3,6 +3,7 @@ package upload
import (
"archive/tar"
"compress/gzip"
+ "context"
"fmt"
"io"
"net/http"
@@ -13,7 +14,7 @@ import (
// Backup creates an archive of a project's uploads and writes it
// to the response as a download
-func Backup(res http.ResponseWriter) error {
+func Backup(ctx context.Context, res http.ResponseWriter) error {
ts := time.Now().Unix()
filename := fmt.Sprintf("uploads-%d.bak.tar.gz", ts)
tmp := os.TempDir()
@@ -30,7 +31,8 @@ func Backup(res http.ResponseWriter) error {
gz := gzip.NewWriter(f)
tarball := tar.NewWriter(gz)
- err = filepath.Walk("uploads", func(path string, info os.FileInfo, err error) error {
+ errChan := make(chan error, 1)
+ walkFn := func(path string, info os.FileInfo, err error) error {
if err != nil {
return err
}
@@ -53,6 +55,7 @@ func Backup(res http.ResponseWriter) error {
return err
}
defer src.Close()
+
_, err = io.Copy(tarball, src)
if err != nil {
return err
@@ -70,6 +73,24 @@ func Backup(res http.ResponseWriter) error {
}
return nil
+ }
+
+ // stop processing if we get a cancellation signal
+ err = filepath.Walk("uploads", func(path string, info os.FileInfo, err error) error {
+ go func() { errChan <- walkFn(path, info, err) }()
+
+ select {
+ case <-ctx.Done():
+ if err := ctx.Err(); err != nil {
+ return err
+ }
+ case err := <-errChan:
+ if err != nil {
+ return err
+ }
+ }
+
+ return nil
})
if err != nil {
fmt.Println(err)