# Unseal 任务的支持

# 概述

订单检索是 Filecoin 生态闭环中的一个重要环节,当前 Droplet 会默认使用其 PieceStore 中的 Piece 数据响应检索订单的数据请求。同时用户也可以通过配置来控制 Droplet 缓存的 Piece 数据,当 Droplet 发现数据库中 没有该目标 Piece 的数据时,就会触发 unseal 任务,并向 Damocles 下发该任务。 Damocles Manager (下称:Manager )在接收到该任务之后,会将其分配给支持 unseal planDamocles Worker (下称:Worker)。待 Worker 完成该任务之后,就会将 unseal 之后的文件上传到 unseal 任务中指定的位置(该位置,默认是 Droplet 的 PieceStore) 。

# 原理

订单在在封装完成之后会将 sealed file 留存在永久存储目录,用以应对时空证明和 unseal 任务Woker 在接收到 unseal 任务之后,会从 Manager 获取目标 Piece 数据 所在扇区的sealed file元数据,然后执行 PC1 的逆向算法,还原 Piece 数据。

# 启用

Damocles 支持 unseal 任务 只需要 Worker 启用一个支持 unseal plan封装进程即可。 启用 unseal plan封装进程可以有两种方式:

  1. 直接修改 Woker 的主配置文件,新增一个 封装进程,或者直接修改 现有封装进程的 plan 等待适当的时机重启。
[[sealing_thread]]
location = "./mock-tmp/store1"
plan = "unseal"
  1. 使用配置热更新的方式,添加或修改封装进程。详细参见 配置热更新章节

# 手动触发 unseal 任务

在 Piece 数据 意识或者某一些别的特殊情形下,我们可能会希望能够手动触发 unseal 任务,获取 Piece 数据。 这时我们就可以通过 Manager 提供的命令行工具来手动生成并触发 unseal 任务

damocles-manager util sealer sectors unseal
NAME:
   damocles-manager util sealer sectors unseal - unseal specified sector

USAGE:
   damocles-manager util sealer sectors unseal command [command options] <piece_cid>

COMMANDS:
   help, h  Shows a list of commands or help for one command

OPTIONS:
   --output value, -o value                        output piece as a car file to the specific path
   --actor value, --miner value, --actor-id value  specify actor id of miner manully, it must worke with flag "--sector"  (default: 0)
   --sector value, --sector-id value               specify sector number manully, it must worke with flag "--actor"  (default: 0)
   --piece-info-from-droplet, --from-droplet       get piece info from droplet, which come from damocles db by default . (default: false)
   --unseal-file value                             unseal piece from unseal file
   --offset value                                  specify offset of piece manually (default: 0)
   --size value                                    specify size of piece manually (default: 0)
   --dest value                                    specify destination to transfer piece manually, there are five protocols can be used:"file:///path","http://" "https://", "market://store_name/piece_cid", "store://store_name/piece_cid"
   --help, -h                                      show help (default: false)

# unseal piece 简单使用

用户可以直接通过 piece 数据的 cid (piececid) 来发布一个 unseal 任务:

damocles-manager util sealer sectors unseal <piece_cid>

此时 Manager 会生成一个 unseal 任务。 此时 Manager 中能看到 unseal 任务相关的日志,形如:

add new dest to unseal task

此时,程序会持续运行,直到 unseal 任务完成,会在当前目录生成一个 名字为 piece cid 的文件。

# flag 解释

# 指定不同方式获取 piece info

还原 piece 数据需要获取 piece 数据在扇区中的位置和大小,unseal 任务 默认会从 Manager 数据库中获取 piece 数据的 offsetsize 信息,但是有时候,数据库中的数据丢失或者不完整的时候,我们可能希望可以从别的地方获取这些参数或者可以手动指定这两个参数,这时候就可以用到以下三个 flag:

   --from-droplet             get piece info from venus-market, which come from damocles db by default . (default: false)
   --offset value            specify offset of piece manually (default: 0)
   --size value              specify size of piece manually (default: 0)
  • from-droplet 从 Droplet 获取 offsetsize,前提是 Manager 已经连接了 Droplet
  • offset:piece 数据在 扇区中的 位置
  • size:Piece 数据的大小

如果你才升级到 v0.7.0 之后的版本没多久,可能会存在数据库中数据不完整的情况(v0.7.0 之前,数据库不会记录 offset )。

# 指定 piece 数据输出的位置

有时候我们可能希望指定 piece 数据输出的位置,可以使用 -o flag 指定输出位置

   --output value, -o value  output piece as a car file to the specific path
# 直接从 unseal 文件还原 piece 数据

Damocles 默认从 sealed 文件 还原 piece 数据,但是如果用户留存了 unseal 文件, 可以直接从 unseal 文件 还原 piece 数据,这会节省大量的时间和资源,这时候可以使用 --unseal-file flag 指定 piece 对应的 unseal 文件 的路径。

   --unseal-file value  unseal piece from unseal file
# 通过 dest 协议将文件上传值目标位置

默认情况下,以及加了-oflag 的情况下,Worker unseal 得到的 piece 数据会上传到 Manager ,由 Manager 将其输出到 Manager 所在机器的指定路径上。 但有时候,我们并不希望 Worker上传 piece 数据到 Manager ,而是直接上传到别的目标位置,这个时候就需要用到 --destflag。

dest 协议支持通过以下四种方式指定上传 piece 数据的目标位置:

  • 将文件直接输出到 Worker 本地
    • "file:///path"
    • 注意,上述 url 中 host 的位置必须为空。
  • 网络位置
    • "http://" "https://"
  • 上传至 Dropletpiece store
    • "market://store_name/piece_cid"
    • 其中 store_name 指的是 market 中 piece store 的名字
  • 上传至 Managerpiece store
    • "store://store_name/piece_cid"
    • 其中 store_name 指的是 Managerpiece store 的名字
    • 注意:应确保 Managerpiece store已经挂载并配置到 Worker

因为从 unseal 文件 还原 piece 数据是不需要经过 Worker 的,所以这个时候指定 --dest flag 是无效的