From c851d4dec5b347f2993dc211fc499e7784cb9833 Mon Sep 17 00:00:00 2001 From: Nick Craig-Wood Date: Tue, 14 Jul 2026 14:29:03 +0100 Subject: [PATCH] vfs: fix vfs cache writeback timer not being stopped when --transfers reached When processItems filled the last free transfer slot it checked the next queued item's expiry before the transfer limit, so if that expiry was still fractionally in the future the timer was reset instead of stopped. This caused intermittent failures in TestWriteBackMaxQueue which asserts the timer is stopped once --transfers uploads are in progress. Check the transfer limit first so the timer is always stopped when the transfer limit is reached. The timer is restarted when an upload finishes so nothing stalls. Also fix a typo in TestWriteBackMaxQueue which named every queued item "number1". --- vfs/vfscache/writeback/writeback.go | 9 +++++++-- vfs/vfscache/writeback/writeback_test.go | 4 ++-- 2 files changed, 9 insertions(+), 4 deletions(-) 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()