Skip to content

Commit bc3192f

Browse files
committed
[GROW-2938] add retry to ClusterPipeline
1 parent aaa212b commit bc3192f

File tree

1 file changed

+13
-6
lines changed

1 file changed

+13
-6
lines changed

redis/cluster.py

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -591,7 +591,8 @@ def __init__(
591591
self.retry = retry
592592
kwargs.update({"retry": self.retry})
593593
else:
594-
kwargs.update({"retry": Retry(default_backoff(), 0)})
594+
self.retry = Retry(default_backoff(), 0)
595+
kwargs['retry'] = self.retry
595596

596597
self.encoder = Encoder(
597598
kwargs.get("encoding", "utf-8"),
@@ -775,6 +776,7 @@ def pipeline(self, transaction=None, shard_hint=None):
775776
read_from_replicas=self.read_from_replicas,
776777
reinitialize_steps=self.reinitialize_steps,
777778
lock=self._lock,
779+
retry=self.retry,
778780
)
779781

780782
def lock(
@@ -1794,6 +1796,7 @@ def __init__(
17941796
cluster_error_retry_attempts: int = 3,
17951797
reinitialize_steps: int = 5,
17961798
lock=None,
1799+
retry: Optional["Retry"] = None,
17971800
**kwargs,
17981801
):
17991802
""" """
@@ -1819,6 +1822,7 @@ def __init__(
18191822
if lock is None:
18201823
lock = threading.Lock()
18211824
self._lock = lock
1825+
self.retry = retry
18221826

18231827
def __repr__(self):
18241828
""" """
@@ -1951,8 +1955,9 @@ def send_cluster_commands(
19511955
stack,
19521956
raise_on_error=raise_on_error,
19531957
allow_redirections=allow_redirections,
1958+
attempts_count=self.cluster_error_retry_attempts - retry_attempts
19541959
)
1955-
except (ClusterDownError, ConnectionError) as e:
1960+
except (ClusterDownError, ConnectionError, TimeoutError) as e:
19561961
if retry_attempts > 0:
19571962
# Try again with the new cluster setup. All other errors
19581963
# should be raised.
@@ -1962,7 +1967,7 @@ def send_cluster_commands(
19621967
raise e
19631968

19641969
def _send_cluster_commands(
1965-
self, stack, raise_on_error=True, allow_redirections=True
1970+
self, stack, raise_on_error=True, allow_redirections=True, attempts_count=0
19661971
):
19671972
"""
19681973
Send a bunch of cluster commands to the redis cluster.
@@ -2017,9 +2022,11 @@ def _send_cluster_commands(
20172022
redis_node = self.get_redis_connection(node)
20182023
try:
20192024
connection = get_connection(redis_node, c.args)
2020-
except ConnectionError:
2021-
# Connection retries are being handled in the node's
2022-
# Retry object. Reinitialize the node -> slot table.
2025+
except (ConnectionError, TimeoutError) as e:
2026+
if self.retry and isinstance(e, self.retry._supported_errors):
2027+
backoff = self.retry._backoff.compute(attempts_count)
2028+
if backoff > 0:
2029+
time.sleep(backoff)
20232030
self.nodes_manager.initialize()
20242031
if is_default_node:
20252032
self.replace_default_node()

0 commit comments

Comments
 (0)