Skip to content

Commit c1c2753

Browse files
committed
Fix cluster loopback handling. Fixes #589
1 parent 8ebf0b7 commit c1c2753

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
@@ -437,13 +437,15 @@ func newClusterState(
437437
createdAt: time.Now(),
438438
}
439439

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

449451
node, err := c.nodes.GetOrCreate(addr)
@@ -477,6 +479,33 @@ func newClusterState(
477479
return &c, nil
478480
}
479481

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

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

0 commit comments

Comments
 (0)