@@ -1862,7 +1862,7 @@ func (c *Client) retryRegisterNode() {
1862
1862
}
1863
1863
1864
1864
retryIntv := registerRetryIntv
1865
- if err == noServersErr {
1865
+ if err == noServersErr || structs . IsErrNoRegionPath ( err ) {
1866
1866
c .logger .Debug ("registration waiting on servers" )
1867
1867
c .triggerDiscovery ()
1868
1868
retryIntv = noServerRetryIntv
@@ -1889,6 +1889,11 @@ func (c *Client) registerNode() error {
1889
1889
return err
1890
1890
}
1891
1891
1892
+ err := c .handleNodeUpdateResponse (resp )
1893
+ if err != nil {
1894
+ return err
1895
+ }
1896
+
1892
1897
// Update the node status to ready after we register.
1893
1898
c .UpdateConfig (func (c * config.Config ) {
1894
1899
c .Node .Status = structs .NodeStatusReady
@@ -1903,6 +1908,7 @@ func (c *Client) registerNode() error {
1903
1908
defer c .heartbeatLock .Unlock ()
1904
1909
c .heartbeatStop .setLastOk (time .Now ())
1905
1910
c .heartbeatTTL = resp .HeartbeatTTL
1911
+
1906
1912
return nil
1907
1913
}
1908
1914
@@ -1954,6 +1960,22 @@ func (c *Client) updateNodeStatus() error {
1954
1960
}
1955
1961
})
1956
1962
1963
+ err := c .handleNodeUpdateResponse (resp )
1964
+ if err != nil {
1965
+ return fmt .Errorf ("heartbeat response returned no valid servers" )
1966
+ }
1967
+
1968
+ // If there's no Leader in the response we may be talking to a partitioned
1969
+ // server. Redo discovery to ensure our server list is up to date.
1970
+ if resp .LeaderRPCAddr == "" {
1971
+ c .triggerDiscovery ()
1972
+ }
1973
+
1974
+ c .EnterpriseClient .SetFeatures (resp .Features )
1975
+ return nil
1976
+ }
1977
+
1978
+ func (c * Client ) handleNodeUpdateResponse (resp structs.NodeUpdateResponse ) error {
1957
1979
// Update the number of nodes in the cluster so we can adjust our server
1958
1980
// rebalance rate.
1959
1981
c .servers .SetNumNodes (resp .NumNodes )
@@ -1970,20 +1992,9 @@ func (c *Client) updateNodeStatus() error {
1970
1992
nomadServers = append (nomadServers , e )
1971
1993
}
1972
1994
if len (nomadServers ) == 0 {
1973
- return fmt . Errorf ( "heartbeat response returned no valid servers" )
1995
+ return noServersErr
1974
1996
}
1975
1997
c .servers .SetServers (nomadServers )
1976
-
1977
- // Begin polling Consul if there is no Nomad leader. We could be
1978
- // heartbeating to a Nomad server that is in the minority of a
1979
- // partition of the Nomad server quorum, but this Nomad Agent still
1980
- // has connectivity to the existing majority of Nomad Servers, but
1981
- // only if it queries Consul.
1982
- if resp .LeaderRPCAddr == "" {
1983
- c .triggerDiscovery ()
1984
- }
1985
-
1986
- c .EnterpriseClient .SetFeatures (resp .Features )
1987
1998
return nil
1988
1999
}
1989
2000
@@ -2821,14 +2832,6 @@ func (c *Client) consulDiscoveryImpl() error {
2821
2832
dcs = dcs [0 :helper .Min (len (dcs ), datacenterQueryLimit )]
2822
2833
}
2823
2834
2824
- // Query for servers in this client's region only
2825
- region := c .Region ()
2826
- rpcargs := structs.GenericRequest {
2827
- QueryOptions : structs.QueryOptions {
2828
- Region : region ,
2829
- },
2830
- }
2831
-
2832
2835
serviceName := c .GetConfig ().ConsulConfig .ServerServiceName
2833
2836
var mErr multierror.Error
2834
2837
var nomadServers servers.Servers
@@ -2859,32 +2862,14 @@ DISCOLOOP:
2859
2862
continue
2860
2863
}
2861
2864
2862
- // Query the members from the region that Consul gave us, and
2863
- // extract the client-advertise RPC address from each member
2864
- var membersResp structs.ServerMembersResponse
2865
- if err := c .connPool .RPC (region , addr , "Status.Members" , rpcargs , & membersResp ); err != nil {
2866
- mErr .Errors = append (mErr .Errors , err )
2867
- continue
2868
- }
2869
- for _ , member := range membersResp .Members {
2870
- if addrTag , ok := member .Tags ["rpc_addr" ]; ok {
2871
- if portTag , ok := member .Tags ["port" ]; ok {
2872
- addr , err := net .ResolveTCPAddr ("tcp" ,
2873
- fmt .Sprintf ("%s:%s" , addrTag , portTag ))
2874
- if err != nil {
2875
- mErr .Errors = append (mErr .Errors , err )
2876
- continue
2877
- }
2878
- srv := & servers.Server {Addr : addr }
2879
- nomadServers = append (nomadServers , srv )
2880
- }
2881
- }
2882
- }
2865
+ srv := & servers.Server {Addr : addr }
2866
+ nomadServers = append (nomadServers , srv )
2867
+ }
2883
2868
2884
- if len (nomadServers ) > 0 {
2885
- break DISCOLOOP
2886
- }
2869
+ if len (nomadServers ) > 0 {
2870
+ break DISCOLOOP
2887
2871
}
2872
+
2888
2873
}
2889
2874
if len (nomadServers ) == 0 {
2890
2875
if len (mErr .Errors ) > 0 {
0 commit comments