From 1e74fb9177de6c54d7d3024792a2db644ce090e9 Mon Sep 17 00:00:00 2001 From: Sergey Zagursky Date: Wed, 16 Apr 2025 16:02:25 +0100 Subject: [PATCH] Trigger topology refresh on CLUSTERDOWN When Redis cluster topology changes quickly, we may encounter a replica that was detached from its master and removed from the cluster. The driver, however, may still have this replica in topology. Sending requests to this replica trigger CLUSTERDOWN responses. To facilitate faster recovery we may force topology request. This is exactly what this commit does. --- redis/error.go | 2 ++ redis/reader.go | 3 +++ 2 files changed, 5 insertions(+) diff --git a/redis/error.go b/redis/error.go index 3aa490f..8442ce2 100644 --- a/redis/error.go +++ b/redis/error.go @@ -69,6 +69,8 @@ var ( ErrMoved = ErrResult.NewSubtype("moved", ErrTraitClusterMove) // ErrAsk - ASK response ErrAsk = ErrResult.NewSubtype("ask", ErrTraitClusterMove) + // ErrClusterDown - CLUSTERDOWN response + ErrClusterDown = ErrResult.NewSubtype("clusterdown", ErrTraitNotSent) // ErrLoading - redis didn't finish start ErrLoading = ErrResult.NewSubtype("loading", ErrTraitNotSent) // ErrExecEmpty - EXEC returns nil (WATCH failed) (it is strange, cause we don't support WATCH) diff --git a/redis/reader.go b/redis/reader.go index e49e535..ac05ffd 100644 --- a/redis/reader.go +++ b/redis/reader.go @@ -48,6 +48,9 @@ func ReadResponse(b *bufio.Reader) (interface{}, int) { } return kind.New(txt).WithProperty(EKMovedTo, string(parts[2])).WithProperty(EKSlot, slot), len(line) } + if strings.HasPrefix(txt, "CLUSTERDOWN") { + return ErrClusterDown.New(txt), len(line) + } if strings.HasPrefix(txt, "LOADING") { return ErrLoading.New(txt), len(line) }