1
0
mirror of https://github.com/gilbertchen/duplicacy synced 2025-12-15 07:43:21 +00:00

Use multiple threads to list the chunks directory for Google Drive

This commit is contained in:
Gilbert Chen
2020-06-15 12:49:13 -04:00
parent 5d45999077
commit 153f6a2d20

View File

@@ -86,6 +86,10 @@ func (storage *GCDStorage) shouldRetry(threadIndex int, err error) (bool, error)
// Request timeout // Request timeout
message = e.Message message = e.Message
retry = true retry = true
} else if e.Code == 400 && strings.Contains(e.Message, "failedPrecondition") {
// Daily quota exceeded
message = e.Message
retry = true
} else if e.Code == 401 { } else if e.Code == 401 {
// Only retry on authorization error when storage has been connected before // Only retry on authorization error when storage has been connected before
if storage.isConnected { if storage.isConnected {
@@ -476,20 +480,36 @@ func (storage *GCDStorage) ListFiles(threadIndex int, dir string) ([]string, []i
} }
return files, nil, nil return files, nil, nil
} else { } else {
files := []string{} lock := sync.Mutex {}
sizes := []int64{} allFiles := []string{}
allSizes := []int64{}
errorChannel := make(chan error)
directoryChannel := make(chan string)
activeWorkers := 0
parents := []string{"chunks", "fossils"} parents := []string{"chunks", "fossils"}
for i := 0; i < len(parents); i++ { for len(parents) > 0 || activeWorkers > 0 {
parent := parents[i]
if len(parents) > 0 && activeWorkers < storage.numberOfThreads {
parent := parents[0]
parents = parents[1:]
activeWorkers++
go func(parent string) {
pathID, ok := storage.findPathID(parent) pathID, ok := storage.findPathID(parent)
if !ok { if !ok {
continue return
} }
entries, err := storage.listFiles(threadIndex, pathID, true, true) entries, err := storage.listFiles(threadIndex, pathID, true, true)
if err != nil { if err != nil {
return nil, nil, err errorChannel <- err
return
} }
LOG_DEBUG("GCD_STORAGE", "Listing %s; %d items returned", parent, len(entries))
files := []string {}
sizes := []int64 {}
for _, entry := range entries { for _, entry := range entries {
if entry.MimeType != GCDDirectoryMimeType { if entry.MimeType != GCDDirectoryMimeType {
name := entry.Name name := entry.Name
@@ -503,12 +523,33 @@ func (storage *GCDStorage) ListFiles(threadIndex int, dir string) ([]string, []i
files = append(files, name) files = append(files, name)
sizes = append(sizes, entry.Size) sizes = append(sizes, entry.Size)
} else { } else {
parents = append(parents, parent+"/"+entry.Name) directoryChannel <- parent+"/"+entry.Name
storage.savePathID(parent+"/"+entry.Name, entry.Id) storage.savePathID(parent+"/"+entry.Name, entry.Id)
} }
} }
lock.Lock()
allFiles = append(allFiles, files...)
allSizes = append(allSizes, sizes...)
lock.Unlock()
directoryChannel <- ""
} (parent)
} }
return files, sizes, nil
if activeWorkers > 0 {
select {
case err := <- errorChannel:
return nil, nil, err
case directory := <- directoryChannel:
if directory == "" {
activeWorkers--
} else {
parents = append(parents, directory)
}
}
}
}
return allFiles, allSizes, nil
} }
} }