Skip to content

Commit efdbb32

Browse files
authored
Merge pull request #589 from go-redis/fix/avoid-cluster-loopback
Use node address instead of relying on loopback reported by redis
2 parents b52814f + 94ea195 commit efdbb32

File tree

2 files changed

+26
-5
lines changed

2 files changed

+26
-5
lines changed

Diff for: cluster.go

+24-3
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package redis
33
import (
44
"fmt"
55
"math/rand"
6+
"net"
67
"sync"
78
"sync/atomic"
89
"time"
@@ -244,16 +245,22 @@ type clusterState struct {
244245
slots [][]*clusterNode
245246
}
246247

247-
func newClusterState(nodes *clusterNodes, slots []ClusterSlot) (*clusterState, error) {
248+
func newClusterState(nodes *clusterNodes, slots []ClusterSlot, origin string) (*clusterState, error) {
248249
c := clusterState{
249250
nodes: nodes,
250251
slots: make([][]*clusterNode, hashtag.SlotNumber),
251252
}
252253

254+
isLoopbackOrigin := isLoopbackAddr(origin)
253255
for _, slot := range slots {
254256
var nodes []*clusterNode
255257
for _, slotNode := range slot.Nodes {
256-
node, err := c.nodes.Get(slotNode.Addr)
258+
addr := slotNode.Addr
259+
if !isLoopbackOrigin && isLoopbackAddr(addr) {
260+
addr = origin
261+
}
262+
263+
node, err := c.nodes.Get(addr)
257264
if err != nil {
258265
return nil, err
259266
}
@@ -661,7 +668,7 @@ func (c *ClusterClient) reloadSlots() (*clusterState, error) {
661668
return nil, err
662669
}
663670

664-
return newClusterState(c.nodes, slots)
671+
return newClusterState(c.nodes, slots, node.Client.opt.Addr)
665672
}
666673

667674
// reaper closes idle connections to the cluster.
@@ -960,3 +967,17 @@ func (c *ClusterClient) txPipelineReadQueued(
960967

961968
return firstErr
962969
}
970+
971+
func isLoopbackAddr(addr string) bool {
972+
host, _, err := net.SplitHostPort(addr)
973+
if err != nil {
974+
return false
975+
}
976+
977+
ip := net.ParseIP(host)
978+
if ip == nil {
979+
return false
980+
}
981+
982+
return ip.IsLoopback()
983+
}

Diff for: commands_test.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -2888,12 +2888,12 @@ var _ = Describe("Commands", func() {
28882888
It("returns map of commands", func() {
28892889
cmds, err := client.Command().Result()
28902890
Expect(err).NotTo(HaveOccurred())
2891-
Expect(len(cmds)).To(BeNumerically("~", 173, 5))
2891+
Expect(len(cmds)).To(BeNumerically("~", 180, 10))
28922892

28932893
cmd := cmds["mget"]
28942894
Expect(cmd.Name).To(Equal("mget"))
28952895
Expect(cmd.Arity).To(Equal(int8(-2)))
2896-
Expect(cmd.Flags).To(Equal([]string{"readonly"}))
2896+
Expect(cmd.Flags).To(ContainElement("readonly"))
28972897
Expect(cmd.FirstKeyPos).To(Equal(int8(1)))
28982898
Expect(cmd.LastKeyPos).To(Equal(int8(-1)))
28992899
Expect(cmd.StepCount).To(Equal(int8(1)))

0 commit comments

Comments
 (0)