This is a creation in
Article, where the information may have evolved or changed.
Swarm driverThe NewCluster core functions of the function are as follows ( cluster/swarm/cluster.go ):
discoveryCh, errCh := cluster.discovery.Watch(nil)go cluster.monitorDiscovery(discoveryCh, errCh)go cluster.monitorPendingEngines()
cluster.discovery.Watchis defined as follows:
Watch(stopCh <-chan struct{}) (<-chan Entries, <-chan error)
Returns two channel : the first channel type is Entries ( type Entries []*Entry ), which transmits the cluster contained host information, and the second is channel used to notify whether an error occurred.
Cluster.monitorDiscoveryfunction is to organize Cluster.engines :
select { case entries := <-ch: added, removed := currentEntries.Diff(entries) currentEntries = entries // Remove engines first. `addEngine` will refuse to add an engine // if there's already an engine with the same ID. If an engine // changes address, we have to first remove it then add it back. for _, entry := range removed { c.removeEngine(entry.String()) } for _, entry := range added { c.addEngine(entry.String()) } case err := <-errCh: log.Errorf("Discovery error: %v", err) }
Instead, Cluster.monitorPendingEngines Verify that pending the status is Cluster.engines now able to connect:
for _, e := range pEngines { if e.TimeToValidate() { go c.validatePendingEngine(e) } }