From 377ea03fd5d1eef81bae6b874e418eab015ae967 Mon Sep 17 00:00:00 2001 From: rhoboro Date: Tue, 30 Sep 2025 17:46:03 +0900 Subject: [PATCH] Hold references to ClusterNode disconnect task --- redis/asyncio/cluster.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/redis/asyncio/cluster.py b/redis/asyncio/cluster.py index 225fd3b79f..5fd39d7d6b 100644 --- a/redis/asyncio/cluster.py +++ b/redis/asyncio/cluster.py @@ -1268,6 +1268,7 @@ class NodesManager: "_dynamic_startup_nodes", "_moved_exception", "_event_dispatcher", + "_background_tasks", "connection_kwargs", "default_node", "nodes_cache", @@ -1297,6 +1298,7 @@ def __init__( self.slots_cache: Dict[int, List["ClusterNode"]] = {} self.read_load_balancer = LoadBalancer() + self._background_tasks: Set[asyncio.Task] = set() self._dynamic_startup_nodes: bool = dynamic_startup_nodes self._moved_exception: MovedError = None if event_dispatcher is None: @@ -1331,13 +1333,17 @@ def set_nodes( if remove_old: for name in list(old.keys()): if name not in new: - task = asyncio.create_task(old.pop(name).disconnect()) # noqa + task = asyncio.create_task(old.pop(name).disconnect()) + self._background_tasks.add(task) + task.add_done_callback(self._background_tasks.discard) for name, node in new.items(): if name in old: if old[name] is node: continue - task = asyncio.create_task(old[name].disconnect()) # noqa + task = asyncio.create_task(old[name].disconnect()) + self._background_tasks.add(task) + task.add_done_callback(self._background_tasks.discard) old[name] = node def update_moved_exception(self, exception):