crowdsecurity/crowdsec · error

retryable status: %d

Error message

retryable status: %d

What it means

The retry transport converts a retryable HTTP status (429, 500, 503, 504) into this error and retries with backoff; it surfaces when all attempts returned such statuses. The status code is in the message.

Source

Thrown at pkg/apiclient/auth_retry.go:69

	attemptLeft := maxAttempts

	operation := func() (*http.Response, error) {
		clonedReq := cloneRequest(req)

		attemptLeft--

		resp, err := r.next.RoundTrip(clonedReq)
		if err != nil {
			if attemptLeft > 0 {
				log.Errorf("while performing request: %s; %d retries left", err, attemptLeft)
			}

			return nil, fmt.Errorf("retryable error: %w", err)
		}

		if r.shouldRetry(resp.StatusCode) {
			log.Errorf("request returned status %d: %s; %d retries left", resp.StatusCode, resp.Status, attemptLeft)
			return nil, fmt.Errorf("retryable status: %d", resp.StatusCode)
		}

		return resp, nil
	}

	resp, err := backoff.Retry(req.Context(), operation,
		backoff.WithBackOff(bo),
		backoff.WithMaxTries(maxAttempts),
	)
	if err != nil {
		return nil, err
	}

	return resp, nil
}

View on GitHub (pinned to 909b515798)

Solutions

  1. Check LAPI health/logs for the failing status (often 429 rate-limiting or 503 overload)
  2. Reduce request rate or increase backoff
  3. Retry after the server recovers
Defensive patterns

Strategy: retry

When it happens

Trigger: Thrown at pkg/apiclient/auth_retry.go:69 when the library encounters an invalid state.

Common situations: See trigger scenarios.


AI-assisted analysis of crowdsecurity/crowdsec@909b515798 (2026-09-06). Data as JSON: /api/errors/f7c908f3ab08b61f. Report an issue: GitHub.