aboutsummaryrefslogtreecommitdiffstats
path: root/drive/sync_upload.go
diff options
context:
space:
mode:
Diffstat (limited to 'drive/sync_upload.go')
-rw-r--r--drive/sync_upload.go17
1 files changed, 11 insertions, 6 deletions
diff --git a/drive/sync_upload.go b/drive/sync_upload.go
index 0d5c208..261497d 100644
--- a/drive/sync_upload.go
+++ b/drive/sync_upload.go
@@ -20,6 +20,7 @@ type UploadSyncArgs struct {
DryRun bool
DeleteExtraneous bool
ChunkSize int64
+ Timeout time.Duration
Resolution ConflictResolution
Comparer FileComparer
}
@@ -269,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)
@@ -308,14 +309,16 @@ func (self *Drive) uploadMissingFile(parentId string, lf *LocalFile, args Upload
progressReader := getProgressReader(srcFile, args.Progress, lf.info.Size())
// Wrap reader in timeout reader
- reader, ctx := getTimeoutReaderContext(progressReader)
+ reader, ctx := getTimeoutReaderContext(progressReader, args.Timeout)
_, 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)
+ } else if isTimeoutError(err) {
+ return fmt.Errorf("Failed to upload file: timeout, no data was transferred for %v", args.Timeout)
} else {
return fmt.Errorf("Failed to upload file: %s", err)
}
@@ -347,14 +350,16 @@ func (self *Drive) updateChangedFile(cf *changedFile, args UploadSyncArgs, try i
progressReader := getProgressReader(srcFile, args.Progress, cf.local.info.Size())
// Wrap reader in timeout reader
- reader, ctx := getTimeoutReaderContext(progressReader)
+ reader, ctx := getTimeoutReaderContext(progressReader, args.Timeout)
_, 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)
+ } else if isTimeoutError(err) {
+ return fmt.Errorf("Failed to upload file: timeout, no data was transferred for %v", args.Timeout)
} else {
return fmt.Errorf("Failed to update file: %s", err)
}
@@ -370,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)