mirror of
https://github.com/redis/go-redis.git
synced 2025-07-31 05:04:23 +03:00
Use node address instead of relying on loopback reported by redis
This commit is contained in:
committed by
Vladimir Mihailenco
parent
b52814fa17
commit
94ea195dc1
27
cluster.go
27
cluster.go
@ -3,6 +3,7 @@ package redis
|
||||
import (
|
||||
"fmt"
|
||||
"math/rand"
|
||||
"net"
|
||||
"sync"
|
||||
"sync/atomic"
|
||||
"time"
|
||||
@ -244,16 +245,22 @@ type clusterState struct {
|
||||
slots [][]*clusterNode
|
||||
}
|
||||
|
||||
func newClusterState(nodes *clusterNodes, slots []ClusterSlot) (*clusterState, error) {
|
||||
func newClusterState(nodes *clusterNodes, slots []ClusterSlot, origin string) (*clusterState, error) {
|
||||
c := clusterState{
|
||||
nodes: nodes,
|
||||
slots: make([][]*clusterNode, hashtag.SlotNumber),
|
||||
}
|
||||
|
||||
isLoopbackOrigin := isLoopbackAddr(origin)
|
||||
for _, slot := range slots {
|
||||
var nodes []*clusterNode
|
||||
for _, slotNode := range slot.Nodes {
|
||||
node, err := c.nodes.Get(slotNode.Addr)
|
||||
addr := slotNode.Addr
|
||||
if !isLoopbackOrigin && isLoopbackAddr(addr) {
|
||||
addr = origin
|
||||
}
|
||||
|
||||
node, err := c.nodes.Get(addr)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@ -661,7 +668,7 @@ func (c *ClusterClient) reloadSlots() (*clusterState, error) {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return newClusterState(c.nodes, slots)
|
||||
return newClusterState(c.nodes, slots, node.Client.opt.Addr)
|
||||
}
|
||||
|
||||
// reaper closes idle connections to the cluster.
|
||||
@ -960,3 +967,17 @@ func (c *ClusterClient) txPipelineReadQueued(
|
||||
|
||||
return firstErr
|
||||
}
|
||||
|
||||
func isLoopbackAddr(addr string) bool {
|
||||
host, _, err := net.SplitHostPort(addr)
|
||||
if err != nil {
|
||||
return false
|
||||
}
|
||||
|
||||
ip := net.ParseIP(host)
|
||||
if ip == nil {
|
||||
return false
|
||||
}
|
||||
|
||||
return ip.IsLoopback()
|
||||
}
|
||||
|
Reference in New Issue
Block a user