@@ -170,17 +170,19 @@ func (opt *ClusterOptions) clientOptions() *Options {
170170//------------------------------------------------------------------------------
171171
172172type clusterNode struct {
173+ id string
173174 Client * Client
174175
175176 latency uint32 // atomic
176177 generation uint32 // atomic
177178 failing uint32 // atomic
178179}
179180
180- func newClusterNode (clOpt * ClusterOptions , addr string ) * clusterNode {
181+ func newClusterNode (clOpt * ClusterOptions , id , addr string ) * clusterNode {
181182 opt := clOpt .clientOptions ()
182183 opt .Addr = addr
183184 node := clusterNode {
185+ id : id ,
184186 Client : clOpt .NewClient (opt ),
185187 }
186188
@@ -352,12 +354,16 @@ func (c *clusterNodes) GC(generation uint32) {
352354 }
353355}
354356
355- func (c * clusterNodes ) Get (addr string ) (* clusterNode , error ) {
357+ func (c * clusterNodes ) GetOrCreate (addr string ) (* clusterNode , error ) {
358+ return c .GetOrCreateWithID (addr , "" )
359+ }
360+
361+ func (c * clusterNodes ) GetOrCreateWithID (addr , id string ) (* clusterNode , error ) {
356362 node , err := c .get (addr )
357363 if err != nil {
358364 return nil , err
359365 }
360- if node != nil {
366+ if node != nil && ( id == "" || node . id == id ) {
361367 return node , nil
362368 }
363369
@@ -370,10 +376,13 @@ func (c *clusterNodes) Get(addr string) (*clusterNode, error) {
370376
371377 node , ok := c .nodes [addr ]
372378 if ok {
373- return node , nil
379+ if id == "" || node .id == id {
380+ return node , nil
381+ }
382+ delete (c .nodes , addr )
374383 }
375384
376- node = newClusterNode (c .opt , addr )
385+ node = newClusterNode (c .opt , id , addr )
377386
378387 c .addrs = appendIfNotExists (c .addrs , addr )
379388 c .nodes [addr ] = node
@@ -416,7 +425,7 @@ func (c *clusterNodes) Random() (*clusterNode, error) {
416425 }
417426
418427 n := rand .Intn (len (addrs ))
419- return c .Get (addrs [n ])
428+ return c .GetOrCreate (addrs [n ])
420429}
421430
422431//------------------------------------------------------------------------------
@@ -474,7 +483,7 @@ func newClusterState(
474483 addr = replaceLoopbackHost (addr , originHost )
475484 }
476485
477- node , err := c .nodes .Get (addr )
486+ node , err := c .nodes .GetOrCreateWithID (addr , slotNode . ID )
478487 if err != nil {
479488 return nil , err
480489 }
@@ -824,8 +833,10 @@ func (c *ClusterClient) process(ctx context.Context, cmd Cmder) error {
824833 var addr string
825834 moved , ask , addr = isMovedError (lastErr )
826835 if moved || ask {
836+ c .state .LazyReload ()
837+
827838 var err error
828- node , err = c .nodes .Get (addr )
839+ node , err = c .nodes .GetOrCreate (addr )
829840 if err != nil {
830841 return err
831842 }
@@ -1022,7 +1033,7 @@ func (c *ClusterClient) loadState(ctx context.Context) (*clusterState, error) {
10221033 for _ , idx := range rand .Perm (len (addrs )) {
10231034 addr := addrs [idx ]
10241035
1025- node , err := c .nodes .Get (addr )
1036+ node , err := c .nodes .GetOrCreate (addr )
10261037 if err != nil {
10271038 if firstErr == nil {
10281039 firstErr = err
@@ -1236,7 +1247,7 @@ func (c *ClusterClient) checkMovedErr(
12361247 return false
12371248 }
12381249
1239- node , err := c .nodes .Get (addr )
1250+ node , err := c .nodes .GetOrCreate (addr )
12401251 if err != nil {
12411252 return false
12421253 }
@@ -1422,7 +1433,7 @@ func (c *ClusterClient) cmdsMoved(
14221433 addr string ,
14231434 failedCmds * cmdsMap ,
14241435) error {
1425- node , err := c .nodes .Get (addr )
1436+ node , err := c .nodes .GetOrCreate (addr )
14261437 if err != nil {
14271438 return err
14281439 }
@@ -1477,7 +1488,7 @@ func (c *ClusterClient) Watch(ctx context.Context, fn func(*Tx) error, keys ...s
14771488
14781489 moved , ask , addr := isMovedError (err )
14791490 if moved || ask {
1480- node , err = c .nodes .Get (addr )
1491+ node , err = c .nodes .GetOrCreate (addr )
14811492 if err != nil {
14821493 return err
14831494 }
@@ -1589,7 +1600,7 @@ func (c *ClusterClient) cmdsInfo(ctx context.Context) (map[string]*CommandInfo,
15891600 for _ , idx := range perm {
15901601 addr := addrs [idx ]
15911602
1592- node , err := c .nodes .Get (addr )
1603+ node , err := c .nodes .GetOrCreate (addr )
15931604 if err != nil {
15941605 if firstErr == nil {
15951606 firstErr = err
0 commit comments