diff options
author | Erwin Ticzon <eticzongh@gmail.com> | 2017-04-21 22:48:08 +1000 |
---|---|---|
committer | Erwin Ticzon <eticzongh@gmail.com> | 2017-04-21 22:48:08 +1000 |
commit | 64f2a5bd9223826afe0869813385f6b925a13fb5 (patch) | |
tree | 89de4e310cc07b40d3bf8face14a638b92e6cbd2 /system/admin/upload/backup.go | |
parent | d014fa69c51be5fa880d8ee5ae0ddbf4b2f5fd81 (diff) |
add context cancellation to backup routines
Diffstat (limited to 'system/admin/upload/backup.go')
-rw-r--r-- | system/admin/upload/backup.go | 25 |
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) |