From a185597129bf6956ba53597aa36a42509f7a92a0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lukas=20K=C3=A4mmerling?= Date: Mon, 19 Sep 2022 13:34:34 +0200 Subject: [PATCH] Stop automatic retrying on RateLimitExceeded MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit It does not make sense to retry when the rate limit is already exceeded. However, it makes sense to retry on Conflict. In the best case this would happen on the Caller/User side, but removing the retry completely would be a breaking change. Signed-off-by: Lukas Kämmerling --- hcloud/action_test.go | 6 +++--- hcloud/client.go | 6 +++--- hcloud/client_test.go | 6 +++--- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/hcloud/action_test.go b/hcloud/action_test.go index ffaf5ce8..28e32f73 100644 --- a/hcloud/action_test.go +++ b/hcloud/action_test.go @@ -183,11 +183,11 @@ func TestActionClientWatchProgress(t *testing.T) { }, }) case 2: - w.WriteHeader(http.StatusTooManyRequests) + w.WriteHeader(http.StatusConflict) _ = json.NewEncoder(w).Encode(schema.ErrorResponse{ Error: schema.Error{ - Code: string(ErrorCodeRateLimitExceeded), - Message: "ratelimited", + Code: string(ErrorCodeConflict), + Message: "conflict", }, }) return diff --git a/hcloud/client.go b/hcloud/client.go index 3e6a4428..792be9b5 100644 --- a/hcloud/client.go +++ b/hcloud/client.go @@ -270,7 +270,7 @@ func (c *Client) Do(r *http.Request, v interface{}) (*Response, error) { err = errorFromResponse(resp, body) if err == nil { err = fmt.Errorf("hcloud: server responded with status code %d", resp.StatusCode) - } else if isRetryable(err) { + } else if isConflict(err) { c.backoff(retries) retries++ continue @@ -289,12 +289,12 @@ func (c *Client) Do(r *http.Request, v interface{}) (*Response, error) { } } -func isRetryable(error error) bool { +func isConflict(error error) bool { err, ok := error.(Error) if !ok { return false } - return err.Code == ErrorCodeRateLimitExceeded || err.Code == ErrorCodeConflict + return err.Code == ErrorCodeConflict } func (c *Client) backoff(retries int) { diff --git a/hcloud/client_test.go b/hcloud/client_test.go index 7e2b3f22..919af418 100644 --- a/hcloud/client_test.go +++ b/hcloud/client_test.go @@ -262,11 +262,11 @@ func TestClientDo(t *testing.T) { w.Header().Set("Content-Type", "application/json") switch callCount { case 1: - w.WriteHeader(http.StatusTooManyRequests) + w.WriteHeader(http.StatusConflict) json.NewEncoder(w).Encode(schema.ErrorResponse{ Error: schema.Error{ - Code: string(ErrorCodeRateLimitExceeded), - Message: "ratelimited", + Code: string(ErrorCodeConflict), + Message: "conflict", }, }) case 2: