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

最新文章

  1. 利用Swashbuckle生成Web API Help Pages
  2. tableview 位置发生偏移
  3. sqlserver中DATE类型的数据转化 CONVERT
  4. WinForm用户自定义控件,在主窗体加载时出现闪烁;调用用户控件出现闪烁,需要鼠标才能够显示
  5. (转)RHEL/CentOS 6.x使用EPEL6与remi的yum源安装MySQL 5.5.x
  6. 如何查看Linux操作系统版本
  7. python-布尔值
  8. Jquery filter()方法简介
  9. MPLS VPN随堂笔记3
  10. mysql中文、英文别名排序问题,order by 关键字详解
  11. BZOJ1195 [HNOI2006]最短母串 AC自动机 bfs
  12. Step1:SQL Server 复制介绍
  13. CVE-2018-7566
  14. Java GC如何判断对象是否为垃圾
  15. Photoshop做32位带Alpha通道的bmp图片
  16. shell批量杀进程
  17. Linux学习笔记之初级篇
  18. oracle: sql语句报ora-01461/ora-00911错误
  19. 深入理解Java虚拟机,intern
  20. cxrichedit导入WORD

热门文章

  1. WARNING: cell0 mapping not found - not syncing cell0
  2. Java微信公众平台开发(十五)--微信JSSDK的使用
  3. ubuntu14.10下Qt5.4无法输入中文
  4. oracle:RETURNING 子句
  5. Hadoop IO基于文件的数据结构详解【列式和行式数据结构的存储策略】
  6. 尝试在centos5下运行phantomjs2
  7. js 线程和进程的关系
  8. c++ deque 容器
  9. springMVC+spring+mybatis整合(包括文件上传和下载)
  10. oracle 通过序列实现某字段自增