扇区生命周期及状态管理

扇区生命周期及状态管理

扇区是Filecoin网络中的数据存储单元,目前主网的扇区大小有32GiB和64GiB。

一. 扇区生命周期详解

Filecoin网络的扇区,需要通过一系列的计算过程,最终得到扇区内数据的证明结果,并存储到区块链上。

扇区的主要计算过程包括:PreCommit1(PC1)、PreCommit2(PC2)、Commit2(C2)三个过程,目前在AMD EPYC 7542 CPU 和 2080Ti显卡上,基于官方代码,计算PC1的过程大约需要3个小时,PC2需要20分钟,C2需要40分钟。基于社区及优化后的代码,PC2为10分钟左右,C2在15分钟左右。

1. 随机数扇区生命周期

随机数扇区即通过lotus-miner sectors pledge生成的扇区,扇区中存储的都是没有实际价值的随机数,目前仅仅是为了承诺有效算力。可以通过操作,将随机数扇区声明为有效数据存储的扇区。

2. 订单扇区生命周期

订单扇区是矿工通过Filecoin的订单撮合市场,存储了客户的真实数据以后生成的扇区。

二. 扇区状态管理

扇区主要状态包括:PreCommit1、PreCommit2、Committing、FinalizeSector

1. 更新扇区状态

1
$ lotus-miner sectors update-state --really-do-it <sectorId> <newState>

针对CommitFailed状态的扇区,可通过以下命令,将扇区状态更改为Committing状态。

1
$ lotus-miner sectors update-state --really-do-it <sectorId> Committing

2. 删除扇区

1
$ lotus-miner sectors remove --really-do-it <sectorId>

针对PreCommitFailedSealPreCommit1Failed状态的扇区,因为还没有质押,可通过上面的命令直接删除。

三. 顽固扇区删除

1. 什么是顽固扇区?

所谓顽固扇区,是指因Worker掉线、扇区超时等原因导致的,无法被成功调度并完成封装的扇区。

顽固扇区并不是SealPreCommit1FailedPreCommitFailedCommitFailed这几种状态的扇区,因为这几种状态的扇区,均可通过lotus-miner sectors remove --really-do-it <SectorId>命令直接删除掉。

而顽固扇区是指PreCommit1PreCommit2CommittingFinalizeSector这几种正常状态的扇区,但缺无法成功被调度并完成封装的扇区,执行以下两个命令也无法删除掉。

1
2
lotus-miner sectors update-state --really-do-it <sectorId> Removing
lotus-miner sectors remove --really-do-it <SectorId>

2. 顽固扇区有什么影响?如何发现它?

顽固扇区会停留在扇区列表中,一直不断被调度(但又无法调度成功,扇区日志中通常有大量重复的retry操作),不仅浪费了调度系统的队列资源,还会影响扇区封装任务下发的数量。你会发现,扇区明明在列表中,就是无法封装成功,想删还删不掉,非常的痛苦。

如何发现顽固扇区呢?因为Lotus的扇区号都是自增的,只要执行lotus-miner sectors list --fast查看一下扇区列表,列表的最后面,都是正在封装的扇区,而且这些扇区ID都是连续的。正常情况下,前面封装完的扇区都是Proving状态,如果看到前面Proving状态的扇区中夹杂了PreCommit1PreCommit2Committing这些状态的扇区,那这些就是顽固扇区了。

另外,也可以通过lotus-miner sealing jobs | sort -k2查看正在封装的任务列表,如果发现列表头部的扇区ID和后面的差距很大,如果差了几十个甚至更多,那这些扇区也就是顽固扇区了,或者是扇区封装已经进入死循环了,要尽快处理掉。

3. 顽固扇区如何删除?

顽固扇区已经无法被成功调度,只能采取“非常手段”来处理。
顽固扇区无法被调度,是因为扇区本身的文件已经丢失了,那么可以创建一个空的扇区文件,让扇区“假装”在封装,只要能被调度上,出现在lotus-miner sealing jobs中,就好处理了。

3.1PreCommit1PreCommit2状态的顽固扇区处理

针对PreCommit1PreCommit2这两种状态的扇区,按如下的方法来处理:

① 找一个空闲的Worker(没有任何封装任务),在LOTUS_WORKER_PATHunsealedseald目录下,分别创建对应扇区ID的空扇区文件,假设顽固扇区的ID为,那分别在unsealedseald目录下执行:

1
2
touch s-t0xxxxxx-100
# 其中t0xxxxxx是矿工ID

② 重启该Worker,注意观察Worker的日志中,该扇区会不会开始封装,如果没有开始封装,可以再重启一下Miner。

③ 待该扇区开始封装,在lotus-miner sealing jobs列表中能看到以后,就可以执行命令先终止掉任务。

1
lotus-miner sealing abort <JobId>

然后再执行删除该扇区。

1
lotus-miner sectors remove <SectorId>

执行了该命令以后,将会在Miner的日志中看到错误,不要惊慌,这种日志属于正常提示。

3.2Committing状态的顽固扇区处理

针对Committing状态的顽固扇区,同样是按照上面的方法,在unsealedseald目录下创建一个空的扇区文件。

但是不同的是,创建并重启Worker以后,该扇区并不会出现在lotus-miner sealing jobs列表中,而是直接变为CommitFailed,这个时候,执行以下命令删除扇区即可:

1
lotus-miner sectors remove <SectorId>

注意!V5版本更新了MaxProveCommitDuration(ProveCommit超时时间)为30天,删除Committing状态的扇区会销毁前置质押中的存储质押部分质押币,请谨慎操作!

4. 删除以后还要做什么?

顽固扇区删除以后,最好重启一下Seal-Miner,这样扇区状态就会重新更新,顽固扇区也就不会被再次调度了。