diff --git a/cluster.go b/cluster.go index 9baad73a..e5011544 100644 --- a/cluster.go +++ b/cluster.go @@ -300,6 +300,17 @@ func (c *ClusterClient) Process(cmd Cmder) error { return nil } + // If slave is loading, read from master + if errors.IsLoading(cmd.Err()) && c.opt.ReadOnly { + trynode, err := c.slotMasterNode(slot) + if err == nil && trynode != node { + node = trynode + continue + } else { + break + } + } + // On network errors try random node. if errors.IsRetryable(err) { node, err = c.randomNode() diff --git a/internal/errors/errors.go b/internal/errors/errors.go index a17a3d37..49a80eae 100644 --- a/internal/errors/errors.go +++ b/internal/errors/errors.go @@ -10,6 +10,8 @@ const Nil = RedisError("redis: nil") type RedisError string +var LoadingError RedisError = "LOADING Redis is loading the dataset in memory" + func (e RedisError) Error() string { return string(e) } func IsRetryable(err error) bool { @@ -65,3 +67,7 @@ func IsMoved(err error) (moved bool, ask bool, addr string) { addr = s[ind+1:] return } + +func IsLoading(err error) bool { + return err.Error() == string(LoadingError) +}