Swarmd
程序的精髓就是Node.Run()
函数。刨除前面一大堆CA
验证的相关代码,下面是实际执行manager
和agent
的部分。
......
managerReady := make(chan struct{})
agentReady := make(chan struct{})
var managerErr error
var agentErr error
var wg sync.WaitGroup
wg.Add(2)
go func() {
managerErr = n.runManager(ctx, securityConfig, managerReady) // store err and loop
wg.Done()
cancel()
}()
go func() {
agentErr = n.runAgent(ctx, db, securityConfig.ClientTLSCreds, agentReady)
wg.Done()
cancel()
}()
......
如果node
的角色是agent
,则runManager goroutine
就会阻塞在Node.waitRole()
这里:
func (n *Node) runManager(ctx context.Context, securityConfig *ca.SecurityConfig, ready chan struct{}) error {
for {
n.waitRole(ctx, ca.ManagerRole)
......
}
}
因此只有Node.runAgent()
这个goroutine
可以顺畅执行。
如果node
的角色是manager
,则runManager
则runAgent
这两个goroutine
都会运行,即manager
本身也是一个agent
。