Skip to content

Commit d676283

Browse files
committed
update retry logic
1 parent 49f605a commit d676283

File tree

2 files changed

+16
-10
lines changed

2 files changed

+16
-10
lines changed

pymongo/asynchronous/mongo_client.py

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2796,7 +2796,9 @@ async def run(self) -> T:
27962796
if isinstance(exc, (ConnectionFailure, OperationFailure)):
27972797
# ConnectionFailures do not supply a code property
27982798
exc_code = getattr(exc, "code", None)
2799-
always_retryable = exc.has_error_label("RetryableError")
2799+
always_retryable = exc.has_error_label(
2800+
"RetryableError"
2801+
) and exc.has_error_label("SystemOverloadedError")
28002802
overloaded = exc.has_error_label("SystemOverloadedError")
28012803
if not always_retryable and (
28022804
self._is_not_eligible_for_retry()
@@ -2819,7 +2821,9 @@ async def run(self) -> T:
28192821
):
28202822
exc_to_check = exc.error
28212823
retryable_write_label = exc_to_check.has_error_label("RetryableWriteError")
2822-
always_retryable = exc_to_check.has_error_label("RetryableError")
2824+
always_retryable = exc_to_check.has_error_label(
2825+
"RetryableError"
2826+
) and exc.has_error_label("SystemOverloadedError")
28232827
overloaded = exc_to_check.has_error_label("SystemOverloadedError")
28242828
if not self._retryable and not always_retryable:
28252829
raise
@@ -2847,15 +2851,14 @@ async def run(self) -> T:
28472851
self._deprioritized_servers.append(self._server)
28482852

28492853
self._always_retryable = always_retryable
2850-
if always_retryable:
2854+
if overloaded:
28512855
delay = self._retry_policy.backoff(self._attempt_number) if overloaded else 0
28522856
if not await self._retry_policy.should_retry(self._attempt_number, delay):
28532857
if exc_to_check.has_error_label("NoWritesPerformed") and self._last_error:
28542858
raise self._last_error from exc
28552859
else:
28562860
raise
2857-
if overloaded:
2858-
await asyncio.sleep(delay)
2861+
await asyncio.sleep(delay)
28592862

28602863
def _is_not_eligible_for_retry(self) -> bool:
28612864
"""Checks if the exchange is not eligible for retry"""

pymongo/synchronous/mongo_client.py

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2786,7 +2786,9 @@ def run(self) -> T:
27862786
if isinstance(exc, (ConnectionFailure, OperationFailure)):
27872787
# ConnectionFailures do not supply a code property
27882788
exc_code = getattr(exc, "code", None)
2789-
always_retryable = exc.has_error_label("RetryableError")
2789+
always_retryable = exc.has_error_label(
2790+
"RetryableError"
2791+
) and exc.has_error_label("SystemOverloadedError")
27902792
overloaded = exc.has_error_label("SystemOverloadedError")
27912793
if not always_retryable and (
27922794
self._is_not_eligible_for_retry()
@@ -2809,7 +2811,9 @@ def run(self) -> T:
28092811
):
28102812
exc_to_check = exc.error
28112813
retryable_write_label = exc_to_check.has_error_label("RetryableWriteError")
2812-
always_retryable = exc_to_check.has_error_label("RetryableError")
2814+
always_retryable = exc_to_check.has_error_label(
2815+
"RetryableError"
2816+
) and exc.has_error_label("SystemOverloadedError")
28132817
overloaded = exc_to_check.has_error_label("SystemOverloadedError")
28142818
if not self._retryable and not always_retryable:
28152819
raise
@@ -2837,15 +2841,14 @@ def run(self) -> T:
28372841
self._deprioritized_servers.append(self._server)
28382842

28392843
self._always_retryable = always_retryable
2840-
if always_retryable:
2844+
if overloaded:
28412845
delay = self._retry_policy.backoff(self._attempt_number) if overloaded else 0
28422846
if not self._retry_policy.should_retry(self._attempt_number, delay):
28432847
if exc_to_check.has_error_label("NoWritesPerformed") and self._last_error:
28442848
raise self._last_error from exc
28452849
else:
28462850
raise
2847-
if overloaded:
2848-
time.sleep(delay)
2851+
time.sleep(delay)
28492852

28502853
def _is_not_eligible_for_retry(self) -> bool:
28512854
"""Checks if the exchange is not eligible for retry"""

0 commit comments

Comments
 (0)