diff --git a/vfs/vfscache/writeback/writeback.go b/vfs/vfscache/writeback/writeback.go index 255154171..76acbb446 100644 --- a/vfs/vfscache/writeback/writeback.go +++ b/vfs/vfscache/writeback/writeback.go @@ -433,13 +433,18 @@ func (wb *WriteBack) processItems(ctx context.Context) { } resetTimer := true - for wbItem := wb._peekItem(); wbItem != nil && time.Until(wbItem.expiry) <= 0; wbItem = wb._peekItem() { - // If reached transfer limit don't restart the timer + for wbItem := wb._peekItem(); wbItem != nil; wbItem = wb._peekItem() { + // If reached transfer limit stop the timer - it will be + // restarted when an upload finishes if wb.uploads >= fs.GetConfig(wb.ctx).Transfers { fs.Debugf(wbItem.name, "vfs cache: delaying writeback as --transfers exceeded") resetTimer = false break } + // Stop if the next item hasn't expired yet + if time.Until(wbItem.expiry) > 0 { + break + } // Pop the item, mark as uploading and start the uploader wbItem = wb._popItem() //fs.Debugf(wbItem.name, "uploading = true %p item %p", wbItem, wbItem.item) diff --git a/vfs/vfscache/writeback/writeback_test.go b/vfs/vfscache/writeback/writeback_test.go index 87c067627..8122ae2da 100644 --- a/vfs/vfscache/writeback/writeback_test.go +++ b/vfs/vfscache/writeback/writeback_test.go @@ -601,10 +601,10 @@ func TestWriteBackMaxQueue(t *testing.T) { // put toTransfer things in the queue pis := []*putItem{} - for range toTransfer { + for i := range toTransfer { pi := newPutItem(t) pis = append(pis, pi) - wb.Add(0, fmt.Sprintf("number%d", 1), 10, true, pi.put) + wb.Add(0, fmt.Sprintf("number%d", i), 10, true, pi.put) } inProgress, queued := wb.Stats()