From 89c3358d0d9311cf09e84bff223f40de05152c26 Mon Sep 17 00:00:00 2001 From: Yunhao Ling Date: Fri, 29 Jan 2021 11:26:51 -0800 Subject: [PATCH 1/2] improve error handling --- sdk/servicebus/azure-servicebus/CHANGELOG.md | 4 +++ .../azure/servicebus/exceptions.py | 3 ++ .../tests/livetest/test_errors.py | 33 +++++++++++++++++++ 3 files changed, 40 insertions(+) create mode 100644 sdk/servicebus/azure-servicebus/tests/livetest/test_errors.py diff --git a/sdk/servicebus/azure-servicebus/CHANGELOG.md b/sdk/servicebus/azure-servicebus/CHANGELOG.md index e85ed6c56cd8..6b9e88e9bec6 100644 --- a/sdk/servicebus/azure-servicebus/CHANGELOG.md +++ b/sdk/servicebus/azure-servicebus/CHANGELOG.md @@ -2,6 +2,10 @@ ## 7.0.2 (Unreleased) +**BugFixes** + +* Operations failing due to `uamqp.errors.LinkForceDetach` caused by no activity on the connection for 10 minutes will now be retried internally. +* `uamqp.errors.AMQPConnectionError` errors with condition code `amqp:unknown-error` are now categorized into `ServiceBusConnectionError` instead of the general `ServiceBusError`. ## 7.0.1 (2021-01-12) diff --git a/sdk/servicebus/azure-servicebus/azure/servicebus/exceptions.py b/sdk/servicebus/azure-servicebus/azure/servicebus/exceptions.py index d2a2c781d965..29afc9b4c829 100644 --- a/sdk/servicebus/azure-servicebus/azure/servicebus/exceptions.py +++ b/sdk/servicebus/azure-servicebus/azure/servicebus/exceptions.py @@ -101,6 +101,8 @@ def _handle_amqp_exception_with_condition( elif condition == AMQPErrorCodes.ClientError and "timed out" in str(exception): # handle send timeout error_cls = OperationTimeoutError + elif condition == AMQPErrorCodes.UnknownError and isinstance(exception, AMQPErrors.AMQPConnectionError): + error_cls = ServiceBusConnectionError else: # handle other error codes error_cls = _ERROR_CODE_TO_ERROR_MAPPING.get(condition, ServiceBusError) @@ -491,6 +493,7 @@ class AutoLockRenewTimeout(ServiceBusError): AMQPErrorCodes.UnauthorizedAccess: ServiceBusAuthorizationError, AMQPErrorCodes.NotImplemented: ServiceBusError, AMQPErrorCodes.NotAllowed: ServiceBusError, + AMQPErrorCodes.LinkDetachForced: ServiceBusConnectionError, ERROR_CODE_MESSAGE_LOCK_LOST: MessageLockLostError, ERROR_CODE_MESSAGE_NOT_FOUND: MessageNotFoundError, ERROR_CODE_AUTH_FAILED: ServiceBusAuthorizationError, diff --git a/sdk/servicebus/azure-servicebus/tests/livetest/test_errors.py b/sdk/servicebus/azure-servicebus/tests/livetest/test_errors.py new file mode 100644 index 000000000000..9eeda3d10396 --- /dev/null +++ b/sdk/servicebus/azure-servicebus/tests/livetest/test_errors.py @@ -0,0 +1,33 @@ +import logging + +from uamqp import errors as AMQPErrors, constants as AMQPConstants +from azure.servicebus.exceptions import ( + _create_servicebus_exception, + ServiceBusConnectionError, + ServiceBusError +) + + +def test_link_idle_timeout(): + logger = logging.getLogger("testlogger") + amqp_error = AMQPErrors.LinkDetach(AMQPConstants.ErrorCodes.LinkDetachForced, description="Details: AmqpMessageConsumer.IdleTimerExpired: Idle timeout: 00:10:00.") + sb_error = _create_servicebus_exception(logger, amqp_error) + assert isinstance(sb_error, ServiceBusConnectionError) + assert sb_error._retryable + assert sb_error._shutdown_handler + + +def test_unknown_connection_error(): + logger = logging.getLogger("testlogger") + amqp_error = AMQPErrors.AMQPConnectionError(AMQPConstants.ErrorCodes.UnknownError) + sb_error = _create_servicebus_exception(logger, amqp_error) + assert isinstance(sb_error,ServiceBusConnectionError) + assert sb_error._retryable + assert sb_error._shutdown_handler + + amqp_error = AMQPErrors.AMQPError(AMQPConstants.ErrorCodes.UnknownError) + sb_error = _create_servicebus_exception(logger, amqp_error) + assert not isinstance(sb_error,ServiceBusConnectionError) + assert isinstance(sb_error,ServiceBusError) + assert not sb_error._retryable + assert sb_error._shutdown_handler From 6a239bbb41b0d7627b524c0c8c5b386e627dd80a Mon Sep 17 00:00:00 2001 From: "Adam Ling (MSFT)" Date: Tue, 2 Feb 2021 10:16:58 -0800 Subject: [PATCH 2/2] Update sdk/servicebus/azure-servicebus/CHANGELOG.md --- sdk/servicebus/azure-servicebus/CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sdk/servicebus/azure-servicebus/CHANGELOG.md b/sdk/servicebus/azure-servicebus/CHANGELOG.md index 6b9e88e9bec6..86d892779eed 100644 --- a/sdk/servicebus/azure-servicebus/CHANGELOG.md +++ b/sdk/servicebus/azure-servicebus/CHANGELOG.md @@ -4,7 +4,7 @@ **BugFixes** -* Operations failing due to `uamqp.errors.LinkForceDetach` caused by no activity on the connection for 10 minutes will now be retried internally. +* Operations failing due to `uamqp.errors.LinkForceDetach` caused by no activity on the connection for 10 minutes will now be retried internally except for the session receiver case. * `uamqp.errors.AMQPConnectionError` errors with condition code `amqp:unknown-error` are now categorized into `ServiceBusConnectionError` instead of the general `ServiceBusError`. ## 7.0.1 (2021-01-12)