Skip to content

Commit f85fe76

Browse files
committed
[GROW-2938] add a test for pipeline additional backoff
1 parent 0b4c56c commit f85fe76

File tree

1 file changed

+47
-6
lines changed

1 file changed

+47
-6
lines changed

tests/test_cluster.py

Lines changed: 47 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414

1515
import pytest
1616

17-
from redis import Redis, crc
17+
from redis import Redis
1818
from redis.backoff import (
1919
ConstantBackoff,
2020
ExponentialBackoff,
@@ -928,7 +928,7 @@ def raise_error(target_node, *args, **kwargs):
928928
rc = get_mocked_redis_client(
929929
host=default_host,
930930
port=default_port,
931-
retry=Retry(ConstantBackoff(1), 3),
931+
retry=Retry(ConstantBackoff(1), 10),
932932
)
933933

934934
with pytest.raises(error):
@@ -2662,17 +2662,32 @@ def test_return_primary_if_invalid_node_index_is_returned(self, invalid_index):
26622662
url="redis://[email protected]:7000",
26632663
cluster_slots=default_cluster_slots,
26642664
)
2665-
random_slot = random.randint(default_cluster_slots[0][0], default_cluster_slots[0][1])
2665+
random_slot = random.randint(
2666+
default_cluster_slots[0][0],
2667+
default_cluster_slots[0][1]
2668+
)
26662669

26672670
ports = set()
26682671
for _ in range(0, 10):
2669-
ports.add(rc.nodes_manager.get_node_from_slot(random_slot, read_from_replicas=True).port)
2672+
ports.add(
2673+
rc.nodes_manager.get_node_from_slot(
2674+
random_slot,
2675+
read_from_replicas=True
2676+
).port
2677+
)
26702678
assert ports == {default_port, 7003}
26712679

26722680
ports = set()
2673-
with mock.patch.object(LoadBalancer, "get_server_index", return_value=invalid_index):
2681+
with mock.patch.object(
2682+
LoadBalancer, "get_server_index", return_value=invalid_index
2683+
):
26742684
for _ in range(0, 10):
2675-
ports.add(rc.nodes_manager.get_node_from_slot(random_slot, read_from_replicas=True).port)
2685+
ports.add(
2686+
rc.nodes_manager.get_node_from_slot(
2687+
random_slot,
2688+
read_from_replicas=True
2689+
).port
2690+
)
26762691
assert ports == {default_port}
26772692

26782693

@@ -3078,6 +3093,32 @@ def test_empty_stack(self, r):
30783093
result = p.execute()
30793094
assert result == []
30803095

3096+
@pytest.mark.parametrize("error", [ConnectionError, TimeoutError])
3097+
def test_additional_backoff_cluster_pipeline(self, r, error):
3098+
with patch.object(ConstantBackoff, "compute") as compute:
3099+
3100+
def _compute(target_node, *args, **kwargs):
3101+
return 1
3102+
3103+
compute.side_effect = _compute
3104+
with patch("redis.cluster.get_connection") as get_connection:
3105+
3106+
def raise_error(target_node, *args, **kwargs):
3107+
get_connection.failed_calls += 1
3108+
raise error("mocked error")
3109+
3110+
get_connection.side_effect = raise_error
3111+
3112+
r.set_retry(Retry(ConstantBackoff(1), 10))
3113+
pipeline = r.pipeline()
3114+
3115+
with pytest.raises(error):
3116+
pipeline.get("bar")
3117+
pipeline.get("bar")
3118+
pipeline.execute()
3119+
# cluster pipeline does one more back off than a single Redis command
3120+
# this is not required, but it's just how it's implemented as of now
3121+
assert compute.call_count == r.cluster_error_retry_attempts + 1
30813122

30823123
@pytest.mark.onlycluster
30833124
class TestReadOnlyPipeline:

0 commit comments

Comments
 (0)