Skip to content

Commit 23abdb2

Browse files
committed
Updating retry object for existing and new connections
1 parent 6aaf886 commit 23abdb2

File tree

9 files changed

+37
-3
lines changed

9 files changed

+37
-3
lines changed

redis/asyncio/client.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -278,6 +278,7 @@ def get_retry(self) -> Optional["Retry"]:
278278

279279
def set_retry(self, retry: "Retry") -> None:
280280
self.get_connection_kwargs().update({"retry": retry})
281+
self.connection_pool.set_retry(retry)
281282

282283
def load_external_module(self, funcname, func):
283284
"""

redis/asyncio/cluster.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -207,7 +207,6 @@ def from_url(cls, url: str, **kwargs: Any) -> "RedisCluster":
207207
"reinitialize_steps",
208208
"response_callbacks",
209209
"result_callbacks",
210-
"retry",
211210
)
212211

213212
def __init__(
@@ -504,6 +503,8 @@ def set_retry(self, retry: "Retry") -> None:
504503
self.retry = retry
505504
for node in self.get_nodes():
506505
node.connection_kwargs.update({"retry": retry})
506+
for conn in node._connections:
507+
conn.retry = retry
507508

508509
def set_response_callback(self, command: str, callback: ResponseCallbackT) -> None:
509510
"""Set a custom response callback."""

redis/asyncio/connection.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1522,6 +1522,12 @@ async def disconnect(self, inuse_connections: bool = True):
15221522
if exc:
15231523
raise exc
15241524

1525+
def set_retry(self, retry: "Retry") -> None:
1526+
for conn in self._available_connections:
1527+
conn.retry = retry
1528+
for conn in self._in_use_connections:
1529+
conn.retry = retry
1530+
15251531

15261532
class BlockingConnectionPool(ConnectionPool):
15271533
"""

redis/client.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1050,6 +1050,7 @@ def get_retry(self) -> Optional["Retry"]:
10501050

10511051
def set_retry(self, retry: "Retry") -> None:
10521052
self.get_connection_kwargs().update({"retry": retry})
1053+
self.connection_pool.set_retry(retry)
10531054

10541055
def set_response_callback(self, command, callback):
10551056
"""Set a custom Response Callback"""

redis/connection.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -529,7 +529,7 @@ def __init__(
529529
# Add TimeoutError to the errors list to retry on
530530
retry_on_error.append(TimeoutError)
531531
self.retry_on_error = retry_on_error
532-
if retry_on_error:
532+
if retry or retry_on_error:
533533
if retry is None:
534534
self.retry = Retry(NoBackoff(), 1)
535535
else:
@@ -1446,6 +1446,13 @@ def disconnect(self, inuse_connections=True):
14461446
for connection in connections:
14471447
connection.disconnect()
14481448

1449+
def set_retry(self, retry: "Retry") -> None:
1450+
self.connection_kwargs.update({"retry": retry})
1451+
for conn in self._available_connections:
1452+
conn.retry = retry
1453+
for conn in self._in_use_connections:
1454+
conn.retry = retry
1455+
14491456

14501457
class BlockingConnectionPool(ConnectionPool):
14511458
"""

tests/test_asyncio/test_cluster.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -260,6 +260,8 @@ async def test_cluster_set_get_retry_object(self, request: FixtureRequest):
260260
assert n_retry is not None
261261
assert n_retry._retries == retry._retries
262262
assert isinstance(n_retry._backoff, NoBackoff)
263+
rand_cluster_node = r.get_random_node()
264+
existing_conn = rand_cluster_node.acquire_connection()
263265
# Change retry policy
264266
new_retry = Retry(ExponentialBackoff(), 3)
265267
r.set_retry(new_retry)
@@ -270,6 +272,9 @@ async def test_cluster_set_get_retry_object(self, request: FixtureRequest):
270272
assert n_retry is not None
271273
assert n_retry._retries == new_retry._retries
272274
assert isinstance(n_retry._backoff, ExponentialBackoff)
275+
assert existing_conn.retry._retries == new_retry._retries
276+
new_conn = rand_cluster_node.acquire_connection()
277+
assert new_conn.retry._retries == new_retry._retries
273278

274279
async def test_cluster_retry_object(self, request: FixtureRequest) -> None:
275280
url = request.config.getoption("--redis-url")

tests/test_asyncio/test_retry.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,10 @@ async def test_get_set_retry_object(self, request):
127127
assert r.get_retry()._retries == retry._retries
128128
assert isinstance(r.get_retry()._backoff, NoBackoff)
129129
new_retry_policy = Retry(ExponentialBackoff(), 3)
130+
exiting_conn = await r.connection_pool.get_connection("_")
130131
r.set_retry(new_retry_policy)
131132
assert r.get_retry()._retries == new_retry_policy._retries
132133
assert isinstance(r.get_retry()._backoff, ExponentialBackoff)
134+
assert exiting_conn.retry._retries == new_retry_policy._retries
135+
new_conn = await r.connection_pool.get_connection("_")
136+
assert new_conn.retry._retries == new_retry_policy._retries

tests/test_cluster.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -749,12 +749,14 @@ def moved_redirect_effect(connection, *args, **options):
749749

750750
def test_cluster_get_set_retry_object(self, request):
751751
retry = Retry(NoBackoff(), 2)
752-
r = _get_client(Redis, request, retry=retry)
752+
r = _get_client(RedisCluster, request, retry=retry)
753753
assert r.get_retry()._retries == retry._retries
754754
assert isinstance(r.get_retry()._backoff, NoBackoff)
755755
for node in r.get_nodes():
756756
assert node.redis_connection.get_retry()._retries == retry._retries
757757
assert isinstance(node.redis_connection.get_retry()._backoff, NoBackoff)
758+
rand_node = r.get_random_node()
759+
existing_conn = rand_node.redis_connection.connection_pool.get_connection("_")
758760
# Change retry policy
759761
new_retry = Retry(ExponentialBackoff(), 3)
760762
r.set_retry(new_retry)
@@ -765,6 +767,9 @@ def test_cluster_get_set_retry_object(self, request):
765767
assert isinstance(
766768
node.redis_connection.get_retry()._backoff, ExponentialBackoff
767769
)
770+
assert existing_conn.retry._retries == new_retry._retries
771+
new_conn = rand_node.redis_connection.connection_pool.get_connection("_")
772+
assert new_conn.retry._retries == new_retry._retries
768773

769774
def test_cluster_retry_object(self, r) -> None:
770775
# Test default retry

tests/test_retry.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -207,9 +207,13 @@ def test_client_retry_on_timeout(self, request):
207207
def test_get_set_retry_object(self, request):
208208
retry = Retry(NoBackoff(), 2)
209209
r = _get_client(Redis, request, retry_on_timeout=True, retry=retry)
210+
exist_conn = r.connection_pool.get_connection("_")
210211
assert r.get_retry()._retries == retry._retries
211212
assert isinstance(r.get_retry()._backoff, NoBackoff)
212213
new_retry_policy = Retry(ExponentialBackoff(), 3)
213214
r.set_retry(new_retry_policy)
214215
assert r.get_retry()._retries == new_retry_policy._retries
215216
assert isinstance(r.get_retry()._backoff, ExponentialBackoff)
217+
assert exist_conn.retry._retries == new_retry_policy._retries
218+
new_conn = r.connection_pool.get_connection("_")
219+
assert new_conn.retry._retries == new_retry_policy._retries

0 commit comments

Comments
 (0)