diff options
| author | Petter Rasmussen | 2016-02-07 22:44:57 +0100 |
|---|---|---|
| committer | Petter Rasmussen | 2016-02-07 22:44:57 +0100 |
| commit | b915aed4e6b8a4f2ef4a000af2d9af7978b1d991 (patch) | |
| tree | 613566bfae0f4b5a41a0340cdbfd66277f99ddc4 | |
| parent | 23919aa1adfc693b45a292c449418ee78d744df0 (diff) | |
| download | gdrive-b915aed4e6b8a4f2ef4a000af2d9af7978b1d991.tar.bz2 | |
Retry download file on backend error
| -rw-r--r-- | drive/sync_download.go | 20 |
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) } |
