From 1c4362558d816c28f9c43892f814bb60311ad177 Mon Sep 17 00:00:00 2001 From: Petya Slavova Date: Fri, 2 May 2025 15:47:54 +0300 Subject: [PATCH 1/2] Prevent RuntimeError while reinitializing clusters - sync and async --- redis/asyncio/cluster.py | 2 +- redis/cluster.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/redis/asyncio/cluster.py b/redis/asyncio/cluster.py index b066a100f6..03be5f8122 100644 --- a/redis/asyncio/cluster.py +++ b/redis/asyncio/cluster.py @@ -1313,7 +1313,7 @@ async def initialize(self) -> None: startup_nodes_reachable = False fully_covered = False exception = None - for startup_node in self.startup_nodes.values(): + for startup_node in tuple(self.startup_nodes.values()): try: # Make sure cluster mode is enabled on this node try: diff --git a/redis/cluster.py b/redis/cluster.py index c79f8e429d..12543069d4 100644 --- a/redis/cluster.py +++ b/redis/cluster.py @@ -1674,7 +1674,7 @@ def initialize(self): fully_covered = False kwargs = self.connection_kwargs exception = None - for startup_node in self.startup_nodes.values(): + for startup_node in tuple(self.startup_nodes.values()): try: if startup_node.redis_connection: r = startup_node.redis_connection From 3542c6118a098576c7655c26e1a70a8a60e07fe1 Mon Sep 17 00:00:00 2001 From: Petya Slavova Date: Mon, 5 May 2025 10:58:15 +0300 Subject: [PATCH 2/2] Applying copilot's review comments --- redis/asyncio/cluster.py | 2 ++ redis/cluster.py | 2 ++ 2 files changed, 4 insertions(+) diff --git a/redis/asyncio/cluster.py b/redis/asyncio/cluster.py index 03be5f8122..6044edc23a 100644 --- a/redis/asyncio/cluster.py +++ b/redis/asyncio/cluster.py @@ -1313,6 +1313,8 @@ async def initialize(self) -> None: startup_nodes_reachable = False fully_covered = False exception = None + # Convert to tuple to prevent RuntimeError if self.startup_nodes + # is modified during iteration for startup_node in tuple(self.startup_nodes.values()): try: # Make sure cluster mode is enabled on this node diff --git a/redis/cluster.py b/redis/cluster.py index 12543069d4..09d6d0c004 100644 --- a/redis/cluster.py +++ b/redis/cluster.py @@ -1674,6 +1674,8 @@ def initialize(self): fully_covered = False kwargs = self.connection_kwargs exception = None + # Convert to tuple to prevent RuntimeError if self.startup_nodes + # is modified during iteration for startup_node in tuple(self.startup_nodes.values()): try: if startup_node.redis_connection: