From c446ea309bd885dd688edb3cac8aa74a5f8a939a Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Mon, 2 Nov 2026 05:13:58 -0800 Subject: [PATCH] filer: retry deletes a low-disk replica could not record A low-disk volume now counts as deletable, but appending the tombstone can still fail with no space left on device. Treat that as retryable so the deletion stays queued instead of being dropped after the other replicas applied it. Co-Authored-By: Claude Opus 5.5 --- weed/filer/filer_deletion.go | 1 + weed/filer/filer_deletion_test.go | 2 ++ 2 files changed, 3 insertions(+) diff --git a/weed/filer/filer_deletion.go b/weed/filer/filer_deletion.go index 1ee66eba97..a44938404f 100644 --- a/weed/filer/filer_deletion.go +++ b/weed/filer/filer_deletion.go @@ -64,6 +64,7 @@ var retryablePatterns = []string{ "too many requests", // Rate limiting / backpressure "try again", // Explicit retry suggestion "replication copy count", // A replica is offline; deletes wait for it to return + "no space left on device", // A low-disk replica could not append the tombstone yet } // DeletionRetryItem represents a file deletion that failed and needs to be retried diff --git a/weed/filer/filer_deletion_test.go b/weed/filer/filer_deletion_test.go index 3f1b921aea..dcf1a0edc9 100644 --- a/weed/filer/filer_deletion_test.go +++ b/weed/filer/filer_deletion_test.go @@ -185,6 +185,8 @@ func TestIsRetryableError(t *testing.T) { {"i/o timeout", true, "I/O timeout"}, {"broken pipe", true, "broken pipe"}, {"replication locations [1] is less than volume 9 replication copy count [2]", true, "replica offline"}, + {"write /data/9.dat: no space left on device", true, "disk full"}, + {"No space left on device (os error 28)", true, "disk full (rust)"}, {"not found", false, "not found (not retryable)"}, {"invalid file id", false, "invalid input (not retryable)"}, {"", false, "empty error"},