diff --git a/client/client.go b/client/client.go index f39ad3116..757f32799 100644 --- a/client/client.go +++ b/client/client.go @@ -269,7 +269,7 @@ func NewClient(cfg *config.Config, consulCatalog consul.CatalogAPI, consulServic // Set the preconfigured list of static servers c.configLock.RLock() if len(c.configCopy.Servers) > 0 { - if err := c.SetServers(c.configCopy.Servers); err != nil { + if err := c.setServersImpl(c.configCopy.Servers, true); err != nil { logger.Printf("[WARN] client: None of the configured servers are valid: %v", err) } } @@ -605,6 +605,16 @@ func (c *Client) GetServers() []string { // SetServers sets a new list of nomad servers to connect to. As long as one // server is resolvable no error is returned. func (c *Client) SetServers(in []string) error { + return c.setServersImpl(in, false) +} + +// setServersImpl sets a new list of nomad servers to connect to. If force is +// set, we add the server to the internal severlist even if the server could not +// be pinged. An error is returned if no endpoints were valid when non-forcing. +// +// Force should be used when setting the servers from the initial configuration +// since the server may be starting up in parallel and initial pings may fail. +func (c *Client) setServersImpl(in []string, force bool) error { var mu sync.Mutex var wg sync.WaitGroup var merr multierror.Error @@ -625,7 +635,12 @@ func (c *Client) SetServers(in []string) error { // Try to ping to check if it is a real server if err := c.Ping(addr); err != nil { merr.Errors = append(merr.Errors, fmt.Errorf("Server at address %s failed ping: %v", addr, err)) - return + + // If we are forcing the setting of the servers, inject it to + // the serverlist even if we can't ping immediately. + if !force { + return + } } mu.Lock() diff --git a/client/client_test.go b/client/client_test.go index a612ba71b..13d4debfb 100644 --- a/client/client_test.go +++ b/client/client_test.go @@ -905,10 +905,9 @@ func TestClient_ReloadTLS_DowngradeTLSToPlaintext(t *testing.T) { return false, fmt.Errorf("client RPC succeeded when it should have failed :\n%+v", err) } return true, nil + }, func(err error) { + t.Fatalf(err.Error()) }, - func(err error) { - t.Fatalf(err.Error()) - }, ) } @@ -931,10 +930,9 @@ func TestClient_ReloadTLS_DowngradeTLSToPlaintext(t *testing.T) { return false, fmt.Errorf("client RPC failed when it should have succeeded:\n%+v", err) } return true, nil + }, func(err error) { + t.Fatalf(err.Error()) }, - func(err error) { - t.Fatalf(err.Error()) - }, ) } } diff --git a/client/servers/manager.go b/client/servers/manager.go index 604b109a2..6dac0c7e4 100644 --- a/client/servers/manager.go +++ b/client/servers/manager.go @@ -98,18 +98,6 @@ func (s Servers) cycle() { s[numServers-1] = start } -// removeServerByKey performs an inline removal of the first matching server -func (s Servers) removeServerByKey(targetKey string) { - for i, srv := range s { - if targetKey == srv.String() { - copy(s[i:], s[i+1:]) - s[len(s)-1] = nil - s = s[:len(s)-1] - return - } - } -} - // shuffle shuffles the server list in place func (s Servers) shuffle() { for i := len(s) - 1; i > 0; i-- {