這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
Swarm driver的NewCluster函數的核心功能如下(cluster/swarm/cluster.go):
discoveryCh, errCh := cluster.discovery.Watch(nil)go cluster.monitorDiscovery(discoveryCh, errCh)go cluster.monitorPendingEngines()
cluster.discovery.Watch的定義如下:
Watch(stopCh <-chan struct{}) (<-chan Entries, <-chan error)
返回兩個channel:第一個channel類型是Entries(type Entries []*Entry),用來傳輸cluster所包含的主機資訊,第二個channel用來通知是否有錯誤發生。
Cluster.monitorDiscovery功能是整理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) }
而Cluster.monitorPendingEngines則是驗證處於pending狀態的Cluster.engines現在是否能夠串連上:
for _, e := range pEngines { if e.TimeToValidate() { go c.validatePendingEngine(e) } }