aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPetter Rasmussen2016-02-07 22:44:57 +0100
committerPetter Rasmussen2016-02-07 22:44:57 +0100
commitb915aed4e6b8a4f2ef4a000af2d9af7978b1d991 (patch)
tree613566bfae0f4b5a41a0340cdbfd66277f99ddc4
parent23919aa1adfc693b45a292c449418ee78d744df0 (diff)
downloadgdrive-b915aed4e6b8a4f2ef4a000af2d9af7978b1d991.tar.bz2
Retry download file on backend error
-rw-r--r--drive/sync_download.go20
1 files changed, 15 insertions, 5 deletions
diff --git a/drive/sync_download.go b/drive/sync_download.go
index f18cb18..10a8d18 100644
--- a/drive/sync_download.go
+++ b/drive/sync_download.go
@@ -137,7 +137,7 @@ func (self *Drive) downloadMissingFiles(files *syncFiles, args DownloadSyncArgs)
continue
}
- err = self.downloadRemoteFile(rf.file.Id, localPath, args)
+ err = self.downloadRemoteFile(rf.file.Id, localPath, args, 0)
if err != nil {
return err
}
@@ -166,7 +166,7 @@ func (self *Drive) downloadChangedFiles(files *syncFiles, args DownloadSyncArgs)
continue
}
- err = self.downloadRemoteFile(cf.remote.file.Id, localPath, args)
+ err = self.downloadRemoteFile(cf.remote.file.Id, localPath, args, 0)
if err != nil {
return err
}
@@ -175,10 +175,16 @@ func (self *Drive) downloadChangedFiles(files *syncFiles, args DownloadSyncArgs)
return nil
}
-func (self *Drive) downloadRemoteFile(id, fpath string, args DownloadSyncArgs) error {
+func (self *Drive) downloadRemoteFile(id, fpath string, args DownloadSyncArgs, try int) error {
res, err := self.service.Files.Get(id).Download()
if err != nil {
- return fmt.Errorf("Failed to download file: %s", err)
+ if isBackendError(err) && try < MaxBackendErrorRetries {
+ exponentialBackoffSleep(try)
+ try++
+ self.downloadRemoteFile(id, fpath, args, try)
+ } else {
+ return fmt.Errorf("Failed to download file: %s", err)
+ }
}
// Close body on function exit
@@ -203,7 +209,11 @@ func (self *Drive) downloadRemoteFile(id, fpath string, args DownloadSyncArgs) e
// Save file to disk
_, err = io.Copy(outFile, srcReader)
- if err != nil {
+ if err != nil && try < MaxBackendErrorRetries {
+ exponentialBackoffSleep(try)
+ try++
+ self.downloadRemoteFile(id, fpath, args, try)
+ } else {
return fmt.Errorf("Download was interrupted: %s", err)
}