diff options
| author | Petter Rasmussen | 2016-04-09 18:54:10 +0200 | 
|---|---|---|
| committer | Petter Rasmussen | 2016-04-09 18:54:10 +0200 | 
| commit | bdd7877be9c503e7968c221f3396d239edb267d2 (patch) | |
| tree | 63f05b7d803573228317ba0290880ad930c4fdf8 | |
| parent | 17b8c6511f776bb37ce31f8f64f7cc2f1a3640fb (diff) | |
| download | gdrive-bdd7877be9c503e7968c221f3396d239edb267d2.tar.bz2 | |
Check both backend and rate limit errors
| -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) | 
