chore: lazy reload when moved or ask

This commit is contained in:
Vladimir Mihailenco 2021-10-04 13:16:33 +03:00
parent 98bb99ddc2
commit 86258a11a9
3 changed files with 14 additions and 10 deletions

View File

@ -352,7 +352,7 @@ func (c *clusterNodes) GC(generation uint32) {
} }
} }
func (c *clusterNodes) Get(addr string) (*clusterNode, error) { func (c *clusterNodes) GetOrCreate(addr string) (*clusterNode, error) {
node, err := c.get(addr) node, err := c.get(addr)
if err != nil { if err != nil {
return nil, err return nil, err
@ -416,7 +416,7 @@ func (c *clusterNodes) Random() (*clusterNode, error) {
} }
n := rand.Intn(len(addrs)) n := rand.Intn(len(addrs))
return c.Get(addrs[n]) return c.GetOrCreate(addrs[n])
} }
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
@ -474,7 +474,7 @@ func newClusterState(
addr = replaceLoopbackHost(addr, originHost) addr = replaceLoopbackHost(addr, originHost)
} }
node, err := c.nodes.Get(addr) node, err := c.nodes.GetOrCreate(addr)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -824,8 +824,10 @@ func (c *ClusterClient) process(ctx context.Context, cmd Cmder) error {
var addr string var addr string
moved, ask, addr = isMovedError(lastErr) moved, ask, addr = isMovedError(lastErr)
if moved || ask { if moved || ask {
c.state.LazyReload()
var err error var err error
node, err = c.nodes.Get(addr) node, err = c.nodes.GetOrCreate(addr)
if err != nil { if err != nil {
return err return err
} }
@ -1022,7 +1024,7 @@ func (c *ClusterClient) loadState(ctx context.Context) (*clusterState, error) {
for _, idx := range rand.Perm(len(addrs)) { for _, idx := range rand.Perm(len(addrs)) {
addr := addrs[idx] addr := addrs[idx]
node, err := c.nodes.Get(addr) node, err := c.nodes.GetOrCreate(addr)
if err != nil { if err != nil {
if firstErr == nil { if firstErr == nil {
firstErr = err firstErr = err
@ -1236,7 +1238,7 @@ func (c *ClusterClient) checkMovedErr(
return false return false
} }
node, err := c.nodes.Get(addr) node, err := c.nodes.GetOrCreate(addr)
if err != nil { if err != nil {
return false return false
} }
@ -1422,7 +1424,7 @@ func (c *ClusterClient) cmdsMoved(
addr string, addr string,
failedCmds *cmdsMap, failedCmds *cmdsMap,
) error { ) error {
node, err := c.nodes.Get(addr) node, err := c.nodes.GetOrCreate(addr)
if err != nil { if err != nil {
return err return err
} }
@ -1477,7 +1479,7 @@ func (c *ClusterClient) Watch(ctx context.Context, fn func(*Tx) error, keys ...s
moved, ask, addr := isMovedError(err) moved, ask, addr := isMovedError(err)
if moved || ask { if moved || ask {
node, err = c.nodes.Get(addr) node, err = c.nodes.GetOrCreate(addr)
if err != nil { if err != nil {
return err return err
} }
@ -1589,7 +1591,7 @@ func (c *ClusterClient) cmdsInfo(ctx context.Context) (map[string]*CommandInfo,
for _, idx := range perm { for _, idx := range perm {
addr := addrs[idx] addr := addrs[idx]
node, err := c.nodes.Get(addr) node, err := c.nodes.GetOrCreate(addr)
if err != nil { if err != nil {
if firstErr == nil { if firstErr == nil {
firstErr = err firstErr = err

View File

@ -710,7 +710,9 @@ type conn struct {
hooks // TODO: inherit hooks hooks // TODO: inherit hooks
} }
// Conn is like Client, but its pool contains single connection. // Conn represents a single Redis connection rather than a pool of connections.
// Prefer running commands from Client unless there is a specific need
// for a continuous single Redis connection.
type Conn struct { type Conn struct {
*conn *conn
ctx context.Context ctx context.Context