From d7ba255394435f444ec274b49c8464eac1cb3568 Mon Sep 17 00:00:00 2001 From: ofekshenawa <104765379+ofekshenawa@users.noreply.github.com> Date: Wed, 21 May 2025 13:58:21 +0300 Subject: [PATCH] fix: prevent routing reads to loading slave nodes (#3370) Co-authored-by: Nedyalko Dyakov <1547186+ndyakov@users.noreply.github.com> --- osscluster.go | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/osscluster.go b/osscluster.go index 2365f771..cc2444fa 100644 --- a/osscluster.go +++ b/osscluster.go @@ -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 { @@ -754,7 +762,8 @@ func (c *clusterState) slotSlaveNode(slot int) (*clusterNode, error) { case 1: return nodes[0], nil case 2: - if slave := nodes[1]; !slave.Failing() { + slave := nodes[1] + if !slave.Failing() && !slave.Loading() { return slave, nil } return nodes[0], nil @@ -763,7 +772,7 @@ func (c *clusterState) slotSlaveNode(slot int) (*clusterNode, error) { for i := 0; i < 10; i++ { n := rand.Intn(len(nodes)-1) + 1 slave = nodes[n] - if !slave.Failing() { + if !slave.Failing() && !slave.Loading() { return slave, nil } }