client: respect `client_auto_join` after connection loss (#11585)

The `consul.client_auto_join` configuration block tells the Nomad
client whether to use Consul service discovery to find Nomad
servers. By default it is set to `true`, but contrary to the
documentation it was only respected during the initial client
registration. If a client missed a heartbeat, failed a
`Node.UpdateStatus` RPC, or if there was no Nomad leader, the client
would fallback to Consul even if `client_auto_join` was set to
`false`. This changeset returns early from the client's trigger for
Consul discovery if the `client_auto_join` field is set to `false`.
This commit is contained in:
Tim Gross 2021-11-30 13:20:42 -05:00 committed by GitHub
parent 39acac33a0
commit 6e1311a265
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 10 additions and 5 deletions

3
.changelog/11585.txt Normal file
View File

@ -0,0 +1,3 @@
```release-note:bug
client: Fixed a bug where clients would ignore the `client_auto_join` setting after losing connection with the servers, causing them to incorrectly fallback to Consul discovery if it was set to `false`.
```

View File

@ -2690,6 +2690,7 @@ func taskIsPresent(taskName string, tasks []*structs.Task) bool {
// triggerDiscovery causes a Consul discovery to begin (if one hasn't already) // triggerDiscovery causes a Consul discovery to begin (if one hasn't already)
func (c *Client) triggerDiscovery() { func (c *Client) triggerDiscovery() {
if c.configCopy.ConsulConfig.ClientAutoJoin != nil && *c.configCopy.ConsulConfig.ClientAutoJoin {
select { select {
case c.triggerDiscoveryCh <- struct{}{}: case c.triggerDiscoveryCh <- struct{}{}:
// Discovery goroutine was released to execute // Discovery goroutine was released to execute
@ -2697,6 +2698,7 @@ func (c *Client) triggerDiscovery() {
// Discovery goroutine was already running // Discovery goroutine was already running
} }
} }
}
// consulDiscovery waits for the signal to attempt server discovery via Consul. // consulDiscovery waits for the signal to attempt server discovery via Consul.
// It's intended to be started in a goroutine. See triggerDiscovery() for // It's intended to be started in a goroutine. See triggerDiscovery() for