From cae46735d78be7d24469689c62ddeb2008162a2c Mon Sep 17 00:00:00 2001 From: chjnett Date: Mon, 17 Aug 2026 18:52:40 +0900 Subject: [PATCH] fix(caching): guard Redis disconnect when pool is None and close cluster client --- litellm/caching/redis_cache.py | 3 ++- litellm/caching/redis_cluster_cache.py | 13 +++++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/litellm/caching/redis_cache.py b/litellm/caching/redis_cache.py index f1c80eaacbe..90adda6b1cc 100644 --- a/litellm/caching/redis_cache.py +++ b/litellm/caching/redis_cache.py @@ -1370,7 +1370,8 @@ class RedisCache(BaseCache): self.redis_client.flushall() async def disconnect(self): - await self.async_redis_conn_pool.disconnect(inuse_connections=True) + if self.async_redis_conn_pool is not None: + await self.async_redis_conn_pool.disconnect(inuse_connections=True) try: self.redis_client.close() except Exception as e: diff --git a/litellm/caching/redis_cluster_cache.py b/litellm/caching/redis_cluster_cache.py index 12d285ca5a8..12903fd649d 100644 --- a/litellm/caching/redis_cluster_cache.py +++ b/litellm/caching/redis_cluster_cache.py @@ -56,6 +56,19 @@ class RedisClusterCache(RedisCache): async_redis_cluster_client: Final = self.init_async_client() return await async_redis_cluster_client.mget_nonatomic(keys=keys) + async def disconnect(self): + """ + Overrides `disconnect` in redis_cache.py. + + In cluster mode ``get_redis_connection_pool`` returns ``None`` (the + ``RedisCluster`` client builds its own per-node pools), so the base-class + implementation would dereference ``None``. Close the cluster client instead, + then let the base class tear down the sync client. + """ + if self.redis_async_redis_cluster_client is not None: + await self.redis_async_redis_cluster_client.aclose() + await super().disconnect() + async def test_connection(self) -> dict: """ Test the Redis Cluster connection.