Skip to content

Commit ef3e0e9

Browse files
authored
Merge pull request #839 from go-redis/fix/cluster-loopback-fix
Fix cluster loopback handling. Fixes #589
2 parents 03f0590 + c1c2753 commit ef3e0e9

File tree

1 file changed

+32
-40
lines changed

1 file changed

+32
-40
lines changed

Diff for: cluster.go

+32-40
Original file line numberDiff line numberDiff line change
@@ -438,13 +438,15 @@ func newClusterState(
438438
createdAt: time.Now(),
439439
}
440440

441-
isLoopbackOrigin := isLoopbackAddr(origin)
441+
originHost, _, _ := net.SplitHostPort(origin)
442+
isLoopbackOrigin := isLoopback(originHost)
443+
442444
for _, slot := range slots {
443445
var nodes []*clusterNode
444446
for i, slotNode := range slot.Nodes {
445447
addr := slotNode.Addr
446-
if !isLoopbackOrigin && useOriginAddr(origin, addr) {
447-
addr = origin
448+
if !isLoopbackOrigin {
449+
addr = replaceLoopbackHost(addr, originHost)
448450
}
449451

450452
node, err := c.nodes.GetOrCreate(addr)
@@ -478,6 +480,33 @@ func newClusterState(
478480
return &c, nil
479481
}
480482

483+
func replaceLoopbackHost(nodeAddr, originHost string) string {
484+
nodeHost, nodePort, err := net.SplitHostPort(nodeAddr)
485+
if err != nil {
486+
return nodeAddr
487+
}
488+
489+
nodeIP := net.ParseIP(nodeHost)
490+
if nodeIP == nil {
491+
return nodeAddr
492+
}
493+
494+
if !nodeIP.IsLoopback() {
495+
return nodeAddr
496+
}
497+
498+
// Use origin host which is not loopback and node port.
499+
return net.JoinHostPort(originHost, nodePort)
500+
}
501+
502+
func isLoopback(host string) bool {
503+
ip := net.ParseIP(host)
504+
if ip == nil {
505+
return true
506+
}
507+
return ip.IsLoopback()
508+
}
509+
481510
func (c *clusterState) slotMasterNode(slot int) (*clusterNode, error) {
482511
nodes := c.slotNodes(slot)
483512
if len(nodes) > 0 {
@@ -1565,43 +1594,6 @@ func (c *ClusterClient) PSubscribe(channels ...string) *PubSub {
15651594
return pubsub
15661595
}
15671596

1568-
func useOriginAddr(originAddr, nodeAddr string) bool {
1569-
nodeHost, nodePort, err := net.SplitHostPort(nodeAddr)
1570-
if err != nil {
1571-
return false
1572-
}
1573-
1574-
nodeIP := net.ParseIP(nodeHost)
1575-
if nodeIP == nil {
1576-
return false
1577-
}
1578-
1579-
if !nodeIP.IsLoopback() {
1580-
return false
1581-
}
1582-
1583-
_, originPort, err := net.SplitHostPort(originAddr)
1584-
if err != nil {
1585-
return false
1586-
}
1587-
1588-
return nodePort == originPort
1589-
}
1590-
1591-
func isLoopbackAddr(addr string) bool {
1592-
host, _, err := net.SplitHostPort(addr)
1593-
if err != nil {
1594-
return false
1595-
}
1596-
1597-
ip := net.ParseIP(host)
1598-
if ip == nil {
1599-
return false
1600-
}
1601-
1602-
return ip.IsLoopback()
1603-
}
1604-
16051597
func appendUniqueNode(nodes []*clusterNode, node *clusterNode) []*clusterNode {
16061598
for _, n := range nodes {
16071599
if n == node {

0 commit comments

Comments
 (0)