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.

move_dir_to_storage.go 2.3 kB

2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. package task
  2. import (
  3. "fmt"
  4. "time"
  5. "gitlink.org.cn/cloudream/common/pkgs/distlock/reqbuilder"
  6. coormsg "gitlink.org.cn/cloudream/storage-common/pkgs/mq/message/coordinator"
  7. )
  8. type MoveDirToStorage struct {
  9. userID int64
  10. dirName string
  11. storageID int64
  12. ResultObjectToStorages []ResultObjectToStorage
  13. }
  14. type ResultObjectToStorage struct {
  15. ObjectName string
  16. Error error
  17. }
  18. func NewMoveDirToStorage(userID int64, dirName string, storageID int64) *MoveDirToStorage {
  19. return &MoveDirToStorage{
  20. userID: userID,
  21. dirName: dirName,
  22. storageID: storageID,
  23. }
  24. }
  25. func (t *MoveDirToStorage) Execute(ctx TaskContext, complete CompleteFn) {
  26. err := t.do(ctx)
  27. complete(err, CompleteOption{
  28. RemovingDelay: time.Minute,
  29. })
  30. }
  31. func (t *MoveDirToStorage) do(ctx TaskContext) error {
  32. //根据dirName查询相关的所有文件
  33. objsResp, err := ctx.Coordinator.GetObjectsByDirName(coormsg.NewGetObjectsByDirName(t.userID, t.dirName))
  34. if err != nil {
  35. return fmt.Errorf("get objectID by dirName failed: %w", err)
  36. }
  37. if len(objsResp.Objects) == 0 {
  38. return fmt.Errorf("dirName %v is not exist", t.dirName)
  39. }
  40. reqBlder := reqbuilder.NewBuilder()
  41. for _, object := range objsResp.Objects {
  42. reqBlder.Metadata().
  43. // 用于判断用户是否有Storage权限
  44. UserStorage().ReadOne(object.ObjectID, t.storageID).
  45. // 用于读取对象信息
  46. Object().ReadOne(object.ObjectID).
  47. // 用于查询Rep配置
  48. ObjectRep().ReadOne(object.ObjectID).
  49. // 用于创建Move记录
  50. StorageObject().CreateOne(t.storageID, t.userID, object.ObjectID).
  51. // 用于创建对象文件
  52. Storage().CreateOneObject(t.storageID, t.userID, object.ObjectID)
  53. }
  54. mutex, err := reqBlder.
  55. Metadata().
  56. // 用于判断用户是否有对象权限
  57. UserBucket().ReadAny().
  58. // 用于查询Block配置
  59. ObjectBlock().ReadAny().
  60. MutexLock(ctx.DistLock)
  61. if err != nil {
  62. return fmt.Errorf("acquire locks failed, err: %w", err)
  63. }
  64. defer mutex.Unlock()
  65. for i := 0; i < len(objsResp.Objects); i++ {
  66. err := moveSingleObjectToStorage(ctx, t.userID, objsResp.Objects[i].ObjectID, t.storageID)
  67. t.ResultObjectToStorages = append(t.ResultObjectToStorages, ResultObjectToStorage{
  68. ObjectName: objsResp.Objects[i].Name,
  69. Error: err,
  70. })
  71. }
  72. return nil
  73. }

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