From 6a6501691a26e085d88ab480afedf6f699bdd77a Mon Sep 17 00:00:00 2001 From: mmetc <92726601+mmetc@users.noreply.github.com> Date: Wed, 16 Aug 2023 21:04:07 +0200 Subject: [PATCH] change behavior of flag disable_http_retry_backoff (#2426) now it does not attempt any retry, instead of attempting all retries immediately example: cannot reach LAPI Before: $ CROWDSEC_FEATURE_DISABLE_HTTP_RETRY_BACKOFF=true cscli decisions list ERRO[27-07-2023 10:44:44] error while performing request: dial tcp [::1]:8080: connect: connection refused; 4 retries left INFO[27-07-2023 10:44:44] retrying in 0 seconds (attempt 2 of 5) [...] ERRO[27-07-2023 10:44:44] error while performing request: dial tcp [::1]:8080: connect: connection refused; 1 retries left INFO[27-07-2023 10:44:44] retrying in 0 seconds (attempt 5 of 5) ERRO[27-07-2023 10:44:44] error while performing request: dial tcp [::1]:8080: connect: connection refused; 0 retries left FATA[27-07-2023 10:44:44] Unable to list decisions : performing request: Get "http://localhost:8080/v1/alerts?has_active_decision=true&include_capi=false&limit=100": could not get jwt token: Post "http://localhost:8080/v1/watchers/login": dial tcp [::1]:8080: connect: connection refused After: $ CROWDSEC_FEATURE_DISABLE_HTTP_RETRY_BACKOFF=true ./test/local/bin/cscli decisions list FATA[11-08-2023 16:49:58] unable to retrieve decisions: performing request: Get "http://127.0.0.1:8080/v1/alerts?has_active_decision=true&include_capi=false&limit=100": could not get jwt token: Post "http://127.0.0.1:8080/v1/watchers/login": dial tcp 127.0.0.1:8080: connect: connection refused --- pkg/apiclient/auth.go | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/pkg/apiclient/auth.go b/pkg/apiclient/auth.go index 84df74456..96230b910 100644 --- a/pkg/apiclient/auth.go +++ b/pkg/apiclient/auth.go @@ -96,10 +96,16 @@ func (r retryRoundTripper) ShouldRetry(statusCode int) bool { func (r retryRoundTripper) RoundTrip(req *http.Request) (*http.Response, error) { var resp *http.Response var err error + backoff := 0 - for i := 0; i < r.maxAttempts; i++ { + maxAttempts := r.maxAttempts + if fflag.DisableHttpRetryBackoff.IsEnabled() { + maxAttempts = 1 + } + + for i := 0; i < maxAttempts; i++ { if i > 0 { - if r.withBackOff && !fflag.DisableHttpRetryBackoff.IsEnabled() { + if r.withBackOff { backoff += 10 + rand.Intn(20) } log.Infof("retrying in %d seconds (attempt %d of %d)", backoff, i+1, r.maxAttempts) @@ -115,7 +121,10 @@ func (r retryRoundTripper) RoundTrip(req *http.Request) (*http.Response, error) clonedReq := cloneRequest(req) resp, err = r.next.RoundTrip(clonedReq) if err != nil { - log.Errorf("error while performing request: %s; %d retries left", err, r.maxAttempts-i-1) + left := maxAttempts - i - 1 + if left > 0 { + log.Errorf("error while performing request: %s; %d retries left", err, left) + } continue } if !r.ShouldRetry(resp.StatusCode) { @@ -264,7 +273,9 @@ func (t *JWTTransport) RoundTrip(req *http.Request) (*http.Response, error) { return resp, fmt.Errorf("performing jwt auth: %w", err) } - log.Debugf("resp-jwt: %d", resp.StatusCode) + if resp != nil { + log.Debugf("resp-jwt: %d", resp.StatusCode) + } return resp, nil }