diff --git a/client/restarts.go b/client/restarts.go index 3f1b41acd..79aff54f3 100644 --- a/client/restarts.go +++ b/client/restarts.go @@ -26,6 +26,11 @@ type RestartTracker struct { } func (r *RestartTracker) NextRestart(exitCode int) (bool, time.Duration) { + // Hot path if no attempts are expected + if r.policy.Attempts == 0 { + return false, 0 + } + // Check if we have entered a new interval. end := r.startTime.Add(r.policy.Interval) now := time.Now() diff --git a/client/restarts_test.go b/client/restarts_test.go index 4c84193c5..719cbd088 100644 --- a/client/restarts_test.go +++ b/client/restarts_test.go @@ -77,5 +77,14 @@ func TestClient_RestartTracker_NoRestartOnSuccess(t *testing.T) { if shouldRestart, _ := rt.NextRestart(0); shouldRestart { t.Fatalf("NextRestart() returned %v, expected: %v", shouldRestart, false) } - +} + +func TestClient_RestartTracker_ZeroAttempts(t *testing.T) { + t.Parallel() + p := testPolicy(true, structs.RestartPolicyModeFail) + p.Attempts = 0 + rt := newRestartTracker(p) + if actual, when := rt.NextRestart(1); actual { + t.Fatalf("expect no restart, got restart/delay: %v", when) + } }