dial.go閱讀手記
dial.go是負責和peer建立連接關系的地方,主要是實現
type dialer interface {
/*
peers已經有的結點
*/
newTasks(running int, peers map[discover.NodeID]*Peer, now time.Time) []task
taskDone(task, time.Time)
addStatic(*discover.Node)
removeStatic(*discover.Node)
}
// dialstate schedules dials and discovery lookups.
// it get's a chance to compute new tasks on every iteration
// of the main loop in Server.run.
type dialstate struct {
maxDynDials int
ntab discoverTable
netrestrict *netutil.Netlist
lookupRunning bool
dialing map[discover.NodeID]connFlag //正在創建的連接
lookupBuf []*discover.Node // current discovery lookup results
randomNodes []*discover.Node // filled from Table
static map[discover.NodeID]*dialTask
hist *dialHistory
start time.Time // time when the dialer was first used
bootnodes []*discover.Node // default dials when there are no peers
}
其中最復雜的是newTasks,是建立新的連接,從test代碼中可以看出,
要在指定的最大連接數(peers)基之上去創建新的連接
lookupBuf // current discovery lookup results
主要是在結束taskdone的時候添加已經發現的?
在不超過maxDynDials的情況下,首先減去peers已有的連接,然后是static中的任務,
如果過還有富余,富余空間中最多一半(根據實現,可能為0)用ReadRandomNodes填充,剩下的
就用lookupBuf來填充,如果lookbuf中沒有有效的任務,那么就創建一個discoverTask,
如果還有空間,就創建一個waitExpireTask
總之newTasks就是在盡可能的情況下,多創建任務.為Server.run scheduleTasks時服務,
保證其能夠連接到盡可能多的節點.如果節點數量不夠的情況下,還沒有dialTask就創建discoverTask,否則就創建一個WaitExpireTask