From 2e231a6f29c8411d62c4cf79c17cd5ff54a6e491 Mon Sep 17 00:00:00 2001 From: Michael Mendy Date: Mon, 25 May 2026 08:27:42 -0700 Subject: [PATCH] Retry logic to treat no space errors permanently Handle local disk space errors as permanent errors in retry logic. --- internal/backend/retry/backend_retry.go | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/internal/backend/retry/backend_retry.go b/internal/backend/retry/backend_retry.go index 9fb2e2463..80e1a5892 100644 --- a/internal/backend/retry/backend_retry.go +++ b/internal/backend/retry/backend_retry.go @@ -107,7 +107,6 @@ func (be *Backend) retry(ctx context.Context, msg string, f func() error) error bo := backoff.NewExponentialBackOff() bo.MaxElapsedTime = be.MaxElapsedTime - if feature.Flag.Enabled(feature.BackendErrorRedesign) { bo.InitialInterval = 1 * time.Second bo.Multiplier = 2 @@ -135,14 +134,25 @@ func (be *Backend) retry(ctx context.Context, msg string, f func() error) error err := retryNotifyErrorWithSuccess( func() error { err := f() + + // Running out of local disk space is not a transient backend + // failure. For example, `restic check` can fail while writing to a + // temporary cache directory. Retrying only repeats the same local + // disk-space error. + if isNoSpaceError(err) { + return backoff.Permanent(err) + } + // don't retry permanent errors as those very likely cannot be fixed by retrying // TODO remove IsNotExist(err) special cases when removing the feature flag if feature.Flag.Enabled(feature.BackendErrorRedesign) && !errors.Is(err, &backoff.PermanentError{}) && be.Backend.IsPermanentError(err) { permanentErrorAttempts-- } + if permanentErrorAttempts <= 0 { return backoff.Permanent(err) } + return err }, backoff.WithContext(b, ctx),