diff options
author | Bar Shaul <barshaul@amazon.com> | 2022-10-27 14:36:15 +0300 |
---|---|---|
committer | Bar Shaul <barshaul@amazon.com> | 2022-11-02 16:47:33 +0200 |
commit | 04dfd25f1b153da4afd27d50db7d0d2f1cce3c8c (patch) | |
tree | 86124ba3700f030c2a19e43990254c879ac573b8 | |
parent | 8ca002d2f5d20fb74e062fcb7f8e2a6d0352e3b4 (diff) | |
download | redis-py-04dfd25f1b153da4afd27d50db7d0d2f1cce3c8c.tar.gz |
Updating retry object for existing and new connections
-rw-r--r-- | redis/asyncio/client.py | 1 | ||||
-rw-r--r-- | redis/asyncio/cluster.py | 3 | ||||
-rw-r--r-- | redis/asyncio/connection.py | 6 | ||||
-rwxr-xr-x | redis/client.py | 1 | ||||
-rwxr-xr-x | redis/connection.py | 9 | ||||
-rw-r--r-- | tests/test_asyncio/test_cluster.py | 5 | ||||
-rw-r--r-- | tests/test_asyncio/test_retry.py | 4 | ||||
-rw-r--r-- | tests/test_cluster.py | 7 | ||||
-rw-r--r-- | tests/test_retry.py | 4 |
9 files changed, 37 insertions, 3 deletions
diff --git a/redis/asyncio/client.py b/redis/asyncio/client.py index cee740f..bf001c7 100644 --- a/redis/asyncio/client.py +++ b/redis/asyncio/client.py @@ -278,6 +278,7 @@ class Redis( def set_retry(self, retry: "Retry") -> None: self.get_connection_kwargs().update({"retry": retry}) + self.connection_pool.set_retry(retry) def load_external_module(self, funcname, func): """ diff --git a/redis/asyncio/cluster.py b/redis/asyncio/cluster.py index d1d4d8d..460e396 100644 --- a/redis/asyncio/cluster.py +++ b/redis/asyncio/cluster.py @@ -207,7 +207,6 @@ class RedisCluster(AbstractRedis, AbstractRedisCluster, AsyncRedisClusterCommand "reinitialize_steps", "response_callbacks", "result_callbacks", - "retry", ) def __init__( @@ -504,6 +503,8 @@ class RedisCluster(AbstractRedis, AbstractRedisCluster, AsyncRedisClusterCommand self.retry = retry for node in self.get_nodes(): node.connection_kwargs.update({"retry": retry}) + for conn in node._connections: + conn.retry = retry def set_response_callback(self, command: str, callback: ResponseCallbackT) -> None: """Set a custom response callback.""" diff --git a/redis/asyncio/connection.py b/redis/asyncio/connection.py index 01da9a9..d9a97fd 100644 --- a/redis/asyncio/connection.py +++ b/redis/asyncio/connection.py @@ -1426,6 +1426,12 @@ class ConnectionPool: if exc: raise exc + def set_retry(self, retry: "Retry") -> None: + for conn in self._available_connections: + conn.retry = retry + for conn in self._in_use_connections: + conn.retry = retry + class BlockingConnectionPool(ConnectionPool): """ diff --git a/redis/client.py b/redis/client.py index 089dbb2..18263e2 100755 --- a/redis/client.py +++ b/redis/client.py @@ -1050,6 +1050,7 @@ class Redis(AbstractRedis, RedisModuleCommands, CoreCommands, SentinelCommands): def set_retry(self, retry: "Retry") -> None: self.get_connection_kwargs().update({"retry": retry}) + self.connection_pool.set_retry(retry) def set_response_callback(self, command, callback): """Set a custom Response Callback""" diff --git a/redis/connection.py b/redis/connection.py index 2e33e31..3e1b633 100755 --- a/redis/connection.py +++ b/redis/connection.py @@ -529,7 +529,7 @@ class Connection: # Add TimeoutError to the errors list to retry on retry_on_error.append(TimeoutError) self.retry_on_error = retry_on_error - if retry_on_error: + if retry or retry_on_error: if retry is None: self.retry = Retry(NoBackoff(), 1) else: @@ -1446,6 +1446,13 @@ class ConnectionPool: for connection in connections: connection.disconnect() + def set_retry(self, retry: "Retry") -> None: + self.connection_kwargs.update({"retry": retry}) + for conn in self._available_connections: + conn.retry = retry + for conn in self._in_use_connections: + conn.retry = retry + class BlockingConnectionPool(ConnectionPool): """ diff --git a/tests/test_asyncio/test_cluster.py b/tests/test_asyncio/test_cluster.py index 3b61dc1..38bcaf6 100644 --- a/tests/test_asyncio/test_cluster.py +++ b/tests/test_asyncio/test_cluster.py @@ -260,6 +260,8 @@ class TestRedisClusterObj: assert n_retry is not None assert n_retry._retries == retry._retries assert isinstance(n_retry._backoff, NoBackoff) + rand_cluster_node = r.get_random_node() + existing_conn = rand_cluster_node.acquire_connection() # Change retry policy new_retry = Retry(ExponentialBackoff(), 3) r.set_retry(new_retry) @@ -270,6 +272,9 @@ class TestRedisClusterObj: assert n_retry is not None assert n_retry._retries == new_retry._retries assert isinstance(n_retry._backoff, ExponentialBackoff) + assert existing_conn.retry._retries == new_retry._retries + new_conn = rand_cluster_node.acquire_connection() + assert new_conn.retry._retries == new_retry._retries async def test_cluster_retry_object(self, request: FixtureRequest) -> None: url = request.config.getoption("--redis-url") diff --git a/tests/test_asyncio/test_retry.py b/tests/test_asyncio/test_retry.py index 8066e30..86e6ddf 100644 --- a/tests/test_asyncio/test_retry.py +++ b/tests/test_asyncio/test_retry.py @@ -127,6 +127,10 @@ class TestRedisClientRetry: assert r.get_retry()._retries == retry._retries assert isinstance(r.get_retry()._backoff, NoBackoff) new_retry_policy = Retry(ExponentialBackoff(), 3) + exiting_conn = await r.connection_pool.get_connection("_") r.set_retry(new_retry_policy) assert r.get_retry()._retries == new_retry_policy._retries assert isinstance(r.get_retry()._backoff, ExponentialBackoff) + assert exiting_conn.retry._retries == new_retry_policy._retries + new_conn = await r.connection_pool.get_connection("_") + assert new_conn.retry._retries == new_retry_policy._retries diff --git a/tests/test_cluster.py b/tests/test_cluster.py index 1c917ed..d18fbbb 100644 --- a/tests/test_cluster.py +++ b/tests/test_cluster.py @@ -749,12 +749,14 @@ class TestRedisClusterObj: def test_cluster_get_set_retry_object(self, request): retry = Retry(NoBackoff(), 2) - r = _get_client(Redis, request, retry=retry) + r = _get_client(RedisCluster, request, retry=retry) assert r.get_retry()._retries == retry._retries assert isinstance(r.get_retry()._backoff, NoBackoff) for node in r.get_nodes(): assert node.redis_connection.get_retry()._retries == retry._retries assert isinstance(node.redis_connection.get_retry()._backoff, NoBackoff) + rand_node = r.get_random_node() + existing_conn = rand_node.redis_connection.connection_pool.get_connection("_") # Change retry policy new_retry = Retry(ExponentialBackoff(), 3) r.set_retry(new_retry) @@ -765,6 +767,9 @@ class TestRedisClusterObj: assert isinstance( node.redis_connection.get_retry()._backoff, ExponentialBackoff ) + assert existing_conn.retry._retries == new_retry._retries + new_conn = rand_node.redis_connection.connection_pool.get_connection("_") + assert new_conn.retry._retries == new_retry._retries def test_cluster_retry_object(self, r) -> None: # Test default retry diff --git a/tests/test_retry.py b/tests/test_retry.py index af93805..3cfea5c 100644 --- a/tests/test_retry.py +++ b/tests/test_retry.py @@ -207,9 +207,13 @@ class TestRedisClientRetry: def test_get_set_retry_object(self, request): retry = Retry(NoBackoff(), 2) r = _get_client(Redis, request, retry_on_timeout=True, retry=retry) + exist_conn = r.connection_pool.get_connection("_") assert r.get_retry()._retries == retry._retries assert isinstance(r.get_retry()._backoff, NoBackoff) new_retry_policy = Retry(ExponentialBackoff(), 3) r.set_retry(new_retry_policy) assert r.get_retry()._retries == new_retry_policy._retries assert isinstance(r.get_retry()._backoff, ExponentialBackoff) + assert exist_conn.retry._retries == new_retry_policy._retries + new_conn = r.connection_pool.get_connection("_") + assert new_conn.retry._retries == new_retry_policy._retries |