Explorar o código

lib/model: Missing queue.Done and reset between pulls (fixes #5332) (#5626)

Simon Frei %!s(int64=6) %!d(string=hai) anos
pai
achega
8d1eff7e41
Modificáronse 2 ficheiros con 11 adicións e 0 borrados
  1. 4 0
      lib/model/folder_sendrecv.go
  2. 7 0
      lib/model/queue.go

+ 4 - 0
lib/model/folder_sendrecv.go

@@ -291,6 +291,8 @@ func (f *sendReceiveFolder) pullerIteration(scanChan chan<- string) int {
 }
 
 func (f *sendReceiveFolder) processNeeded(dbUpdateChan chan<- dbUpdateJob, copyChan chan<- copyBlocksState, scanChan chan<- string) (int, map[string]protocol.FileInfo, []protocol.FileInfo, error) {
+	defer f.queue.Reset()
+
 	changed := 0
 	var dirDeletions []protocol.FileInfo
 	fileDeletions := map[string]protocol.FileInfo{}
@@ -464,6 +466,7 @@ nextFile:
 				// Remove the pending deletion (as we performed it by renaming)
 				delete(fileDeletions, candidate.Name)
 
+				changed++
 				f.queue.Done(fileName)
 				continue nextFile
 			}
@@ -479,6 +482,7 @@ nextFile:
 			}
 		}
 		f.newPullError(fileName, errNotAvailable)
+		f.queue.Done(fileName)
 	}
 
 	return changed, fileDeletions, dirDeletions, nil

+ 7 - 0
lib/model/queue.go

@@ -110,6 +110,13 @@ func (q *jobQueue) Shuffle() {
 	}
 }
 
+func (q *jobQueue) Reset() {
+	q.mut.Lock()
+	defer q.mut.Unlock()
+	q.progress = nil
+	q.queued = nil
+}
+
 func (q *jobQueue) lenQueued() int {
 	q.mut.Lock()
 	defer q.mut.Unlock()