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.

create_package.go 3.3 kB

2 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  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. cdssdk "gitlink.org.cn/cloudream/common/sdks/storage"
  8. stgglb "gitlink.org.cn/cloudream/storage/common/globals"
  9. "gitlink.org.cn/cloudream/storage/common/pkgs/cmd"
  10. "gitlink.org.cn/cloudream/storage/common/pkgs/iterator"
  11. "gitlink.org.cn/cloudream/storage/common/pkgs/mq/coordinator"
  12. )
  13. // CreatePackageResult 定义创建包的结果结构
  14. // 包含包的ID和上传的对象列表
  15. type CreatePackageResult struct {
  16. PackageID cdssdk.PackageID
  17. Objects []cmd.ObjectUploadResult
  18. }
  19. // CreatePackage 定义创建包的任务结构
  20. // 包含用户ID、存储桶ID、包名称、上传对象的迭代器、节点亲和性以及任务结果
  21. type CreatePackage struct {
  22. userID cdssdk.UserID
  23. bucketID cdssdk.BucketID
  24. name string
  25. objIter iterator.UploadingObjectIterator
  26. nodeAffinity *cdssdk.NodeID
  27. Result *CreatePackageResult
  28. }
  29. // NewCreatePackage 创建一个新的CreatePackage实例
  30. // userID: 用户ID
  31. // bucketID: 存储桶ID
  32. // name: 包名称
  33. // objIter: 上传对象的迭代器
  34. // nodeAffinity: 节点亲和性,指定包应该创建在哪个节点上(可选)
  35. // 返回CreatePackage实例的指针
  36. func NewCreatePackage(userID cdssdk.UserID, bucketID cdssdk.BucketID, name string, objIter iterator.UploadingObjectIterator, nodeAffinity *cdssdk.NodeID) *CreatePackage {
  37. return &CreatePackage{
  38. userID: userID,
  39. bucketID: bucketID,
  40. name: name,
  41. objIter: objIter,
  42. nodeAffinity: nodeAffinity,
  43. }
  44. }
  45. // Execute 执行创建包的任务
  46. // task: 任务实例,携带任务上下文
  47. // ctx: 任务上下文,包含分布式锁和网络连接性等信息
  48. // complete: 任务完成的回调函数
  49. func (t *CreatePackage) Execute(task *task.Task[TaskContext], ctx TaskContext, complete CompleteFn) {
  50. // 获取任务日志记录器
  51. log := logger.WithType[CreatePackage]("Task")
  52. log.Debugf("begin")
  53. defer log.Debugf("end")
  54. // 从MQ池中获取协调器客户端
  55. coorCli, err := stgglb.CoordinatorMQPool.Acquire()
  56. if err != nil {
  57. err = fmt.Errorf("new coordinator client: %w", err)
  58. log.Warn(err.Error())
  59. // 完成任务并设置移除延迟
  60. complete(err, CompleteOption{
  61. RemovingDelay: time.Minute,
  62. })
  63. return
  64. }
  65. defer stgglb.CoordinatorMQPool.Release(coorCli)
  66. // 向协调器创建包
  67. createResp, err := coorCli.CreatePackage(coordinator.NewCreatePackage(t.userID, t.bucketID, t.name))
  68. if err != nil {
  69. err = fmt.Errorf("creating package: %w", err)
  70. log.Error(err.Error())
  71. // 完成任务并设置移除延迟
  72. complete(err, CompleteOption{
  73. RemovingDelay: time.Minute,
  74. })
  75. return
  76. }
  77. uploadRet, err := cmd.NewUploadObjects(t.userID, createResp.Package.PackageID, t.objIter, t.nodeAffinity).Execute(&cmd.UploadObjectsContext{
  78. Distlock: ctx.distlock,
  79. Connectivity: ctx.connectivity,
  80. })
  81. if err != nil {
  82. err = fmt.Errorf("uploading objects: %w", err)
  83. log.Error(err.Error())
  84. // 完成任务并设置移除延迟
  85. complete(err, CompleteOption{
  86. RemovingDelay: time.Minute,
  87. })
  88. return
  89. }
  90. t.Result.PackageID = createResp.Package.PackageID
  91. t.Result.Objects = uploadRet.Objects
  92. // 完成任务并设置移除延迟
  93. complete(nil, CompleteOption{
  94. RemovingDelay: time.Minute,
  95. })
  96. }

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