diff --git a/internal/runner/benchmark.go b/internal/runner/benchmark.go index 1c9f115..a8d747a 100644 --- a/internal/runner/benchmark.go +++ b/internal/runner/benchmark.go @@ -929,11 +929,11 @@ func isRetriableHuggingFaceRowsStatus(statusCode int) bool { func huggingFaceRowsBackoff(attempt int, headers http.Header) time.Duration { if retryAfter := headers.Get("Retry-After"); retryAfter != "" { if seconds, err := strconv.Atoi(retryAfter); err == nil && seconds >= 0 { - return time.Duration(seconds) * time.Second + return min(time.Duration(seconds)*time.Second, 30*time.Second) } if retryAt, err := http.ParseTime(retryAfter); err == nil { if delay := time.Until(retryAt); delay > 0 { - return delay + return min(delay, 30*time.Second) } } } diff --git a/internal/runner/submission_test.go b/internal/runner/submission_test.go index 089e2d4..0c395f8 100644 --- a/internal/runner/submission_test.go +++ b/internal/runner/submission_test.go @@ -270,6 +270,19 @@ func TestHuggingFaceBenchmarkClientHonorsCancelDuringRetryBackoff(t *testing.T) } } +func TestHuggingFaceRowsBackoffCapsRetryAfter(t *testing.T) { + got := huggingFaceRowsBackoff(1, http.Header{"Retry-After": []string{"3600"}}) + if got != 30*time.Second { + t.Fatalf("Retry-After 3600 = %s, want 30s", got) + } + + future := time.Now().UTC().Add(2 * time.Hour).Format(http.TimeFormat) + got = huggingFaceRowsBackoff(1, http.Header{"Retry-After": []string{future}}) + if got != 30*time.Second { + t.Fatalf("Retry-After HTTP-date %q = %s, want 30s", future, got) + } +} + func withHuggingFaceRowsRetryDelay(t *testing.T, delay time.Duration) { t.Helper() previous := huggingFaceRowsRetryDelay