Skip to content

Commit 1fb386b

Browse files
committed
DRAFT feat: allow setting or unsetting the boto retry configuration
DRAFT
1 parent f0bc917 commit 1fb386b

File tree

2 files changed

+19
-5
lines changed

2 files changed

+19
-5
lines changed

pynamodb/connection/base.py

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
import logging
55
import uuid
66
from threading import local
7-
from typing import Any, Dict, List, Mapping, Optional, Sequence, cast
7+
from typing import Any, Dict, List, Mapping, Optional, Sequence, Union, cast, Literal
88

99
import botocore.client
1010
import botocore.exceptions
@@ -247,6 +247,7 @@ def __init__(self,
247247
read_timeout_seconds: Optional[float] = None,
248248
connect_timeout_seconds: Optional[float] = None,
249249
max_retry_attempts: Optional[int] = None,
250+
retry_configuration: Optional[Union[Literal["LEGACY"], dict]] = None,
250251
max_pool_connections: Optional[int] = None,
251252
extra_headers: Optional[Mapping[str, str]] = None,
252253
aws_access_key_id: Optional[str] = None,
@@ -277,6 +278,11 @@ def __init__(self,
277278
else:
278279
self._max_retry_attempts_exception = get_settings_value('max_retry_attempts')
279280

281+
if retry_configuration is not None:
282+
self._retry_configuration = retry_configuration
283+
else:
284+
self._retry_configuration = get_settings_value('retry_configuration')
285+
280286
if max_pool_connections is not None:
281287
self._max_pool_connections = max_pool_connections
282288
else:
@@ -399,15 +405,22 @@ def client(self) -> BotocoreBaseClientPrivate:
399405
# if the client does not have credentials, we create a new client
400406
# otherwise the client is permanently poisoned in the case of metadata service flakiness when using IAM roles
401407
if not self._client or (self._client._request_signer and not self._client._request_signer._credentials):
408+
# Check if we are using the "LEGACY" retry mode to keep previous PynamoDB
409+
# retry behavior, or if we are using the new retry configuration settings.
410+
if self._retry_configuration != "LEGACY":
411+
retries = self._retry_configuration
412+
else:
413+
retries = {
414+
'total_max_attempts': 1 + self._max_retry_attempts_exception,
415+
'mode': 'standard',
416+
}
417+
402418
config = botocore.client.Config(
403419
parameter_validation=False, # Disable unnecessary validation for performance
404420
connect_timeout=self._connect_timeout_seconds,
405421
read_timeout=self._read_timeout_seconds,
406422
max_pool_connections=self._max_pool_connections,
407-
retries={
408-
'total_max_attempts': 1 + self._max_retry_attempts_exception,
409-
'mode': 'standard',
410-
}
423+
retries=retries
411424
)
412425
self._client = cast(BotocoreBaseClientPrivate, self.session.create_client(SERVICE_NAME, self.region, endpoint_url=self.host, config=config))
413426

pynamodb/settings.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
'region': None,
1616
'max_pool_connections': 10,
1717
'extra_headers': None,
18+
'retry_configuration': 'LEGACY'
1819
}
1920

2021
OVERRIDE_SETTINGS_PATH = getenv('PYNAMODB_CONFIG', '/etc/pynamodb/global_default_settings.py')

0 commit comments

Comments
 (0)