diff options
Diffstat (limited to 'drive')
| -rw-r--r-- | drive/errors.go | 15 | ||||
| -rw-r--r-- | drive/sync_download.go | 4 | ||||
| -rw-r--r-- | drive/sync_upload.go | 8 |
3 files changed, 20 insertions, 7 deletions
diff --git a/drive/errors.go b/drive/errors.go index 465d818..f70f0f0 100644 --- a/drive/errors.go +++ b/drive/errors.go @@ -6,7 +6,11 @@ import ( "time" ) -const MaxBackendErrorRetries = 5 +const MaxErrorRetries = 5 + +func isBackendOrRateLimitError(err error) bool { + return isBackendError(err) || isRateLimitError(err) +} func isBackendError(err error) bool { if err == nil { @@ -17,6 +21,15 @@ func isBackendError(err error) bool { return ok && ae.Code >= 500 && ae.Code <= 599 } +func isRateLimitError(err error) bool { + if err == nil { + return false + } + + ae, ok := err.(*googleapi.Error) + return ok && ae.Code == 403 +} + func isTimeoutError(err error) bool { return err == context.Canceled } diff --git a/drive/sync_download.go b/drive/sync_download.go index 10dfd16..58cd49c 100644 --- a/drive/sync_download.go +++ b/drive/sync_download.go @@ -193,7 +193,7 @@ func (self *Drive) downloadRemoteFile(id, fpath string, args DownloadSyncArgs, t res, err := self.service.Files.Get(id).Context(ctx).Download() if err != nil { - if isBackendError(err) && try < MaxBackendErrorRetries { + if isBackendOrRateLimitError(err) && try < MaxErrorRetries { exponentialBackoffSleep(try) try++ return self.downloadRemoteFile(id, fpath, args, try) @@ -231,7 +231,7 @@ func (self *Drive) downloadRemoteFile(id, fpath string, args DownloadSyncArgs, t _, err = io.Copy(outFile, reader) if err != nil { outFile.Close() - if try < MaxBackendErrorRetries { + if try < MaxErrorRetries { exponentialBackoffSleep(try) try++ return self.downloadRemoteFile(id, fpath, args, try) diff --git a/drive/sync_upload.go b/drive/sync_upload.go index bb1ab33..261497d 100644 --- a/drive/sync_upload.go +++ b/drive/sync_upload.go @@ -270,7 +270,7 @@ func (self *Drive) createMissingRemoteDir(args createMissingRemoteDirArgs) (*dri f, err := self.service.Files.Create(dstFile).Do() if err != nil { - if isBackendError(err) && args.try < MaxBackendErrorRetries { + if isBackendOrRateLimitError(err) && args.try < MaxErrorRetries { exponentialBackoffSleep(args.try) args.try++ return self.createMissingRemoteDir(args) @@ -313,7 +313,7 @@ func (self *Drive) uploadMissingFile(parentId string, lf *LocalFile, args Upload _, err = self.service.Files.Create(dstFile).Fields("id", "name", "size", "md5Checksum").Context(ctx).Media(reader, chunkSize).Do() if err != nil { - if isBackendError(err) && try < MaxBackendErrorRetries { + if isBackendOrRateLimitError(err) && try < MaxErrorRetries { exponentialBackoffSleep(try) try++ return self.uploadMissingFile(parentId, lf, args, try) @@ -354,7 +354,7 @@ func (self *Drive) updateChangedFile(cf *changedFile, args UploadSyncArgs, try i _, err = self.service.Files.Update(cf.remote.file.Id, dstFile).Context(ctx).Media(reader, chunkSize).Do() if err != nil { - if isBackendError(err) && try < MaxBackendErrorRetries { + if isBackendOrRateLimitError(err) && try < MaxErrorRetries { exponentialBackoffSleep(try) try++ return self.updateChangedFile(cf, args, try) @@ -375,7 +375,7 @@ func (self *Drive) deleteRemoteFile(rf *RemoteFile, args UploadSyncArgs, try int err := self.service.Files.Delete(rf.file.Id).Do() if err != nil { - if isBackendError(err) && try < MaxBackendErrorRetries { + if isBackendOrRateLimitError(err) && try < MaxErrorRetries { exponentialBackoffSleep(try) try++ return self.deleteRemoteFile(rf, args, try) |
