@@ -391,16 +391,19 @@ type clusterState struct {
391
391
slots [][]* clusterNode
392
392
393
393
generation uint32
394
+ createdAt time.Time
394
395
}
395
396
396
397
func newClusterState (
397
398
nodes * clusterNodes , slots []ClusterSlot , origin string ,
398
399
) (* clusterState , error ) {
399
400
c := clusterState {
400
- nodes : nodes ,
401
- generation : nodes .NextGeneration (),
401
+ nodes : nodes ,
402
402
403
403
slots : make ([][]* clusterNode , hashtag .SlotNumber ),
404
+
405
+ generation : nodes .NextGeneration (),
406
+ createdAt : time .Now (),
404
407
}
405
408
406
409
isLoopbackOrigin := isLoopbackAddr (origin )
@@ -534,8 +537,8 @@ type clusterStateHolder struct {
534
537
535
538
state atomic.Value
536
539
537
- lastErrMu sync.RWMutex
538
- lastErr error
540
+ firstErrMu sync.RWMutex
541
+ firstErr error
539
542
540
543
reloading uint32 // atomic
541
544
}
@@ -560,9 +563,11 @@ func (c *clusterStateHolder) Reload() (*clusterState, error) {
560
563
func (c * clusterStateHolder ) reload () (* clusterState , error ) {
561
564
state , err := c .load ()
562
565
if err != nil {
563
- c .lastErrMu .Lock ()
564
- c .lastErr = err
565
- c .lastErrMu .Unlock ()
566
+ c .firstErrMu .Lock ()
567
+ if c .firstErr == nil {
568
+ c .firstErr = err
569
+ }
570
+ c .firstErrMu .Unlock ()
566
571
return nil , err
567
572
}
568
573
c .state .Store (state )
@@ -592,12 +597,16 @@ func (c *clusterStateHolder) LazyReload() {
592
597
func (c * clusterStateHolder ) Get () (* clusterState , error ) {
593
598
v := c .state .Load ()
594
599
if v != nil {
595
- return v .(* clusterState ), nil
600
+ state := v .(* clusterState )
601
+ if time .Since (state .createdAt ) > time .Minute {
602
+ c .LazyReload ()
603
+ }
604
+ return state , nil
596
605
}
597
606
598
- c .lastErrMu .RLock ()
599
- err := c .lastErr
600
- c .lastErrMu .RUnlock ()
607
+ c .firstErrMu .RLock ()
608
+ err := c .firstErr
609
+ c .firstErrMu .RUnlock ()
601
610
if err != nil {
602
611
return nil , err
603
612
}
@@ -930,9 +939,12 @@ func (c *ClusterClient) defaultProcess(cmd Cmder) error {
930
939
// ForEachMaster concurrently calls the fn on each master node in the cluster.
931
940
// It returns the first error if any.
932
941
func (c * ClusterClient ) ForEachMaster (fn func (client * Client ) error ) error {
933
- state , err := c .state .Get ()
942
+ state , err := c .state .Reload ()
934
943
if err != nil {
935
- return err
944
+ state , err = c .state .Get ()
945
+ if err != nil {
946
+ return err
947
+ }
936
948
}
937
949
938
950
var wg sync.WaitGroup
@@ -963,9 +975,12 @@ func (c *ClusterClient) ForEachMaster(fn func(client *Client) error) error {
963
975
// ForEachSlave concurrently calls the fn on each slave node in the cluster.
964
976
// It returns the first error if any.
965
977
func (c * ClusterClient ) ForEachSlave (fn func (client * Client ) error ) error {
966
- state , err := c .state .Get ()
978
+ state , err := c .state .Reload ()
967
979
if err != nil {
968
- return err
980
+ state , err = c .state .Get ()
981
+ if err != nil {
982
+ return err
983
+ }
969
984
}
970
985
971
986
var wg sync.WaitGroup
@@ -996,9 +1011,12 @@ func (c *ClusterClient) ForEachSlave(fn func(client *Client) error) error {
996
1011
// ForEachNode concurrently calls the fn on each known node in the cluster.
997
1012
// It returns the first error if any.
998
1013
func (c * ClusterClient ) ForEachNode (fn func (client * Client ) error ) error {
999
- state , err := c .state .Get ()
1014
+ state , err := c .state .Reload ()
1000
1015
if err != nil {
1001
- return err
1016
+ state , err = c .state .Get ()
1017
+ if err != nil {
1018
+ return err
1019
+ }
1002
1020
}
1003
1021
1004
1022
var wg sync.WaitGroup
0 commit comments