diff --git a/daemon/cluster/cluster.go b/daemon/cluster/cluster.go index 8ff527877f..6a00a4d7b8 100644 --- a/daemon/cluster/cluster.go +++ b/daemon/cluster/cluster.go @@ -280,27 +280,29 @@ func (c *Cluster) GetDataPathAddress() string { return "" } -// GetRemoteAddress returns a known advertise address of a remote manager if +// GetRemoteAddressList returns the advertise address for each of the remote managers if // available. -// todo: change to array/connect with info -func (c *Cluster) GetRemoteAddress() string { +func (c *Cluster) GetRemoteAddressList() []string { c.mu.RLock() defer c.mu.RUnlock() - return c.getRemoteAddress() + return c.getRemoteAddressList() } -func (c *Cluster) getRemoteAddress() string { +func (c *Cluster) getRemoteAddressList() []string { state := c.currentNodeState() if state.swarmNode == nil { - return "" + return []string{} } + nodeID := state.swarmNode.NodeID() - for _, r := range state.swarmNode.Remotes() { + remotes := state.swarmNode.Remotes() + addressList := make([]string, 0, len(remotes)) + for _, r := range remotes { if r.NodeID != nodeID { - return r.Addr + addressList = append(addressList, r.Addr) } } - return "" + return addressList } // ListenClusterEvents returns a channel that receives messages on cluster diff --git a/daemon/cluster/noderunner.go b/daemon/cluster/noderunner.go index 6c8ca70376..13947fa7b0 100644 --- a/daemon/cluster/noderunner.go +++ b/daemon/cluster/noderunner.go @@ -271,7 +271,13 @@ func (n *nodeRunner) enableReconnectWatcher() { if n.stopping { return } - config.RemoteAddr = n.cluster.getRemoteAddress() + remotes := n.cluster.getRemoteAddressList() + if len(remotes) > 0 { + config.RemoteAddr = remotes[0] + } else { + config.RemoteAddr = "" + } + config.joinAddr = config.RemoteAddr if err := n.start(config); err != nil { n.err = err