@@ -3,6 +3,7 @@ package redis
33import (
44 "fmt"
55 "math/rand"
6+ "net"
67 "sync"
78 "sync/atomic"
89 "time"
@@ -244,16 +245,22 @@ type clusterState struct {
244245 slots [][]* clusterNode
245246}
246247
247- func newClusterState (nodes * clusterNodes , slots []ClusterSlot ) (* clusterState , error ) {
248+ func newClusterState (nodes * clusterNodes , slots []ClusterSlot , origin string ) (* clusterState , error ) {
248249 c := clusterState {
249250 nodes : nodes ,
250251 slots : make ([][]* clusterNode , hashtag .SlotNumber ),
251252 }
252253
254+ isLoopbackOrigin := isLoopbackAddr (origin )
253255 for _ , slot := range slots {
254256 var nodes []* clusterNode
255257 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 )
257264 if err != nil {
258265 return nil , err
259266 }
@@ -661,7 +668,7 @@ func (c *ClusterClient) reloadSlots() (*clusterState, error) {
661668 return nil , err
662669 }
663670
664- return newClusterState (c .nodes , slots )
671+ return newClusterState (c .nodes , slots , node . Client . opt . Addr )
665672}
666673
667674// reaper closes idle connections to the cluster.
@@ -960,3 +967,17 @@ func (c *ClusterClient) txPipelineReadQueued(
960967
961968 return firstErr
962969}
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