Skip to content

Commit eeb58d7

Browse files
committed
✨ feat: add maximum delay settings for backoff
1 parent 2452a1d commit eeb58d7

File tree

6 files changed

+23
-5
lines changed

6 files changed

+23
-5
lines changed

README.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ $ export OSC_REGION=<REGION> (default: eu-west-2)
4646
$ export OSC_MAX_RETRIES=<INT> (default: 3)
4747
$ export OSC_RETRY_BACKOFF_FACTOR=<FLOAT> (default: 1.0)
4848
$ export OSC_RETRY_BACKOFF_JITTER=<FLOAT> (default: 3.0)
49+
$ export OSC_RETRY_BACKOFF_MAX=<FLOAT> (default: 30)
4950
```
5051

5152
## Credentials files
@@ -94,12 +95,13 @@ These options are:
9495
- max_retries (integer, default 3)
9596
- retry_backoff_factor (float, default 1.0)
9697
- retry_backoff_jitter (float, default 3.0)
98+
- retry_backoff_max (float, default 30)
9799

98100
Those options correspond to their counterparts in [urllib3](https://urllib3.readthedocs.io/en/stable/reference/urllib3.util.html#urllib3.util.Retry)
99101

100102
Example:
101103
```python
102-
gw = Gateway(max_retries=5, retry_backoff_factor=0.5, retry_backoff_jitter=1.0)
104+
gw = Gateway(max_retries=5, retry_backoff_factor=0.5, retry_backoff_jitter=1.0, retry_backoff_max=120)
103105
````
104106

105107
# Example

osc_sdk_python/authentication.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ def forge_headers_signed(self, uri, request_data):
4848
def build_dates(self):
4949
'''Return YYYYMMDDTHHmmssZ, YYYYMMDD
5050
'''
51-
t = datetime.datetime.utcnow()
51+
t = datetime.datetime.now(datetime.timezone.utc)
5252
return t.strftime('%Y%m%dT%H%M%SZ'), t.strftime('%Y%m%d')
5353

5454
def sign(self, key, msg):

osc_sdk_python/call.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,8 @@ def __init__(self, logger=None, **kwargs):
2626
x509_client_cert=kwargs.pop("x509_client_cert", None),
2727
max_retries=kwargs.pop("max_retries", None),
2828
retry_backoff_factor=kwargs.pop("retry_backoff_factor", None),
29-
retry_backoff_jitter=kwargs.pop("retry_backoff_jitter", None)
29+
retry_backoff_jitter=kwargs.pop("retry_backoff_jitter", None),
30+
retry_backoff_max=kwargs.pop("retry_backoff_max", None)
3031
)
3132

3233
def update_credentials(
@@ -42,6 +43,7 @@ def update_credentials(
4243
max_retries=None,
4344
retry_backoff_factor=None,
4445
retry_backoff_jitter=None,
46+
retry_backoff_max=None,
4547
):
4648
self.credentials = {
4749
"access_key": access_key,
@@ -54,6 +56,7 @@ def update_credentials(
5456
"max_retries": max_retries,
5557
"retry_backoff_factor": retry_backoff_factor,
5658
"retry_backoff_jitter": retry_backoff_jitter,
59+
"retry_backoff_max": retry_backoff_max,
5760
}
5861

5962
def api(self, action, **data):
@@ -81,6 +84,7 @@ def api(self, action, **data):
8184
credentials.max_retries,
8285
credentials.retry_backoff_factor,
8386
credentials.retry_backoff_jitter,
87+
credentials.retry_backoff_max,
8488
)
8589
if self.logger != None:
8690
self.logger.do_log(

osc_sdk_python/credentials.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
MAX_RETRIES = 3
99
RETRY_BACKOFF_FACTOR = 1
1010
RETRY_BACKOFF_JITTER = 3
11+
RETRY_BACKOFF_MAX = 30
1112

1213

1314
class Credentials:
@@ -24,6 +25,7 @@ def __init__(
2425
max_retries=None,
2526
retry_backoff_factor=None,
2627
retry_backoff_jitter=None,
28+
retry_backoff_max=None,
2729
):
2830
self.region = None
2931
self.access_key = access_key
@@ -35,6 +37,7 @@ def __init__(
3537
self.max_retries = max_retries
3638
self.retry_backoff_factor = retry_backoff_factor
3739
self.retry_backoff_jitter = retry_backoff_jitter
40+
self.retry_backoff_max = retry_backoff_max
3841

3942
if profile is None:
4043
profile = os.environ.get("OSC_PROFILE")
@@ -70,6 +73,8 @@ def __init__(
7073
self.retry_backoff_factor = RETRY_BACKOFF_FACTOR
7174
if self.retry_backoff_jitter is None:
7275
self.retry_backoff_jitter = RETRY_BACKOFF_JITTER
76+
if self.retry_backoff_max is None:
77+
self.retry_backoff_max = RETRY_BACKOFF_MAX
7378

7479
self.check_options()
7580

@@ -106,6 +111,10 @@ def load_credentials_from_file(self, profile, file_path):
106111
if retry_backoff_jitter is not None:
107112
self.retry_backoff_jitter = retry_backoff_jitter
108113

114+
retry_backoff_max = profile.get("retry_backoff_max")
115+
if retry_backoff_max is not None:
116+
self.retry_backoff_max = retry_backoff_max
117+
109118
except IOError:
110119
pass
111120

@@ -128,6 +137,9 @@ def load_credentials_from_env(self):
128137
retry_backoff_jitter = os.environ.get("OSC_RETRY_BACKOFF_JITTER")
129138
if retry_backoff_jitter is not None:
130139
self.retry_backoff_factor = float(retry_backoff_jitter)
140+
retry_backoff_max = os.environ.get("OSC_RETRY_BACKOFF_MAX")
141+
if retry_backoff_max is not None:
142+
self.retry_backoff_factor = float(retry_backoff_max)
131143

132144
def check_options(self):
133145
if self.access_key is not None or self.secret_key is not None:

osc_sdk_python/outscale_gateway.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import os
22
import sys
3-
import threading
43
from .call import Call
54
from .credentials import Credentials
65
import ruamel.yaml

osc_sdk_python/requester.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
from requests import Session, HTTPError
2-
from requests import Session
32
from requests.adapters import HTTPAdapter
43
from requests.exceptions import JSONDecodeError
54
from urllib3.util.retry import Retry
@@ -16,6 +15,7 @@ def __init__(
1615
max_retries=0,
1716
backoff_factor=0,
1817
backoff_jitter=0,
18+
backoff_max=120,
1919
status_forcelist=HTTP_CODE_RETRY,
2020
allowed_methods=METHODS_RETRY,
2121
):
@@ -26,6 +26,7 @@ def __init__(
2626
total=max_retries,
2727
backoff_factor=backoff_factor,
2828
backoff_jitter=backoff_jitter,
29+
backoff_max=backoff_max,
2930
status_forcelist=status_forcelist,
3031
allowed_methods=allowed_methods,
3132
)

0 commit comments

Comments
 (0)