【Filecoin相关】Filecoin源码分析—Heartbeat Service

【Filecoin相关】Filecoin源码分析---Heartbeat Service

1、位置

metrics/heartbeat.go

node/node.go

2、源码分析

2.1

数据结构

定义心跳协议名称以及连接超时时间

// HeartbeatProtocol is the libp2p protocol used for the heartbeat serviceconst (

    HeartbeatProtocol = “fil/heartbeat/1.0.0”

    // Minutes to wait before logging connection failure at ERROR level

    connectionFailureErrorLogPeriodMinutes = 10 * time.Minute

)

定义心跳信息结构

// Heartbeat contains the information required to determine the current state of a node.// Heartbeats are used for aggregating information about nodes in a log aggregator// to support alerting and devnet visualization.

type Heartbeat struct {

    // 本节点最新区块头

    Head string

    // 本节点区块高度

    Height uint64

    // 节点昵称

Nickname string

    // 矿工地址

    MinerAddress address.Address

}

 发送心跳服务

// HeartbeatService is responsible for sending heartbeats.

type HeartbeatService struct {

// 节点相对libp2p信息

Host   host.Host

// 心跳配置

    Config *config.HeartbeatConfig

 

    // 获取本地最新区块函数

    HeadGetter func() types.TipSet

 

    // 获取矿工地址函数

    MinerAddressGetter func() address.Address

 

    streamMu sync.Mutex

    stream   net.Stream

}

HeartbeatService对应config.json中的配置如下:

【Filecoin相关】Filecoin源码分析---Heartbeat Service

2.2

服务逻辑

启动过程,在node::Start中调用setupHeartbeatServices设置心跳服务:设置矿工地址获取函数,如果没有,返回nil address.

【Filecoin相关】Filecoin源码分析---Heartbeat Service

检查配置文件config.json中hearbeat.beatTarget项是否有值,有则创建HeartbeatService对象,并调用其start函数启动服务.

【Filecoin相关】Filecoin源码分析---Heartbeat Service

  判断环境变量$FIL_HEARTBEAT_ALERTS,看用户是否配置别的心跳警告服务,有则启动心跳警告服务,这里beatTarget值就是环境变量$FIL_HEARTBEAT_ALERTS.

【Filecoin相关】Filecoin源码分析---Heartbeat Service

接着看HeartbeatService中具体做了什么,看start函数:

  • (1)创建定时器,间隔ReconnectPeriod连接一次beatTarget.

【Filecoin相关】Filecoin源码分析---Heartbeat Service

  • (2) 连接成功后调用run函数发送心跳数据;连接失败,将错误信息记录日志,在下个计时器有信号时继续连接.如果父类退出后,HeartbeatService服务也退出.

【Filecoin相关】Filecoin源码分析---Heartbeat Service

  • (3)发送实际的心跳包Heartbeat.

创建定时器,每间隔heartbeat.beatPeriod时间构造一个心跳包Heartbeat.包含数据:昵称,头区块高度,头区块SortedCidSet的字符表示,miner address. func (hbs *HeartbeatService) Beat() Heartbeat {     nick := hbs.Config.Nickname     ts := hbs.HeadGetter()     tipset := ts.ToSortedCidSet().String()     height, err := ts.Height()     if err != nil {         log.Warningf(“heartbeat service failed to get chain height: %s”, err)     }     addr := hbs.MinerAddressGetter()     return Heartbeat{         Head: tipset,         Height: height,         Nickname: nick,         MinerAddress: addr,     } } 将心跳包进行json编码再发送,发送失败退出计时器循环.

【Filecoin相关】Filecoin源码分析---Heartbeat Service

  • (4) Connect中NewStream目前的代码中并没有实现.而建立连接实际上是将目标地址添加到PeerStore,然后通过libp2p服务连接之.

【Filecoin相关】Filecoin源码分析---Heartbeat Service

【Filecoin相关】Filecoin源码分析---Heartbeat Service

 

2.3

辅助函数
向心跳服务结构体传参,用于设置获取矿工地址函数 // WithMinerAddressGetter returns an option that can be used to set the miner address getter.func WithMinerAddressGetter(ag func() address.Address) HeartbeatServiceOption {     return func(service *HeartbeatService) {         service.MinerAddressGetter = ag     } }  获取默认的矿工地址 func defaultMinerAddressGetter() address.Address {     return address.Address{} }  实例化心跳服务,具体的实例化在node包中实现。 // NewHeartbeatService returns a HeartbeatServicefunc NewHeartbeatService(h host.Host, hbc *config.HeartbeatConfig, hg func() types.TipSet, options …HeartbeatServiceOption) *HeartbeatService {     srv := &HeartbeatService{         Host:               h,         Config:             hbc,         HeadGetter:         hg,         MinerAddressGetter: defaultMinerAddressGetter,     }       // 设置心跳服务的获取矿工属性     for _, option := range options {         option(srv)     }     return srv }

【IPFS原力区】

总部位于上海,深耕IPFS社区发展与商业生态建设。

Force系列产品布局IPFS商业应用,贯通视频娱乐、文件共享、浏览器入口、数据加密管理等服务,为企业与个人的使用提供一站式服务。

旗下IPFS原力区是IPFS顶级价值生态社区,聚集了众多技术大咖和IPFS爱好者,通过持续输出全面、精细、优质的IPFS咨询和技术支持,将生态中的爱好者转化为IPFS支持者和参与者,推动IPFS生态的健康发展。

【Filecoin相关】Filecoin源码分析---Heartbeat Service

原创文章,作者:IPFSforce,如若转载,请注明出处:http://ipfser.org/2019/03/26/filecoin-heartbeat-service/

发表评论

登录后才能评论

联系我们

在线咨询:点击这里给我发消息

邮件:ipfsforce@qq.com

工作时间:周一至周五,9:30-18:30,节假日休息

QR code