From e358eb40d6de02473a33c196a1057b4a14e87a1e Mon Sep 17 00:00:00 2001 From: swathipil <76007337+swathipil@users.noreply.github.com> Date: Thu, 6 Jan 2022 19:11:26 -0800 Subject: [PATCH] [ServiceBus&EventHubs] remove RetryMode enum (#22369) * remove RetryMode from SB * remove RetryMode from EH * annas comments --- sdk/eventhub/azure-eventhub/CHANGELOG.md | 1 - .../azure-eventhub/azure/eventhub/__init__.py | 2 -- .../azure/eventhub/_client_base.py | 4 +-- .../azure/eventhub/_configuration.py | 4 +-- .../azure/eventhub/_consumer_client.py | 25 +++++++++++++------ .../azure/eventhub/_producer_client.py | 10 +++++--- .../azure-eventhub/azure/eventhub/_retry.py | 9 ------- .../eventhub/aio/_consumer_client_async.py | 10 +++++--- .../eventhub/aio/_producer_client_async.py | 10 +++++--- .../tests/unittest/test_client_creation.py | 22 +++++++++++++--- sdk/servicebus/azure-servicebus/CHANGELOG.md | 1 - .../azure/servicebus/__init__.py | 2 -- .../azure/servicebus/_base_handler.py | 4 +-- .../servicebus/_common/_configuration.py | 4 +-- .../azure/servicebus/_retry.py | 9 ------- .../azure/servicebus/_servicebus_client.py | 10 +++++--- .../aio/_servicebus_client_async.py | 10 +++++--- .../tests/async_tests/test_sb_client_async.py | 4 +-- .../azure-servicebus/tests/test_sb_client.py | 23 ++++++++++++++--- 19 files changed, 97 insertions(+), 67 deletions(-) delete mode 100644 sdk/eventhub/azure-eventhub/azure/eventhub/_retry.py delete mode 100644 sdk/servicebus/azure-servicebus/azure/servicebus/_retry.py diff --git a/sdk/eventhub/azure-eventhub/CHANGELOG.md b/sdk/eventhub/azure-eventhub/CHANGELOG.md index d26f1e456819..bf310f74f17c 100644 --- a/sdk/eventhub/azure-eventhub/CHANGELOG.md +++ b/sdk/eventhub/azure-eventhub/CHANGELOG.md @@ -8,7 +8,6 @@ This version and all future versions will require Python 3.7+. Python 2.7 and 3. - Added support for fixed (linear) retry backoff: - Sync/async `EventHubProducerClient` and `EventHubConsumerClient` constructors and `from_connection_string` take `retry_mode` as a keyword argument. - - `RetryMode` enum has been added to `azure.eventhub`, with values `FIXED` and `EXPONENTIAL`. ### Breaking Changes diff --git a/sdk/eventhub/azure-eventhub/azure/eventhub/__init__.py b/sdk/eventhub/azure-eventhub/azure/eventhub/__init__.py index 37dc173392e0..e79284f5ae6b 100644 --- a/sdk/eventhub/azure-eventhub/azure/eventhub/__init__.py +++ b/sdk/eventhub/azure-eventhub/azure/eventhub/__init__.py @@ -18,7 +18,6 @@ parse_connection_string, EventHubConnectionStringProperties ) -from ._retry import RetryMode TransportType = constants.TransportType @@ -35,5 +34,4 @@ "PartitionContext", "parse_connection_string", "EventHubConnectionStringProperties", - "RetryMode" ] diff --git a/sdk/eventhub/azure-eventhub/azure/eventhub/_client_base.py b/sdk/eventhub/azure-eventhub/azure/eventhub/_client_base.py index 7055f99ed30e..e55fb9a0f588 100644 --- a/sdk/eventhub/azure-eventhub/azure/eventhub/_client_base.py +++ b/sdk/eventhub/azure-eventhub/azure/eventhub/_client_base.py @@ -26,11 +26,11 @@ AzureNamedKeyCredential, ) from azure.core.utils import parse_connection_string as core_parse_connection_string +from azure.core.pipeline.policies import RetryMode from .exceptions import _handle_exception, ClientClosedError, ConnectError from ._configuration import Configuration -from ._retry import RetryMode from ._utils import utc_from_timestamp, parse_sas_credential from ._connection_manager import get_connection_manager from ._constants import ( @@ -164,7 +164,7 @@ def _build_uri(address, entity): def _get_backoff_time(retry_mode, backoff_factor, backoff_max, retried_times): - if retry_mode == RetryMode.FIXED: + if retry_mode == RetryMode.Fixed: backoff_value = backoff_factor else: backoff_value = backoff_factor * (2 ** retried_times) diff --git a/sdk/eventhub/azure-eventhub/azure/eventhub/_configuration.py b/sdk/eventhub/azure-eventhub/azure/eventhub/_configuration.py index 9631974bda2e..bf42d52bb761 100644 --- a/sdk/eventhub/azure-eventhub/azure/eventhub/_configuration.py +++ b/sdk/eventhub/azure-eventhub/azure/eventhub/_configuration.py @@ -10,7 +10,7 @@ from urllib.parse import urlparse from uamqp.constants import TransportType, DEFAULT_AMQPS_PORT, DEFAULT_AMQP_WSS_PORT -from ._retry import RetryMode +from azure.core.pipeline.policies import RetryMode class Configuration(object): # pylint:disable=too-many-instance-attributes @@ -18,7 +18,7 @@ def __init__(self, **kwargs): self.user_agent = kwargs.get("user_agent") # type: Optional[str] self.retry_total = kwargs.get("retry_total", 3) # type: int self.max_retries = self.retry_total # type: int - self.retry_mode = kwargs.get("retry_mode", RetryMode.EXPONENTIAL) + self.retry_mode = RetryMode(kwargs.get("retry_mode", "exponential")) self.backoff_factor = kwargs.get("retry_backoff_factor", 0.8) # type: float self.backoff_max = kwargs.get("retry_backoff_max", 120) # type: int self.network_tracing = kwargs.get("network_tracing", False) # type: bool diff --git a/sdk/eventhub/azure-eventhub/azure/eventhub/_consumer_client.py b/sdk/eventhub/azure-eventhub/azure/eventhub/_consumer_client.py index 1832035efa09..30f5f25d564c 100644 --- a/sdk/eventhub/azure-eventhub/azure/eventhub/_consumer_client.py +++ b/sdk/eventhub/azure-eventhub/azure/eventhub/_consumer_client.py @@ -15,7 +15,11 @@ if TYPE_CHECKING: import datetime - from azure.core.credentials import TokenCredential, AzureSasCredential, AzureNamedKeyCredential + from azure.core.credentials import ( + TokenCredential, + AzureSasCredential, + AzureNamedKeyCredential, + ) from typing import ( # pylint: disable=ungrouped-imports Any, Union, @@ -79,8 +83,9 @@ class EventHubConsumerClient(ClientBase): seconds. If the backoff_factor is 0.1, then the retry will sleep for [0.0s, 0.2s, 0.4s, ...] between retries. The default value is 0.8. :keyword float retry_backoff_max: The maximum back off time. Default value is 120 seconds (2 minutes). - :keyword retry_mode: Fixed or exponential delay between attempts, default is exponential. - :paramtype retry_mode: ~azure.eventhub.RetryMode + :keyword retry_mode: The delay behavior between retry attempts. Supported values are 'fixed' or 'exponential', + where default is 'exponential'. + :paramtype retry_mode: str :keyword float idle_timeout: Timeout, in seconds, after which this client will close the underlying connection if there is no further activity. By default the value is None, meaning that the client will not shutdown due to inactivity unless initiated by the service. @@ -151,10 +156,15 @@ def __init__( "partition_ownership_expiration_interval", None ) if self._partition_ownership_expiration_interval is None: - self._partition_ownership_expiration_interval = 6 * self._load_balancing_interval + self._partition_ownership_expiration_interval = ( + 6 * self._load_balancing_interval + ) load_balancing_strategy = kwargs.pop("load_balancing_strategy", None) - self._load_balancing_strategy = LoadBalancingStrategy(load_balancing_strategy) if load_balancing_strategy \ + self._load_balancing_strategy = ( + LoadBalancingStrategy(load_balancing_strategy) + if load_balancing_strategy else LoadBalancingStrategy.GREEDY + ) self._consumer_group = consumer_group network_tracing = kwargs.pop("logging_enable", False) super(EventHubConsumerClient, self).__init__( @@ -235,8 +245,9 @@ def from_connection_string(cls, conn_str, consumer_group, **kwargs): seconds. If the backoff_factor is 0.1, then the retry will sleep for [0.0s, 0.2s, 0.4s, ...] between retries. The default value is 0.8. :keyword float retry_backoff_max: The maximum back off time. Default value is 120 seconds (2 minutes). - :keyword retry_mode: Fixed or exponential delay between attempts, default is exponential. - :paramtype retry_mode: ~azure.eventhub.RetryMode + :keyword retry_mode: The delay behavior between retry attempts. Supported values are 'fixed' or 'exponential', + where default is 'exponential'. + :paramtype retry_mode: str :keyword float idle_timeout: Timeout, in seconds, after which this client will close the underlying connection if there is no furthur activity. By default the value is None, meaning that the client will not shutdown due to inactivity unless initiated by the service. diff --git a/sdk/eventhub/azure-eventhub/azure/eventhub/_producer_client.py b/sdk/eventhub/azure-eventhub/azure/eventhub/_producer_client.py index 0f0ba202c18d..76e7f9dcdeb1 100644 --- a/sdk/eventhub/azure-eventhub/azure/eventhub/_producer_client.py +++ b/sdk/eventhub/azure-eventhub/azure/eventhub/_producer_client.py @@ -54,8 +54,9 @@ class EventHubProducerClient(ClientBase): seconds. If the backoff_factor is 0.1, then the retry will sleep for [0.0s, 0.2s, 0.4s, ...] between retries. The default value is 0.8. :keyword float retry_backoff_max: The maximum back off time. Default value is 120 seconds (2 minutes). - :keyword retry_mode: Fixed or exponential delay between attempts, default is exponential. - :paramtype retry_mode: ~azure.eventhub.RetryMode + :keyword retry_mode: The delay behavior between retry attempts. Supported values are 'fixed' or 'exponential', + where default is 'exponential'. + :paramtype retry_mode: str :keyword float idle_timeout: Timeout, in seconds, after which this client will close the underlying connection if there is no activity. By default the value is None, meaning that the client will not shutdown due to inactivity unless initiated by the service. @@ -201,8 +202,9 @@ def from_connection_string(cls, conn_str, **kwargs): seconds. If the backoff_factor is 0.1, then the retry will sleep for [0.0s, 0.2s, 0.4s, ...] between retries. The default value is 0.8. :keyword float retry_backoff_max: The maximum back off time. Default value is 120 seconds (2 minutes). - :keyword retry_mode: Fixed or exponential delay between attempts, default is exponential. - :paramtype retry_mode: ~azure.eventhub.RetryMode + :keyword retry_mode: The delay behavior between retry attempts. Supported values are 'fixed' or 'exponential', + where default is 'exponential'. + :paramtype retry_mode: str :keyword float idle_timeout: Timeout, in seconds, after which this client will close the underlying connection if there is no activity. By default the value is None, meaning that the client will not shutdown due to inactivity unless initiated by the service. diff --git a/sdk/eventhub/azure-eventhub/azure/eventhub/_retry.py b/sdk/eventhub/azure-eventhub/azure/eventhub/_retry.py deleted file mode 100644 index 3f5f01395276..000000000000 --- a/sdk/eventhub/azure-eventhub/azure/eventhub/_retry.py +++ /dev/null @@ -1,9 +0,0 @@ -# -------------------------------------------------------------------------------------------- -# Copyright (c) Microsoft Corporation. All rights reserved. -# Licensed under the MIT License. See License.txt in the project root for license information. -# -------------------------------------------------------------------------------------------- -from enum import Enum - -class RetryMode(str, Enum): - EXPONENTIAL = 'exponential' - FIXED = 'fixed' diff --git a/sdk/eventhub/azure-eventhub/azure/eventhub/aio/_consumer_client_async.py b/sdk/eventhub/azure-eventhub/azure/eventhub/aio/_consumer_client_async.py index 7b9b5eb52c52..a9ab8c1b76ed 100644 --- a/sdk/eventhub/azure-eventhub/azure/eventhub/aio/_consumer_client_async.py +++ b/sdk/eventhub/azure-eventhub/azure/eventhub/aio/_consumer_client_async.py @@ -86,8 +86,9 @@ class EventHubConsumerClient(ClientBaseAsync): seconds. If the backoff_factor is 0.1, then the retry will sleep for [0.0s, 0.2s, 0.4s, ...] between retries. The default value is 0.8. :keyword float retry_backoff_max: The maximum back off time. Default value is 120 seconds (2 minutes). - :keyword retry_mode: Fixed or exponential delay between attempts, default is exponential. - :paramtype retry_mode: ~azure.eventhub.RetryMode + :keyword retry_mode: The delay behavior between retry attempts. Supported values are 'fixed' or 'exponential', + where default is 'exponential'. + :paramtype retry_mode: str :keyword float idle_timeout: Timeout, in seconds, after which this client will close the underlying connection if there is no further activity. By default the value is None, meaning that the client will not shutdown due to inactivity unless initiated by the service. @@ -255,8 +256,9 @@ def from_connection_string( seconds. If the backoff_factor is 0.1, then the retry will sleep for [0.0s, 0.2s, 0.4s, ...] between retries. The default value is 0.8. :keyword float retry_backoff_max: The maximum back off time. Default value is 120 seconds (2 minutes). - :keyword retry_mode: Fixed or exponential delay between attempts, default is exponential. - :paramtype retry_mode: ~azure.eventhub.RetryMode + :keyword retry_mode: The delay behavior between retry attempts. Supported values are 'fixed' or 'exponential', + where default is 'exponential'. + :paramtype retry_mode: str :keyword float idle_timeout: Timeout, in seconds, after which this client will close the underlying connection if there is no further activity. By default the value is None, meaning that the client will not shutdown due to inactivity unless initiated by the service. diff --git a/sdk/eventhub/azure-eventhub/azure/eventhub/aio/_producer_client_async.py b/sdk/eventhub/azure-eventhub/azure/eventhub/aio/_producer_client_async.py index 895e145db451..f1345f542bdb 100644 --- a/sdk/eventhub/azure-eventhub/azure/eventhub/aio/_producer_client_async.py +++ b/sdk/eventhub/azure-eventhub/azure/eventhub/aio/_producer_client_async.py @@ -53,8 +53,9 @@ class EventHubProducerClient(ClientBaseAsync): seconds. If the backoff_factor is 0.1, then the retry will sleep for [0.0s, 0.2s, 0.4s, ...] between retries. The default value is 0.8. :keyword float retry_backoff_max: The maximum back off time. Default value is 120 seconds (2 minutes). - :keyword retry_mode: Fixed or exponential delay between attempts, default is exponential. - :paramtype retry_mode: ~azure.eventhub.RetryMode + :keyword retry_mode: The delay behavior between retry attempts. Supported values are 'fixed' or 'exponential', + where default is 'exponential'. + :paramtype retry_mode: str :keyword float idle_timeout: Timeout, in seconds, after which this client will close the underlying connection if there is no activity. By default the value is None, meaning that the client will not shutdown due to inactivity unless initiated by the service. @@ -217,8 +218,9 @@ def from_connection_string( seconds. If the backoff_factor is 0.1, then the retry will sleep for [0.0s, 0.2s, 0.4s, ...] between retries. The default value is 0.8. :keyword float retry_backoff_max: The maximum back off time. Default value is 120 seconds (2 minutes). - :keyword retry_mode: Fixed or exponential delay between attempts, default is exponential. - :paramtype retry_mode: ~azure.eventhub.RetryMode + :keyword retry_mode: The delay behavior between retry attempts. Supported values are 'fixed' or 'exponential', + where default is 'exponential'. + :paramtype retry_mode: str :keyword float idle_timeout: Timeout, in seconds, after which this client will close the underlying connection if there is no activity. By default the value is None, meaning that the client will not shutdown due to inactivity unless initiated by the service. diff --git a/sdk/eventhub/azure-eventhub/tests/unittest/test_client_creation.py b/sdk/eventhub/azure-eventhub/tests/unittest/test_client_creation.py index 37e16d69c99e..4bd654bcadcf 100644 --- a/sdk/eventhub/azure-eventhub/tests/unittest/test_client_creation.py +++ b/sdk/eventhub/azure-eventhub/tests/unittest/test_client_creation.py @@ -5,7 +5,8 @@ #-------------------------------------------------------------------------- import time -from azure.eventhub import EventHubProducerClient, EventHubConsumerClient, TransportType, RetryMode +from azure.core.pipeline.policies import RetryMode +from azure.eventhub import EventHubProducerClient, EventHubConsumerClient, TransportType def test_custom_endpoint(): @@ -136,13 +137,28 @@ def test_backoff_fixed_retry(): 'fake.host.com', 'fake_eh', None, - retry_mode=RetryMode.FIXED + retry_mode='fixed' ) backoff = client._config.backoff_factor start_time = time.time() client._backoff(retried_times=1, last_exception=Exception('fake'), timeout_time=None) sleep_time = time.time() - start_time # exp = 0.8 * (2 ** 1) = 1.6 - # time.sleep() in _backoff will take AT LEAST time 'exp' for RetryMode.EXPONENTIAL + # time.sleep() in _backoff will take AT LEAST time 'exp' for 'exponential' + # check that fixed is less than 'exp' + assert sleep_time < backoff * (2 ** 1) + + client = EventHubProducerClient( + 'fake.host.com', + 'fake_eh', + None, + retry_mode=RetryMode.Fixed + ) + backoff = client._config.backoff_factor + start_time = time.time() + client._backoff(retried_times=1, last_exception=Exception('fake'), timeout_time=None) + sleep_time = time.time() - start_time + # exp = 0.8 * (2 ** 1) = 1.6 + # time.sleep() in _backoff will take AT LEAST time 'exp' for 'exponential' # check that fixed is less than 'exp' assert sleep_time < backoff * (2 ** 1) diff --git a/sdk/servicebus/azure-servicebus/CHANGELOG.md b/sdk/servicebus/azure-servicebus/CHANGELOG.md index a6f05e1918a4..2fa723bfe566 100644 --- a/sdk/servicebus/azure-servicebus/CHANGELOG.md +++ b/sdk/servicebus/azure-servicebus/CHANGELOG.md @@ -8,7 +8,6 @@ This version and all future versions will require Python 3.7+. Python 2.7 and 3. - Added support for fixed (linear) retry backoff: - Sync/async `ServiceBusClient` constructors and `from_connection_string` take `retry_mode` as a keyword argument. - - `RetryMode` enum has been added to `azure.servicebus`, with values `FIXED` and `EXPONENTIAL`. ### Breaking Changes diff --git a/sdk/servicebus/azure-servicebus/azure/servicebus/__init__.py b/sdk/servicebus/azure-servicebus/azure/servicebus/__init__.py index 2a9b58694dc2..3af017075f1d 100644 --- a/sdk/servicebus/azure-servicebus/azure/servicebus/__init__.py +++ b/sdk/servicebus/azure-servicebus/azure/servicebus/__init__.py @@ -28,7 +28,6 @@ parse_connection_string, ServiceBusConnectionStringProperties, ) -from ._retry import RetryMode TransportType = constants.TransportType @@ -47,5 +46,4 @@ "AutoLockRenewer", "parse_connection_string", "ServiceBusConnectionStringProperties", - "RetryMode", ] diff --git a/sdk/servicebus/azure-servicebus/azure/servicebus/_base_handler.py b/sdk/servicebus/azure-servicebus/azure/servicebus/_base_handler.py index 68c4671b601a..b7612c3ec64e 100644 --- a/sdk/servicebus/azure-servicebus/azure/servicebus/_base_handler.py +++ b/sdk/servicebus/azure-servicebus/azure/servicebus/_base_handler.py @@ -20,9 +20,9 @@ from uamqp.message import MessageProperties from azure.core.credentials import AccessToken, AzureSasCredential, AzureNamedKeyCredential +from azure.core.pipeline.policies import RetryMode from ._common._configuration import Configuration -from ._retry import RetryMode from .exceptions import ( ServiceBusError, ServiceBusConnectionError, @@ -154,7 +154,7 @@ def _generate_sas_token(uri, policy, key, expiry=None): return AccessToken(token=token, expires_on=abs_expiry) def _get_backoff_time(retry_mode, backoff_factor, backoff_max, retried_times): - if retry_mode == RetryMode.FIXED: + if retry_mode == RetryMode.Fixed: backoff_value = backoff_factor else: backoff_value = backoff_factor * (2 ** retried_times) diff --git a/sdk/servicebus/azure-servicebus/azure/servicebus/_common/_configuration.py b/sdk/servicebus/azure-servicebus/azure/servicebus/_common/_configuration.py index c16a7fd2cc52..7eb6de1017b3 100644 --- a/sdk/servicebus/azure-servicebus/azure/servicebus/_common/_configuration.py +++ b/sdk/servicebus/azure-servicebus/azure/servicebus/_common/_configuration.py @@ -5,14 +5,14 @@ from typing import Optional, Dict, Any from uamqp.constants import TransportType -from .._retry import RetryMode +from azure.core.pipeline.policies import RetryMode class Configuration(object): # pylint:disable=too-many-instance-attributes def __init__(self, **kwargs): self.user_agent = kwargs.get("user_agent") # type: Optional[str] self.retry_total = kwargs.get("retry_total", 3) # type: int - self.retry_mode = kwargs.get("retry_mode", RetryMode.EXPONENTIAL) + self.retry_mode = RetryMode(kwargs.get("retry_mode", 'exponential')) self.retry_backoff_factor = kwargs.get( "retry_backoff_factor", 0.8 ) # type: float diff --git a/sdk/servicebus/azure-servicebus/azure/servicebus/_retry.py b/sdk/servicebus/azure-servicebus/azure/servicebus/_retry.py deleted file mode 100644 index 3f5f01395276..000000000000 --- a/sdk/servicebus/azure-servicebus/azure/servicebus/_retry.py +++ /dev/null @@ -1,9 +0,0 @@ -# -------------------------------------------------------------------------------------------- -# Copyright (c) Microsoft Corporation. All rights reserved. -# Licensed under the MIT License. See License.txt in the project root for license information. -# -------------------------------------------------------------------------------------------- -from enum import Enum - -class RetryMode(str, Enum): - EXPONENTIAL = 'exponential' - FIXED = 'fixed' diff --git a/sdk/servicebus/azure-servicebus/azure/servicebus/_servicebus_client.py b/sdk/servicebus/azure-servicebus/azure/servicebus/_servicebus_client.py index 1b0f28cc1aa3..df3ab6aff152 100644 --- a/sdk/servicebus/azure-servicebus/azure/servicebus/_servicebus_client.py +++ b/sdk/servicebus/azure-servicebus/azure/servicebus/_servicebus_client.py @@ -60,8 +60,9 @@ class ServiceBusClient(object): :keyword float retry_backoff_factor: Delta back-off internal in the unit of second between retries. Default value is 0.8. :keyword float retry_backoff_max: Maximum back-off interval in the unit of second. Default value is 120. - :keyword retry_mode: Fixed or exponential delay between attempts, default is exponential. - :paramtype retry_mode: ~azure.servicebus.RetryMode + :keyword retry_mode: The delay behavior between retry attempts. Supported values are 'fixed' or 'exponential', + where default is 'exponential'. + :paramtype retry_mode: str .. admonition:: Example: @@ -154,8 +155,9 @@ def from_connection_string(cls, conn_str, **kwargs): :keyword float retry_backoff_factor: Delta back-off internal in the unit of second between retries. Default value is 0.8. :keyword float retry_backoff_max: Maximum back-off interval in the unit of second. Default value is 120. - :keyword retry_mode: Fixed or exponential delay between attempts, default is exponential. - :paramtype retry_mode: ~azure.servicebus.RetryMode + :keyword retry_mode: The delay behavior between retry attempts. Supported values are 'fixed' or 'exponential', + where default is 'exponential'. + :paramtype retry_mode: str :rtype: ~azure.servicebus.ServiceBusClient .. admonition:: Example: diff --git a/sdk/servicebus/azure-servicebus/azure/servicebus/aio/_servicebus_client_async.py b/sdk/servicebus/azure-servicebus/azure/servicebus/aio/_servicebus_client_async.py index 3ba40cdf2e35..54ca2cc98d2d 100644 --- a/sdk/servicebus/azure-servicebus/azure/servicebus/aio/_servicebus_client_async.py +++ b/sdk/servicebus/azure-servicebus/azure/servicebus/aio/_servicebus_client_async.py @@ -58,8 +58,9 @@ class ServiceBusClient(object): :keyword float retry_backoff_factor: Delta back-off internal in the unit of second between retries. Default value is 0.8. :keyword float retry_backoff_max: Maximum back-off interval in the unit of second. Default value is 120. - :keyword retry_mode: Fixed or exponential delay between attempts, default is exponential. - :paramtype retry_mode: ~azure.eventhub.RetryMode + :keyword retry_mode: The delay behavior between retry attempts. Supported values are 'fixed' or 'exponential', + where default is 'exponential'. + :paramtype retry_mode: str .. admonition:: Example: @@ -131,8 +132,9 @@ def from_connection_string(cls, conn_str: str, **kwargs: Any) -> "ServiceBusClie :keyword float retry_backoff_factor: Delta back-off internal in the unit of second between retries. Default value is 0.8. :keyword float retry_backoff_max: Maximum back-off interval in the unit of second. Default value is 120. - :keyword retry_mode: Fixed or exponential delay between attempts, default is exponential. - :paramtype retry_mode: ~azure.eventhub.RetryMode + :keyword retry_mode: The delay behavior between retry attempts. Supported values are 'fixed' or 'exponential', + where default is 'exponential'. + :paramtype retry_mode: str :rtype: ~azure.servicebus.aio.ServiceBusClient .. admonition:: Example: diff --git a/sdk/servicebus/azure-servicebus/tests/async_tests/test_sb_client_async.py b/sdk/servicebus/azure-servicebus/tests/async_tests/test_sb_client_async.py index 1f8ddd8ffd8e..b656219af0d9 100644 --- a/sdk/servicebus/azure-servicebus/tests/async_tests/test_sb_client_async.py +++ b/sdk/servicebus/azure-servicebus/tests/async_tests/test_sb_client_async.py @@ -407,7 +407,7 @@ async def test_backoff_fixed_retry(self): client = ServiceBusClient( 'fake.host.com', 'fake_eh', - retry_mode=RetryMode.FIXED + retry_mode='fixed' ) # queue sender sender = await client.get_queue_sender('fake_name') @@ -416,7 +416,7 @@ async def test_backoff_fixed_retry(self): sender._backoff(retried_times=1, last_exception=Exception('fake'), abs_timeout_time=None) sleep_time_fixed = time.time() - start_time # exp = 0.8 * (2 ** 1) = 1.6 - # time.sleep() in _backoff will take AT LEAST time 'exp' for RetryMode.EXPONENTIAL + # time.sleep() in _backoff will take AT LEAST time 'exp' for retry_mode='exponential' # check that fixed is less than 'exp' assert sleep_time_fixed < backoff * (2 ** 1) diff --git a/sdk/servicebus/azure-servicebus/tests/test_sb_client.py b/sdk/servicebus/azure-servicebus/tests/test_sb_client.py index 404d44f0f4be..d468c043cce0 100644 --- a/sdk/servicebus/azure-servicebus/tests/test_sb_client.py +++ b/sdk/servicebus/azure-servicebus/tests/test_sb_client.py @@ -13,8 +13,9 @@ from azure.common import AzureHttpError, AzureConflictHttpError from azure.core.credentials import AzureSasCredential, AzureNamedKeyCredential +from azure.core.pipeline.policies import RetryMode from azure.mgmt.servicebus.models import AccessRights -from azure.servicebus import ServiceBusClient, ServiceBusSender, ServiceBusReceiver, RetryMode +from azure.servicebus import ServiceBusClient, ServiceBusSender, ServiceBusReceiver from azure.servicebus._base_handler import ServiceBusSharedKeyCredential from azure.servicebus._common.message import ServiceBusMessage, ServiceBusReceivedMessage from azure.servicebus.exceptions import ( @@ -424,7 +425,7 @@ def test_backoff_fixed_retry(self): client = ServiceBusClient( 'fake.host.com', 'fake_eh', - retry_mode=RetryMode.FIXED + retry_mode='fixed' ) # queue sender sender = client.get_queue_sender('fake_name') @@ -433,7 +434,7 @@ def test_backoff_fixed_retry(self): sender._backoff(retried_times=1, last_exception=Exception('fake'), abs_timeout_time=None) sleep_time_fixed = time.time() - start_time # exp = 0.8 * (2 ** 1) = 1.6 - # time.sleep() in _backoff will take AT LEAST time 'exp' for RetryMode.EXPONENTIAL + # time.sleep() in _backoff will take AT LEAST time 'exp' for retry_mode='exponential' # check that fixed is less than 'exp' assert sleep_time_fixed < backoff * (2 ** 1) @@ -460,3 +461,19 @@ def test_backoff_fixed_retry(self): receiver._backoff(retried_times=1, last_exception=Exception('fake'), abs_timeout_time=None) sleep_time_fixed = time.time() - start_time assert sleep_time_fixed < backoff * (2 ** 1) + + client = ServiceBusClient( + 'fake.host.com', + 'fake_eh', + retry_mode=RetryMode.Fixed + ) + # queue sender + sender = client.get_queue_sender('fake_name') + backoff = client._config.retry_backoff_factor + start_time = time.time() + sender._backoff(retried_times=1, last_exception=Exception('fake'), abs_timeout_time=None) + sleep_time_fixed = time.time() - start_time + # exp = 0.8 * (2 ** 1) = 1.6 + # time.sleep() in _backoff will take AT LEAST time 'exp' for retry_mode='exponential' + # check that fixed is less than 'exp' + assert sleep_time_fixed < backoff * (2 ** 1)