@@ -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,16 +245,22 @@ 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 ),
251
252
}
252
253
254
+ isLoopbackOrigin := isLoopbackAddr (origin )
253
255
for _ , slot := range slots {
254
256
var nodes []* clusterNode
255
257
for _ , slotNode := range slot .Nodes {
256
- node , err := c .nodes .Get (slotNode .Addr )
258
+ addr := slotNode .Addr
259
+ if ! isLoopbackOrigin && isLoopbackAddr (addr ) {
260
+ addr = origin
261
+ }
262
+
263
+ node , err := c .nodes .Get (addr )
257
264
if err != nil {
258
265
return nil , err
259
266
}
@@ -661,7 +668,7 @@ func (c *ClusterClient) reloadSlots() (*clusterState, error) {
661
668
return nil , err
662
669
}
663
670
664
- return newClusterState (c .nodes , slots )
671
+ return newClusterState (c .nodes , slots , node . Client . opt . Addr )
665
672
}
666
673
667
674
// reaper closes idle connections to the cluster.
@@ -960,3 +967,17 @@ func (c *ClusterClient) txPipelineReadQueued(
960
967
961
968
return firstErr
962
969
}
970
+
971
+ func isLoopbackAddr (addr string ) bool {
972
+ host , _ , err := net .SplitHostPort (addr )
973
+ if err != nil {
974
+ return false
975
+ }
976
+
977
+ ip := net .ParseIP (host )
978
+ if ip == nil {
979
+ return false
980
+ }
981
+
982
+ return ip .IsLoopback ()
983
+ }
0 commit comments