@@ -58,7 +58,6 @@ import (
58
58
vaultapi "github.com/hashicorp/vault/api"
59
59
"github.com/shirou/gopsutil/v3/host"
60
60
"golang.org/x/exp/maps"
61
- "golang.org/x/exp/slices"
62
61
)
63
62
64
63
const (
@@ -1944,7 +1943,7 @@ func (c *Client) retryRegisterNode() {
1944
1943
}
1945
1944
1946
1945
retryIntv := registerRetryIntv
1947
- if err == noServersErr {
1946
+ if err == noServersErr || structs . IsErrNoRegionPath ( err ) {
1948
1947
c .logger .Debug ("registration waiting on servers" )
1949
1948
c .triggerDiscovery ()
1950
1949
retryIntv = noServerRetryIntv
@@ -1971,6 +1970,11 @@ func (c *Client) registerNode() error {
1971
1970
return err
1972
1971
}
1973
1972
1973
+ err := c .handleNodeUpdateResponse (resp )
1974
+ if err != nil {
1975
+ return err
1976
+ }
1977
+
1974
1978
// Update the node status to ready after we register.
1975
1979
c .UpdateConfig (func (c * config.Config ) {
1976
1980
c .Node .Status = structs .NodeStatusReady
@@ -1985,6 +1989,7 @@ func (c *Client) registerNode() error {
1985
1989
defer c .heartbeatLock .Unlock ()
1986
1990
c .heartbeatStop .setLastOk (time .Now ())
1987
1991
c .heartbeatTTL = resp .HeartbeatTTL
1992
+
1988
1993
return nil
1989
1994
}
1990
1995
@@ -2036,6 +2041,25 @@ func (c *Client) updateNodeStatus() error {
2036
2041
}
2037
2042
})
2038
2043
2044
+ err := c .handleNodeUpdateResponse (resp )
2045
+ if err != nil {
2046
+ return fmt .Errorf ("heartbeat response returned no valid servers" )
2047
+ }
2048
+
2049
+ // Begin polling Consul if there is no Nomad leader. We could be
2050
+ // heartbeating to a Nomad server that is in the minority of a
2051
+ // partition of the Nomad server quorum, but this Nomad Agent still
2052
+ // has connectivity to the existing majority of Nomad Servers, but
2053
+ // only if it queries Consul.
2054
+ if resp .LeaderRPCAddr == "" {
2055
+ c .triggerDiscovery ()
2056
+ }
2057
+
2058
+ c .EnterpriseClient .SetFeatures (resp .Features )
2059
+ return nil
2060
+ }
2061
+
2062
+ func (c * Client ) handleNodeUpdateResponse (resp structs.NodeUpdateResponse ) error {
2039
2063
// Update the number of nodes in the cluster so we can adjust our server
2040
2064
// rebalance rate.
2041
2065
c .servers .SetNumNodes (resp .NumNodes )
@@ -2052,20 +2076,9 @@ func (c *Client) updateNodeStatus() error {
2052
2076
nomadServers = append (nomadServers , e )
2053
2077
}
2054
2078
if len (nomadServers ) == 0 {
2055
- return fmt . Errorf ( "heartbeat response returned no valid servers" )
2079
+ return noServersErr
2056
2080
}
2057
2081
c .servers .SetServers (nomadServers )
2058
-
2059
- // Begin polling Consul if there is no Nomad leader. We could be
2060
- // heartbeating to a Nomad server that is in the minority of a
2061
- // partition of the Nomad server quorum, but this Nomad Agent still
2062
- // has connectivity to the existing majority of Nomad Servers, but
2063
- // only if it queries Consul.
2064
- if resp .LeaderRPCAddr == "" {
2065
- c .triggerDiscovery ()
2066
- }
2067
-
2068
- c .EnterpriseClient .SetFeatures (resp .Features )
2069
2082
return nil
2070
2083
}
2071
2084
@@ -2907,9 +2920,6 @@ func (c *Client) consulDiscoveryImpl() error {
2907
2920
dcs = dcs [0 :helper .Min (len (dcs ), datacenterQueryLimit )]
2908
2921
}
2909
2922
2910
- // Query for servers in this client's region only
2911
- region := c .Region ()
2912
-
2913
2923
serviceName := c .GetConfig ().ConsulConfig .ServerServiceName
2914
2924
var mErr multierror.Error
2915
2925
var nomadServers servers.Servers
@@ -2929,21 +2939,19 @@ DISCOLOOP:
2929
2939
}
2930
2940
2931
2941
for _ , s := range consulServices {
2932
- if slices .Contains (s .ServiceTags , region ) {
2933
- port := strconv .Itoa (s .ServicePort )
2934
- addrstr := s .ServiceAddress
2935
- if addrstr == "" {
2936
- addrstr = s .Address
2937
- }
2938
- addr , err := net .ResolveTCPAddr ("tcp" , net .JoinHostPort (addrstr , port ))
2939
- if err != nil {
2940
- mErr .Errors = append (mErr .Errors , err )
2941
- continue
2942
- }
2943
-
2944
- srv := & servers.Server {Addr : addr }
2945
- nomadServers = append (nomadServers , srv )
2942
+ port := strconv .Itoa (s .ServicePort )
2943
+ addrstr := s .ServiceAddress
2944
+ if addrstr == "" {
2945
+ addrstr = s .Address
2946
2946
}
2947
+ addr , err := net .ResolveTCPAddr ("tcp" , net .JoinHostPort (addrstr , port ))
2948
+ if err != nil {
2949
+ mErr .Errors = append (mErr .Errors , err )
2950
+ continue
2951
+ }
2952
+
2953
+ srv := & servers.Server {Addr : addr }
2954
+ nomadServers = append (nomadServers , srv )
2947
2955
}
2948
2956
2949
2957
if len (nomadServers ) > 0 {
0 commit comments