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.5 kB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. package plans
  2. import (
  3. "gitlink.org.cn/cloudream/common/pkgs/ioswitch/exec"
  4. "gitlink.org.cn/cloudream/common/pkgs/ioswitch/plan"
  5. stgmod "gitlink.org.cn/cloudream/storage/common/models"
  6. "gitlink.org.cn/cloudream/storage/common/pkgs/ioswitch2/ops2"
  7. "gitlink.org.cn/cloudream/storage/common/pkgs/storage/types"
  8. )
  9. func CompleteMultipart(blocks []stgmod.ObjectBlock, blockStgs []stgmod.StorageDetail, targetStg stgmod.StorageDetail, shardInfoKey string, blder *exec.PlanBuilder) error {
  10. da := ops2.NewGraphNodeBuilder()
  11. sizes := make([]int64, len(blocks))
  12. for i, blk := range blocks {
  13. sizes[i] = blk.Size
  14. }
  15. joinNode := da.NewSegmentJoin(sizes)
  16. joinNode.Env().ToEnvWorker(getWorkerInfo(*targetStg.MasterHub))
  17. joinNode.Env().Pinned = true
  18. for i, blk := range blocks {
  19. rd := da.NewShardRead(nil, blk.StorageID, types.NewOpen(blk.FileHash))
  20. rd.Env().ToEnvWorker(getWorkerInfo(*blockStgs[i].MasterHub))
  21. rd.Env().Pinned = true
  22. rd.Output().ToSlot(joinNode.InputSlot(i))
  23. }
  24. // TODO 应该采取更合理的方式同时支持Parser和直接生成DAG
  25. wr := da.NewShardWrite(nil, targetStg, shardInfoKey)
  26. wr.Env().ToEnvWorker(getWorkerInfo(*targetStg.MasterHub))
  27. wr.Env().Pinned = true
  28. joinNode.Joined().ToSlot(wr.Input())
  29. if shardInfoKey != "" {
  30. store := da.NewStore()
  31. store.Env().ToEnvDriver()
  32. store.Store(shardInfoKey, wr.FileHashVar())
  33. }
  34. err := plan.Compile(da.Graph, blder)
  35. if err != nil {
  36. return err
  37. }
  38. return nil
  39. }

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