1
0
mirror of https://github.com/redis/go-redis.git synced 2025-06-06 17:40:59 +03:00

fix: prevent routing reads to loading slave nodes

This commit is contained in:
ofekshenawa 2025-05-07 18:03:01 +03:00
parent 8ba559ca5d
commit 045948eb21

View File

@ -445,6 +445,14 @@ func (n *clusterNode) SetLastLatencyMeasurement(t time.Time) {
} }
} }
func (n *clusterNode) Loading() bool {
ctx, cancel := context.WithTimeout(context.Background(), 100*time.Millisecond)
defer cancel()
err := n.Client.Ping(ctx).Err()
return err != nil && isLoadingError(err)
}
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
type clusterNodes struct { type clusterNodes struct {
@ -754,7 +762,8 @@ func (c *clusterState) slotSlaveNode(slot int) (*clusterNode, error) {
case 1: case 1:
return nodes[0], nil return nodes[0], nil
case 2: case 2:
if slave := nodes[1]; !slave.Failing() { slave := nodes[1]
if !slave.Failing() && !slave.Loading() {
return slave, nil return slave, nil
} }
return nodes[0], nil return nodes[0], nil
@ -763,7 +772,7 @@ func (c *clusterState) slotSlaveNode(slot int) (*clusterNode, error) {
for i := 0; i < 10; i++ { for i := 0; i < 10; i++ {
n := rand.Intn(len(nodes)-1) + 1 n := rand.Intn(len(nodes)-1) + 1
slave = nodes[n] slave = nodes[n]
if !slave.Failing() { if !slave.Failing() && !slave.Loading() {
return slave, nil return slave, nil
} }
} }