@@ -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
0 commit comments