You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

ipfs_pin.go 2.4 kB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. package task
  2. import (
  3. "fmt"
  4. "time"
  5. "gitlink.org.cn/cloudream/common/pkgs/logger"
  6. "gitlink.org.cn/cloudream/common/pkgs/task"
  7. stgglb "gitlink.org.cn/cloudream/storage/common/globals"
  8. )
  9. // IPFSPin 定义了一个结构体,用于IPFS的pin操作任务。
  10. type IPFSPin struct {
  11. FileHashes []string // FileHashes 存储需要pin的文件的hash列表。
  12. }
  13. // NewIPFSPin 创建一个新的IPFSPin实例。
  14. // fileHashes 是一个包含需要pin的文件hash的字符串切片。
  15. // 返回一个指向IPFSPin实例的指针。
  16. func NewIPFSPin(fileHashes []string) *IPFSPin {
  17. return &IPFSPin{
  18. FileHashes: fileHashes,
  19. }
  20. }
  21. // Execute 执行IPFSPin任务。
  22. // 该函数负责获取IPFS客户端,然后对FileHashes中的每个文件hash执行pin操作。
  23. // task 是一个指向task.Task[TaskContext]的指针,代表当前的任务实例。
  24. // ctx 是当前任务的上下文信息。
  25. // complete 是一个完成回调函数,用于在任务结束时(成功或失败)进行一些清理工作。
  26. func (t *IPFSPin) Execute(task *task.Task[TaskContext], ctx TaskContext, complete CompleteFn) {
  27. // 使用logger记录任务开始的信息。
  28. log := logger.WithType[IPFSPin]("Task")
  29. log.Debugf("begin with %v", logger.FormatStruct(t))
  30. defer log.Debugf("end") // 确保记录任务结束的信息。
  31. // 尝试从IPFS池中获取一个客户端实例。
  32. ipfsCli, err := stgglb.IPFSPool.Acquire()
  33. if err != nil {
  34. // 如果获取客户端失败,则使用complete函数通知任务失败,并设置移除延迟。
  35. err := fmt.Errorf("new ipfs client: %w", err)
  36. log.Warn(err.Error())
  37. complete(err, CompleteOption{
  38. RemovingDelay: time.Minute,
  39. })
  40. return
  41. }
  42. defer ipfsCli.Close() // 确保在函数返回前释放IPFS客户端实例。
  43. // 遍历文件hash列表,并尝试对每个hash执行pin操作。
  44. for _, fileHash := range t.FileHashes {
  45. err = ipfsCli.Pin(fileHash)
  46. if err != nil {
  47. // 如果pin操作失败,则使用complete函数通知任务失败,并设置移除延迟。
  48. err := fmt.Errorf("pin file failed, err: %w", err)
  49. log.WithField("FileHash", fileHash).Warn(err.Error())
  50. complete(err, CompleteOption{
  51. RemovingDelay: time.Minute,
  52. })
  53. return
  54. }
  55. }
  56. // 所有文件的pin操作成功,使用complete函数通知任务成功完成,并设置移除延迟。
  57. complete(nil, CompleteOption{
  58. RemovingDelay: time.Minute,
  59. })
  60. }

本项目旨在将云际存储公共基础设施化,使个人及企业可低门槛使用高效的云际存储服务(安装开箱即用云际存储客户端即可,无需关注其他组件的部署),同时支持用户灵活便捷定制云际存储的功能细节。