@@ -438,13 +438,15 @@ func newClusterState(
438
438
createdAt : time .Now (),
439
439
}
440
440
441
- isLoopbackOrigin := isLoopbackAddr (origin )
441
+ originHost , _ , _ := net .SplitHostPort (origin )
442
+ isLoopbackOrigin := isLoopback (originHost )
443
+
442
444
for _ , slot := range slots {
443
445
var nodes []* clusterNode
444
446
for i , slotNode := range slot .Nodes {
445
447
addr := slotNode .Addr
446
- if ! isLoopbackOrigin && useOriginAddr ( origin , addr ) {
447
- addr = origin
448
+ if ! isLoopbackOrigin {
449
+ addr = replaceLoopbackHost ( addr , originHost )
448
450
}
449
451
450
452
node , err := c .nodes .GetOrCreate (addr )
@@ -478,6 +480,33 @@ func newClusterState(
478
480
return & c , nil
479
481
}
480
482
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
+
481
510
func (c * clusterState ) slotMasterNode (slot int ) (* clusterNode , error ) {
482
511
nodes := c .slotNodes (slot )
483
512
if len (nodes ) > 0 {
@@ -1565,43 +1594,6 @@ func (c *ClusterClient) PSubscribe(channels ...string) *PubSub {
1565
1594
return pubsub
1566
1595
}
1567
1596
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
-
1605
1597
func appendUniqueNode (nodes []* clusterNode , node * clusterNode ) []* clusterNode {
1606
1598
for _ , n := range nodes {
1607
1599
if n == node {
0 commit comments