@@ -134,7 +134,7 @@ def mock_node_resp(
134
134
) -> ClusterNode :
135
135
connection = mock .AsyncMock ()
136
136
connection .is_connected = True
137
- connection .read_response .return_value = response
137
+ connection .read_response_without_lock .return_value = response
138
138
while node ._free :
139
139
node ._free .pop ()
140
140
node ._free .append (connection )
@@ -288,10 +288,10 @@ async def test_execute_command_node_flag_primaries(self, r: RedisCluster) -> Non
288
288
assert await r .ping (target_nodes = RedisCluster .PRIMARIES ) is True
289
289
for primary in primaries :
290
290
conn = primary ._free .pop ()
291
- assert conn .read_response .called is True
291
+ assert conn .read_response_without_lock .called is True
292
292
for replica in replicas :
293
293
conn = replica ._free .pop ()
294
- assert conn .read_response .called is not True
294
+ assert conn .read_response_without_lock .called is not True
295
295
296
296
async def test_execute_command_node_flag_replicas (self , r : RedisCluster ) -> None :
297
297
"""
@@ -305,10 +305,10 @@ async def test_execute_command_node_flag_replicas(self, r: RedisCluster) -> None
305
305
assert await r .ping (target_nodes = RedisCluster .REPLICAS ) is True
306
306
for replica in replicas :
307
307
conn = replica ._free .pop ()
308
- assert conn .read_response .called is True
308
+ assert conn .read_response_without_lock .called is True
309
309
for primary in primaries :
310
310
conn = primary ._free .pop ()
311
- assert conn .read_response .called is not True
311
+ assert conn .read_response_without_lock .called is not True
312
312
313
313
await r .close ()
314
314
@@ -320,7 +320,7 @@ async def test_execute_command_node_flag_all_nodes(self, r: RedisCluster) -> Non
320
320
assert await r .ping (target_nodes = RedisCluster .ALL_NODES ) is True
321
321
for node in r .get_nodes ():
322
322
conn = node ._free .pop ()
323
- assert conn .read_response .called is True
323
+ assert conn .read_response_without_lock .called is True
324
324
325
325
async def test_execute_command_node_flag_random (self , r : RedisCluster ) -> None :
326
326
"""
@@ -331,7 +331,7 @@ async def test_execute_command_node_flag_random(self, r: RedisCluster) -> None:
331
331
called_count = 0
332
332
for node in r .get_nodes ():
333
333
conn = node ._free .pop ()
334
- if conn .read_response .called is True :
334
+ if conn .read_response_without_lock .called is True :
335
335
called_count += 1
336
336
assert called_count == 1
337
337
@@ -344,7 +344,7 @@ async def test_execute_command_default_node(self, r: RedisCluster) -> None:
344
344
mock_node_resp (def_node , "PONG" )
345
345
assert await r .ping () is True
346
346
conn = def_node ._free .pop ()
347
- assert conn .read_response .called
347
+ assert conn .read_response_without_lock .called
348
348
349
349
async def test_ask_redirection (self , r : RedisCluster ) -> None :
350
350
"""
@@ -488,7 +488,7 @@ async def test_reading_from_replicas_in_round_robin(self) -> None:
488
488
with mock .patch .multiple (
489
489
Connection ,
490
490
send_command = mock .DEFAULT ,
491
- read_response = mock .DEFAULT ,
491
+ read_response_without_lock = mock .DEFAULT ,
492
492
_connect = mock .DEFAULT ,
493
493
can_read = mock .DEFAULT ,
494
494
on_connect = mock .DEFAULT ,
@@ -520,7 +520,7 @@ def execute_command_mock_third(self, *args, **options):
520
520
# so we'll mock some of the Connection's functions to allow it
521
521
execute_command .side_effect = execute_command_mock_first
522
522
mocks ["send_command" ].return_value = True
523
- mocks ["read_response " ].return_value = "OK"
523
+ mocks ["read_response_without_lock " ].return_value = "OK"
524
524
mocks ["_connect" ].return_value = True
525
525
mocks ["can_read" ].return_value = False
526
526
mocks ["on_connect" ].return_value = True
@@ -682,6 +682,14 @@ async def test_not_require_full_coverage_cluster_down_error(
682
682
else :
683
683
raise e
684
684
685
+ async def test_can_run_concurrent_commands (self , r : RedisCluster ) -> None :
686
+ assert await r .ping (target_nodes = RedisCluster .ALL_NODES ) is True
687
+ assert all (
688
+ await asyncio .gather (
689
+ * (r .ping (target_nodes = RedisCluster .ALL_NODES ) for _ in range (100 ))
690
+ )
691
+ )
692
+
685
693
686
694
@pytest .mark .onlycluster
687
695
class TestClusterRedisCommands :
@@ -792,7 +800,7 @@ async def test_cluster_addslots(self, r: RedisCluster) -> None:
792
800
793
801
@skip_if_server_version_lt ("7.0.0" )
794
802
@skip_if_redis_enterprise ()
795
- async def test_cluster_addslotsrange (self , r ):
803
+ async def test_cluster_addslotsrange (self , r : RedisCluster ):
796
804
node = r .get_random_node ()
797
805
mock_node_resp (node , "OK" )
798
806
assert await r .cluster_addslotsrange (node , 1 , 5 )
@@ -820,14 +828,14 @@ async def test_cluster_delslots(self) -> None:
820
828
node0 = r .get_node (default_host , 7000 )
821
829
node1 = r .get_node (default_host , 7001 )
822
830
assert await r .cluster_delslots (0 , 8192 ) == [True , True ]
823
- assert node0 ._free .pop ().read_response .called
824
- assert node1 ._free .pop ().read_response .called
831
+ assert node0 ._free .pop ().read_response_without_lock .called
832
+ assert node1 ._free .pop ().read_response_without_lock .called
825
833
826
834
await r .close ()
827
835
828
836
@skip_if_server_version_lt ("7.0.0" )
829
837
@skip_if_redis_enterprise ()
830
- async def test_cluster_delslotsrange (self , r ):
838
+ async def test_cluster_delslotsrange (self , r : RedisCluster ):
831
839
node = r .get_random_node ()
832
840
mock_node_resp (node , "OK" )
833
841
await r .cluster_addslots (node , 1 , 2 , 3 , 4 , 5 )
@@ -990,7 +998,7 @@ async def test_cluster_setslot_stable(self, r: RedisCluster) -> None:
990
998
node = r .nodes_manager .get_node_from_slot (12182 )
991
999
mock_node_resp (node , "OK" )
992
1000
assert await r .cluster_setslot_stable (12182 ) is True
993
- assert node ._free .pop ().read_response .called
1001
+ assert node ._free .pop ().read_response_without_lock .called
994
1002
995
1003
@skip_if_redis_enterprise ()
996
1004
async def test_cluster_replicas (self , r : RedisCluster ) -> None :
@@ -1014,7 +1022,7 @@ async def test_cluster_replicas(self, r: RedisCluster) -> None:
1014
1022
)
1015
1023
1016
1024
@skip_if_server_version_lt ("7.0.0" )
1017
- async def test_cluster_links (self , r ):
1025
+ async def test_cluster_links (self , r : RedisCluster ):
1018
1026
node = r .get_random_node ()
1019
1027
res = await r .cluster_links (node )
1020
1028
links_to = sum (x .count ("to" ) for x in res )
@@ -1032,7 +1040,7 @@ async def test_readonly(self) -> None:
1032
1040
for res in all_replicas_results .values ():
1033
1041
assert res is True
1034
1042
for replica in r .get_replicas ():
1035
- assert replica ._free .pop ().read_response .called
1043
+ assert replica ._free .pop ().read_response_without_lock .called
1036
1044
1037
1045
await r .close ()
1038
1046
@@ -1045,7 +1053,7 @@ async def test_readwrite(self) -> None:
1045
1053
for res in all_replicas_results .values ():
1046
1054
assert res is True
1047
1055
for replica in r .get_replicas ():
1048
- assert replica ._free .pop ().read_response .called
1056
+ assert replica ._free .pop ().read_response_without_lock .called
1049
1057
1050
1058
await r .close ()
1051
1059
0 commit comments