Skip to content

Commit 9b09a4e

Browse files
committed
PYTHON-5672 Add __slots__ and lazy _deprioritized_servers to _ClientConnectionRetryable
Eliminates per-instance __dict__ allocation and defers the _deprioritized_servers list creation until it is actually needed (only on sharded retry paths).
1 parent fab43f4 commit 9b09a4e

2 files changed

Lines changed: 54 additions & 2 deletions

File tree

pymongo/asynchronous/mongo_client.py

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2807,6 +2807,30 @@ async def __aenter__(self) -> tuple[AsyncConnection, _ServerMode]: # type: igno
28072807
class _ClientConnectionRetryable(Generic[T]):
28082808
"""Responsible for executing retryable connections on read or write operations"""
28092809

2810+
__slots__ = (
2811+
"_address",
2812+
"_always_retryable",
2813+
"_attempt_number",
2814+
"_bulk",
2815+
"_client",
2816+
"_deprioritized_servers",
2817+
"_func",
2818+
"_is_aggregate_write",
2819+
"_is_read",
2820+
"_is_run_command",
2821+
"_last_error",
2822+
"_max_retries",
2823+
"_operation",
2824+
"_operation_id",
2825+
"_read_pref",
2826+
"_retry_policy",
2827+
"_retryable",
2828+
"_retrying",
2829+
"_server",
2830+
"_server_selector",
2831+
"_session",
2832+
)
2833+
28102834
def __init__(
28112835
self,
28122836
mongo_client: AsyncMongoClient, # type: ignore[type-arg]
@@ -2839,7 +2863,7 @@ def __init__(
28392863
)
28402864
self._address = address
28412865
self._server: Server = None # type: ignore
2842-
self._deprioritized_servers: list[Server] = []
2866+
self._deprioritized_servers: Optional[list[Server]] = None
28432867
self._operation = operation
28442868
self._operation_id = operation_id
28452869
self._attempt_number = 0
@@ -2979,6 +3003,8 @@ async def run(self) -> T:
29793003
self._client.topology_description.topology_type_name == "Sharded"
29803004
or (overloaded and self._client.options.enable_overload_retargeting)
29813005
):
3006+
if self._deprioritized_servers is None:
3007+
self._deprioritized_servers = []
29823008
self._deprioritized_servers.append(self._server)
29833009

29843010
self._always_retryable = always_retryable

pymongo/synchronous/mongo_client.py

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2796,6 +2796,30 @@ def __enter__(self) -> tuple[Connection, _ServerMode]: # type: ignore[override]
27962796
class _ClientConnectionRetryable(Generic[T]):
27972797
"""Responsible for executing retryable connections on read or write operations"""
27982798

2799+
__slots__ = (
2800+
"_address",
2801+
"_always_retryable",
2802+
"_attempt_number",
2803+
"_bulk",
2804+
"_client",
2805+
"_deprioritized_servers",
2806+
"_func",
2807+
"_is_aggregate_write",
2808+
"_is_read",
2809+
"_is_run_command",
2810+
"_last_error",
2811+
"_max_retries",
2812+
"_operation",
2813+
"_operation_id",
2814+
"_read_pref",
2815+
"_retry_policy",
2816+
"_retryable",
2817+
"_retrying",
2818+
"_server",
2819+
"_server_selector",
2820+
"_session",
2821+
)
2822+
27992823
def __init__(
28002824
self,
28012825
mongo_client: MongoClient, # type: ignore[type-arg]
@@ -2828,7 +2852,7 @@ def __init__(
28282852
)
28292853
self._address = address
28302854
self._server: Server = None # type: ignore
2831-
self._deprioritized_servers: list[Server] = []
2855+
self._deprioritized_servers: Optional[list[Server]] = None
28322856
self._operation = operation
28332857
self._operation_id = operation_id
28342858
self._attempt_number = 0
@@ -2968,6 +2992,8 @@ def run(self) -> T:
29682992
self._client.topology_description.topology_type_name == "Sharded"
29692993
or (overloaded and self._client.options.enable_overload_retargeting)
29702994
):
2995+
if self._deprioritized_servers is None:
2996+
self._deprioritized_servers = []
29712997
self._deprioritized_servers.append(self._server)
29722998

29732999
self._always_retryable = always_retryable

0 commit comments

Comments
 (0)