summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBar Shaul <barshaul@amazon.com>2022-10-27 14:36:15 +0300
committerBar Shaul <barshaul@amazon.com>2022-11-02 16:47:33 +0200
commit04dfd25f1b153da4afd27d50db7d0d2f1cce3c8c (patch)
tree86124ba3700f030c2a19e43990254c879ac573b8
parent8ca002d2f5d20fb74e062fcb7f8e2a6d0352e3b4 (diff)
downloadredis-py-04dfd25f1b153da4afd27d50db7d0d2f1cce3c8c.tar.gz
Updating retry object for existing and new connections
-rw-r--r--redis/asyncio/client.py1
-rw-r--r--redis/asyncio/cluster.py3
-rw-r--r--redis/asyncio/connection.py6
-rwxr-xr-xredis/client.py1
-rwxr-xr-xredis/connection.py9
-rw-r--r--tests/test_asyncio/test_cluster.py5
-rw-r--r--tests/test_asyncio/test_retry.py4
-rw-r--r--tests/test_cluster.py7
-rw-r--r--tests/test_retry.py4
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