@@ -3,6 +3,7 @@ package redis
3
3
import (
4
4
"fmt"
5
5
"math/rand"
6
+ "net"
6
7
"sync"
7
8
"sync/atomic"
8
9
"time"
@@ -244,7 +245,7 @@ type clusterState struct {
244
245
slots [][]* clusterNode
245
246
}
246
247
247
- func newClusterState (nodes * clusterNodes , slots []ClusterSlot ) (* clusterState , error ) {
248
+ func newClusterState (nodes * clusterNodes , slots []ClusterSlot , origin string ) (* clusterState , error ) {
248
249
c := clusterState {
249
250
nodes : nodes ,
250
251
slots : make ([][]* clusterNode , hashtag .SlotNumber ),
@@ -253,7 +254,12 @@ func newClusterState(nodes *clusterNodes, slots []ClusterSlot) (*clusterState, e
253
254
for _ , slot := range slots {
254
255
var nodes []* clusterNode
255
256
for _ , slotNode := range slot .Nodes {
256
- node , err := c .nodes .Get (slotNode .Addr )
257
+ addr := slotNode .Addr
258
+ if isLoopbackAddr (addr ) && ! isLoopbackAddr (origin ) {
259
+ addr = origin
260
+ }
261
+
262
+ node , err := c .nodes .Get (addr )
257
263
if err != nil {
258
264
return nil , err
259
265
}
@@ -661,7 +667,7 @@ func (c *ClusterClient) reloadSlots() (*clusterState, error) {
661
667
return nil , err
662
668
}
663
669
664
- return newClusterState (c .nodes , slots )
670
+ return newClusterState (c .nodes , slots , node . Client . opt . Addr )
665
671
}
666
672
667
673
// reaper closes idle connections to the cluster.
@@ -960,3 +966,17 @@ func (c *ClusterClient) txPipelineReadQueued(
960
966
961
967
return firstErr
962
968
}
969
+
970
+ func isLoopbackAddr (addr string ) bool {
971
+ host , _ , err := net .SplitHostPort (addr )
972
+ if err != nil {
973
+ return false
974
+ }
975
+
976
+ ip := net .ParseIP (host )
977
+ if ip == nil {
978
+ return false
979
+ }
980
+
981
+ return ip .IsLoopback ()
982
+ }
0 commit comments