aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPetter Rasmussen2016-04-09 18:54:10 +0200
committerPetter Rasmussen2016-04-09 18:54:10 +0200
commitbdd7877be9c503e7968c221f3396d239edb267d2 (patch)
tree63f05b7d803573228317ba0290880ad930c4fdf8
parent17b8c6511f776bb37ce31f8f64f7cc2f1a3640fb (diff)
downloadgdrive-bdd7877be9c503e7968c221f3396d239edb267d2.tar.bz2
Check both backend and rate limit errors
-rw-r--r--drive/errors.go15
-rw-r--r--drive/sync_download.go4
-rw-r--r--drive/sync_upload.go8
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)