|
- package task
-
- import (
- "fmt"
- "time"
-
- "gitlink.org.cn/cloudream/common/pkgs/logger"
- "gitlink.org.cn/cloudream/common/pkgs/task"
- stgglb "gitlink.org.cn/cloudream/storage/common/globals"
- )
-
- // IPFSPin 定义了一个结构体,用于IPFS的pin操作任务。
- type IPFSPin struct {
- FileHashes []string // FileHashes 存储需要pin的文件的hash列表。
- }
-
- // NewIPFSPin 创建一个新的IPFSPin实例。
- // fileHashes 是一个包含需要pin的文件hash的字符串切片。
- // 返回一个指向IPFSPin实例的指针。
- func NewIPFSPin(fileHashes []string) *IPFSPin {
- return &IPFSPin{
- FileHashes: fileHashes,
- }
- }
-
- // Execute 执行IPFSPin任务。
- // 该函数负责获取IPFS客户端,然后对FileHashes中的每个文件hash执行pin操作。
- // task 是一个指向task.Task[TaskContext]的指针,代表当前的任务实例。
- // ctx 是当前任务的上下文信息。
- // complete 是一个完成回调函数,用于在任务结束时(成功或失败)进行一些清理工作。
- func (t *IPFSPin) Execute(task *task.Task[TaskContext], ctx TaskContext, complete CompleteFn) {
- // 使用logger记录任务开始的信息。
- log := logger.WithType[IPFSPin]("Task")
- log.Debugf("begin with %v", logger.FormatStruct(t))
- defer log.Debugf("end") // 确保记录任务结束的信息。
-
- // 尝试从IPFS池中获取一个客户端实例。
- ipfsCli, err := stgglb.IPFSPool.Acquire()
- if err != nil {
- // 如果获取客户端失败,则使用complete函数通知任务失败,并设置移除延迟。
- err := fmt.Errorf("new ipfs client: %w", err)
- log.Warn(err.Error())
-
- complete(err, CompleteOption{
- RemovingDelay: time.Minute,
- })
- return
- }
- defer ipfsCli.Close() // 确保在函数返回前释放IPFS客户端实例。
-
- // 遍历文件hash列表,并尝试对每个hash执行pin操作。
- for _, fileHash := range t.FileHashes {
- err = ipfsCli.Pin(fileHash)
- if err != nil {
- // 如果pin操作失败,则使用complete函数通知任务失败,并设置移除延迟。
- err := fmt.Errorf("pin file failed, err: %w", err)
- log.WithField("FileHash", fileHash).Warn(err.Error())
-
- complete(err, CompleteOption{
- RemovingDelay: time.Minute,
- })
- return
- }
- }
-
- // 所有文件的pin操作成功,使用complete函数通知任务成功完成,并设置移除延迟。
- complete(nil, CompleteOption{
- RemovingDelay: time.Minute,
- })
- }
|