Filecoin - Sector状态管理逻辑

本文深入探讨了Filecoin中Sector的状态管理逻辑,包括基于状态机的设计、StateMachine、StateGroup、SectorState等核心概念。文章详细介绍了状态的转换过程,如PreCommit1、PreCommit2、Committing等,以及如何利用rust-fil-proofs进行计算。通过理解这些模块,有助于了解Lotus Miner如何处理和管理Sector的状态。
摘要由CSDN通过智能技术生成

好久不看go语言的代码了,最近有空换换脑子,看看Sector的状态管理,纯go语言实现。看看大型项目的代码设计,对代码以及项目的设计开发有莫大的好处。Lotus的go语言部分的最新的代码,采用模块化设计。Lotus的代码也是一步步演进的,第一版的代码也是所有的逻辑耦合在一起,后面才逐步的模块化。

Lotus Miner将用户需要存储的数据“打包”成一个个Sector,并对Sector进行处理。本文就讲讲Sector的状态管理。

模块框架

Sector状态管理相关的模块如下:

图1

Sector的状态管理基于状态机。Lotus实现了通用的状态机(statemachine),在go-statemachine包中。在StateMachine之上,进一步抽象出了StateGroup,管理多个状态机。StateMachine只是实现状态的转变,具体状态是通过go-statestore进行存储。在StateMachine之上,定义状态转变的规则以及状态对应的处理函数,这些就是在具体的业务。SectorState就是Lotus管理Sector的具体业务。在这些底层模块的基础上,Lotus的相关代码调用就比较简单。先从状态管理的底层模块,StateMachine讲起:

StateMachine

StateMachine定义在go-statemachine包中,machine.go:

 type StateMachine struct {
     planner  Planner
     eventsIn chan Event
 
     name      interface{}
     st        *statestore.StoredState
     stateType reflect.Type
 
     stageDone chan struct{}
     closing   chan struct{}
     closed    chan struct{}
 
     busy int32
 }

其中,planner是抽象出来的状态机的状态转化函数。Planner接收Event,结合当前的状态user,确定下一步的处理。

type Planner func(events []Event, user interface{}) (interface{}, uint64, error)

st是存储的状态。stateType是存储状态的类型。

StateMachine的核心是run函数,分成三部分:接收Event,状态处理,下一步的调用。其中状态处理是关键:

err := fsm.mutateUser(func(user interface{}) (err error) {
    nextStep, processed, err = fsm.planner(pendingEvents, user)
    ustate = user
    if xerrors.Is(err, ErrTerminated) {
        terminated = true
        return nil
    }
    return err
})
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值