Skip to content

Commit 6114788

Browse files
committed
PYTHON-5505 Fix handling of ClientBulkWriteException
1 parent 1f40e11 commit 6114788

File tree

2 files changed

+22
-26
lines changed

2 files changed

+22
-26
lines changed

pymongo/asynchronous/mongo_client.py

Lines changed: 11 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2788,6 +2788,7 @@ async def run(self) -> T:
27882788
except PyMongoError as exc:
27892789
always_retryable = False
27902790
overloaded = False
2791+
exc_to_check = exc
27912792
# Execute specialized catch on read
27922793
if self._is_read:
27932794
if isinstance(exc, (ConnectionFailure, OperationFailure)):
@@ -2811,16 +2812,13 @@ async def run(self) -> T:
28112812

28122813
# Specialized catch on write operation
28132814
if not self._is_read:
2814-
retryable_write_label = False
2815-
if isinstance(exc, ClientBulkWriteException) and exc.error:
2816-
if isinstance(exc.error, PyMongoError):
2817-
retryable_write_label = exc.error.has_error_label("RetryableWriteError")
2818-
always_retryable = exc.error.has_error_label("Retryable")
2819-
overloaded = exc.error.has_error_label("SystemOverloaded")
2820-
else:
2821-
retryable_write_label = exc.has_error_label("RetryableWriteError")
2822-
always_retryable = exc.has_error_label("Retryable")
2823-
overloaded = exc.has_error_label("SystemOverloaded")
2815+
if isinstance(exc, ClientBulkWriteException) and isinstance(
2816+
exc.error, PyMongoError
2817+
):
2818+
exc_to_check = exc.error
2819+
retryable_write_label = exc_to_check.has_error_label("RetryableWriteError")
2820+
always_retryable = exc_to_check.has_error_label("Retryable")
2821+
overloaded = exc_to_check.has_error_label("SystemOverloaded")
28242822
if not self._retryable and not always_retryable:
28252823
raise
28262824
if retryable_write_label or always_retryable:
@@ -2829,7 +2827,7 @@ async def run(self) -> T:
28292827
if not always_retryable and (
28302828
not retryable_write_label or self._is_not_eligible_for_retry()
28312829
):
2832-
if exc.has_error_label("NoWritesPerformed") and self._last_error:
2830+
if exc_to_check.has_error_label("NoWritesPerformed") and self._last_error:
28332831
raise self._last_error from exc
28342832
else:
28352833
raise
@@ -2838,7 +2836,7 @@ async def run(self) -> T:
28382836
self._bulk.retrying = True
28392837
else:
28402838
self._retrying = True
2841-
if not exc.has_error_label("NoWritesPerformed"):
2839+
if not exc_to_check.has_error_label("NoWritesPerformed"):
28422840
self._last_error = exc
28432841
if self._last_error is None:
28442842
self._last_error = exc
@@ -2849,7 +2847,7 @@ async def run(self) -> T:
28492847
self._always_retryable = always_retryable
28502848
if always_retryable:
28512849
if self._attempt_number > _MAX_RETRIES:
2852-
if exc.has_error_label("NoWritesPerformed") and self._last_error:
2850+
if exc_to_check.has_error_label("NoWritesPerformed") and self._last_error:
28532851
raise self._last_error from exc
28542852
else:
28552853
raise

pymongo/synchronous/mongo_client.py

Lines changed: 11 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2778,6 +2778,7 @@ def run(self) -> T:
27782778
except PyMongoError as exc:
27792779
always_retryable = False
27802780
overloaded = False
2781+
exc_to_check = exc
27812782
# Execute specialized catch on read
27822783
if self._is_read:
27832784
if isinstance(exc, (ConnectionFailure, OperationFailure)):
@@ -2801,16 +2802,13 @@ def run(self) -> T:
28012802

28022803
# Specialized catch on write operation
28032804
if not self._is_read:
2804-
retryable_write_label = False
2805-
if isinstance(exc, ClientBulkWriteException) and exc.error:
2806-
if isinstance(exc.error, PyMongoError):
2807-
retryable_write_label = exc.error.has_error_label("RetryableWriteError")
2808-
always_retryable = exc.error.has_error_label("Retryable")
2809-
overloaded = exc.error.has_error_label("SystemOverloaded")
2810-
else:
2811-
retryable_write_label = exc.has_error_label("RetryableWriteError")
2812-
always_retryable = exc.has_error_label("Retryable")
2813-
overloaded = exc.has_error_label("SystemOverloaded")
2805+
if isinstance(exc, ClientBulkWriteException) and isinstance(
2806+
exc.error, PyMongoError
2807+
):
2808+
exc_to_check = exc.error
2809+
retryable_write_label = exc_to_check.has_error_label("RetryableWriteError")
2810+
always_retryable = exc_to_check.has_error_label("Retryable")
2811+
overloaded = exc_to_check.has_error_label("SystemOverloaded")
28142812
if not self._retryable and not always_retryable:
28152813
raise
28162814
if retryable_write_label or always_retryable:
@@ -2819,7 +2817,7 @@ def run(self) -> T:
28192817
if not always_retryable and (
28202818
not retryable_write_label or self._is_not_eligible_for_retry()
28212819
):
2822-
if exc.has_error_label("NoWritesPerformed") and self._last_error:
2820+
if exc_to_check.has_error_label("NoWritesPerformed") and self._last_error:
28232821
raise self._last_error from exc
28242822
else:
28252823
raise
@@ -2828,7 +2826,7 @@ def run(self) -> T:
28282826
self._bulk.retrying = True
28292827
else:
28302828
self._retrying = True
2831-
if not exc.has_error_label("NoWritesPerformed"):
2829+
if not exc_to_check.has_error_label("NoWritesPerformed"):
28322830
self._last_error = exc
28332831
if self._last_error is None:
28342832
self._last_error = exc
@@ -2839,7 +2837,7 @@ def run(self) -> T:
28392837
self._always_retryable = always_retryable
28402838
if always_retryable:
28412839
if self._attempt_number > _MAX_RETRIES:
2842-
if exc.has_error_label("NoWritesPerformed") and self._last_error:
2840+
if exc_to_check.has_error_label("NoWritesPerformed") and self._last_error:
28432841
raise self._last_error from exc
28442842
else:
28452843
raise

0 commit comments

Comments
 (0)