Skip to content

Commit 64b9ee2

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

File tree

2 files changed

+25
-5
lines changed

2 files changed

+25
-5
lines changed

pynamodb/connection/base.py

Lines changed: 24 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,17 @@
11
"""
22
Lowest level connection
33
"""
4+
import sys
45
import logging
56
import uuid
67
from threading import local
7-
from typing import Any, Dict, List, Mapping, Optional, Sequence, cast
8+
from typing import Any, Dict, List, Mapping, Optional, Sequence, Union, cast
9+
if sys.version_info >= (3, 8):
10+
from typing import Literal
11+
else:
12+
from typing_extensions import Literal
813

14+
import botocore.config
915
import botocore.client
1016
import botocore.exceptions
1117
from botocore.client import ClientError
@@ -247,6 +253,7 @@ def __init__(self,
247253
read_timeout_seconds: Optional[float] = None,
248254
connect_timeout_seconds: Optional[float] = None,
249255
max_retry_attempts: Optional[int] = None,
256+
retry_configuration: Optional[Union[Literal["LEGACY"], "botocore.config._RetryDict"]] = None,
250257
max_pool_connections: Optional[int] = None,
251258
extra_headers: Optional[Mapping[str, str]] = None,
252259
aws_access_key_id: Optional[str] = None,
@@ -277,6 +284,11 @@ def __init__(self,
277284
else:
278285
self._max_retry_attempts_exception = get_settings_value('max_retry_attempts')
279286

287+
if retry_configuration is not None:
288+
self._retry_configuration = retry_configuration
289+
else:
290+
self._retry_configuration = get_settings_value('retry_configuration')
291+
280292
if max_pool_connections is not None:
281293
self._max_pool_connections = max_pool_connections
282294
else:
@@ -399,15 +411,22 @@ def client(self) -> BotocoreBaseClientPrivate:
399411
# if the client does not have credentials, we create a new client
400412
# otherwise the client is permanently poisoned in the case of metadata service flakiness when using IAM roles
401413
if not self._client or (self._client._request_signer and not self._client._request_signer._credentials):
414+
# Check if we are using the "LEGACY" retry mode to keep previous PynamoDB
415+
# retry behavior, or if we are using the new retry configuration settings.
416+
if self._retry_configuration != "LEGACY":
417+
retries = self._retry_configuration
418+
else:
419+
retries = {
420+
'total_max_attempts': 1 + self._max_retry_attempts_exception,
421+
'mode': 'standard',
422+
}
423+
402424
config = botocore.client.Config(
403425
parameter_validation=False, # Disable unnecessary validation for performance
404426
connect_timeout=self._connect_timeout_seconds,
405427
read_timeout=self._read_timeout_seconds,
406428
max_pool_connections=self._max_pool_connections,
407-
retries={
408-
'total_max_attempts': 1 + self._max_retry_attempts_exception,
409-
'mode': 'standard',
410-
}
429+
retries=retries
411430
)
412431
self._client = cast(BotocoreBaseClientPrivate, self.session.create_client(SERVICE_NAME, self.region, endpoint_url=self.host, config=config))
413432

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)