From 68d7c74013e34a9a8660214c4723bdc6117e30d5 Mon Sep 17 00:00:00 2001 From: Lena Garber <114949949+lgarber-akamai@users.noreply.github.com> Date: Thu, 1 Jun 2023 17:11:21 -0400 Subject: [PATCH] fix: Resolve issues with retry system implementation (#291) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## 📝 Description This change resolves a few issues with the new HTTPAdapter-based retry system: - `retry_rate_limit_interval` does no longer explicitly require a float. - Retry statuses are now respected on update. - Retries are now enabled on `POST` requests. ## ✔️ How to Test ``` pytest test ``` --- linode_api4/linode_client.py | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/linode_api4/linode_client.py b/linode_api4/linode_client.py index a067a1755..85ffa8718 100644 --- a/linode_api4/linode_client.py +++ b/linode_api4/linode_client.py @@ -69,7 +69,7 @@ def __init__( :type retry: bool :param retry_rate_limit_interval: The amount of time to wait between HTTP request retries. - :type retry_rate_limit_interval: float + :type retry_rate_limit_interval: Union[float, int] :param retry_max: The number of request retries that should be attempted before raising an API error. :type retry_max: int @@ -88,28 +88,27 @@ def __init__( if retry_statuses is not None: retry_forcelist.extend(retry_statuses) - # make sure we got a sane backoff - if not isinstance(retry_rate_limit_interval, float): - raise ValueError("retry_rate_limit_interval must be a float") - # Ensure the max retries value is valid if not isinstance(retry_max, int): raise ValueError("retry_max must be an int") self.retry = retry - self.retry_rate_limit_interval = retry_rate_limit_interval + self.retry_rate_limit_interval = float(retry_rate_limit_interval) self.retry_max = retry_max - self.retry_statuses = retry_statuses + self.retry_statuses = retry_forcelist # Initialize the HTTP client session self.session = requests.Session() self._retry_config = LinearRetry( total=retry_max if retry else 0, - status_forcelist=retry_forcelist, + status_forcelist=self.retry_statuses, respect_retry_after_header=True, - backoff_factor=retry_rate_limit_interval, + backoff_factor=self.retry_rate_limit_interval, raise_on_status=False, + # By default, POST is not an allowed method. + # We should explicitly include it. + allowed_methods={"DELETE", "GET", "POST", "PUT"}, ) retry_adapter = HTTPAdapter(max_retries=self._retry_config)