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.

complete_multipart.go 1.9 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. package plans
  2. import (
  3. "fmt"
  4. "gitlink.org.cn/cloudream/common/pkgs/ioswitch/exec"
  5. "gitlink.org.cn/cloudream/common/pkgs/ioswitch/plan"
  6. "gitlink.org.cn/cloudream/common/utils/os2"
  7. clitypes "gitlink.org.cn/cloudream/jcs-pub/client/types"
  8. "gitlink.org.cn/cloudream/jcs-pub/common/pkgs/ioswitch2/ops2"
  9. "gitlink.org.cn/cloudream/jcs-pub/common/pkgs/storage/types"
  10. )
  11. func CompleteMultipart(blocks []clitypes.ObjectBlock, blockSpaces []clitypes.UserSpaceDetail, targetSpace clitypes.UserSpaceDetail, shardInfoKey string, blder *exec.PlanBuilder) error {
  12. da := ops2.NewGraphNodeBuilder()
  13. sizes := make([]int64, len(blocks))
  14. for i, blk := range blocks {
  15. sizes[i] = blk.Size
  16. }
  17. joinNode := da.NewSegmentJoin(sizes)
  18. if err := setEnvBySpace(joinNode, &targetSpace); err != nil {
  19. return fmt.Errorf("set node env by user space: %w", err)
  20. }
  21. for i, blk := range blocks {
  22. gs := da.NewGetShardInfo(blockSpaces[i], blk.FileHash)
  23. gs.Env().ToEnvDriver(true)
  24. br := da.NewBaseReadDyn(nil, blockSpaces[i], types.DefaultOpen())
  25. if err := setEnvBySpace(br, &blockSpaces[i]); err != nil {
  26. return fmt.Errorf("set node env by user space: %w", err)
  27. }
  28. gs.FileInfoVar().ToSlot(br.FileInfoSlot())
  29. br.Output().ToSlot(joinNode.InputSlot(i))
  30. }
  31. // TODO 应该采取更合理的方式同时支持Parser和直接生成DAG
  32. br := da.NewBaseWrite(nil, targetSpace, types.MakeTempDirPath(&targetSpace, os2.GenerateRandomFileName(20)), types.WriteOption{})
  33. if err := setEnvBySpace(br, &targetSpace); err != nil {
  34. return fmt.Errorf("set node env by user space: %w", err)
  35. }
  36. as := da.NewStoreShard(targetSpace, shardInfoKey)
  37. as.Env().ToEnvDriver(true)
  38. joinNode.Joined().ToSlot(br.Input())
  39. if shardInfoKey != "" {
  40. store := da.NewStore()
  41. store.Env().ToEnvDriver(true)
  42. store.Store(shardInfoKey, as.ShardInfoVar().Var())
  43. }
  44. err := plan.Compile(da.Graph, blder)
  45. if err != nil {
  46. return err
  47. }
  48. return nil
  49. }

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