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