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.

parser.go 2.0 kB

11 months ago
11 months ago
11 months ago
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. package parser
  2. import (
  3. "gitlink.org.cn/cloudream/common/pkgs/ioswitch/exec"
  4. "gitlink.org.cn/cloudream/common/pkgs/ioswitch/plan"
  5. "gitlink.org.cn/cloudream/jcs-pub/common/pkgs/ioswitch2"
  6. "gitlink.org.cn/cloudream/jcs-pub/common/pkgs/ioswitch2/parser/gen"
  7. "gitlink.org.cn/cloudream/jcs-pub/common/pkgs/ioswitch2/parser/opt"
  8. "gitlink.org.cn/cloudream/jcs-pub/common/pkgs/ioswitch2/parser/state"
  9. )
  10. func Parse(ft ioswitch2.FromTo, blder *exec.PlanBuilder) error {
  11. state := state.InitGenerateState(ft)
  12. // 分成两个阶段:
  13. // 1. 基于From和To生成更多指令,初步匹配to的需求
  14. err := gen.CheckEncodingParams(state)
  15. if err != nil {
  16. return err
  17. }
  18. // 计算一下打开流的范围
  19. gen.CalcStreamRange(state)
  20. err = gen.Extend(state)
  21. if err != nil {
  22. return err
  23. }
  24. // 2. 优化上一步生成的指令
  25. err = gen.FixSegmentJoin(state)
  26. if err != nil {
  27. return err
  28. }
  29. err = gen.FixSegmentSplit(state)
  30. if err != nil {
  31. return err
  32. }
  33. // 对于删除指令的优化,需要反复进行,直到没有变化为止。
  34. // 从目前实现上来说不会死循环
  35. for {
  36. opted := false
  37. if opt.RemoveUnusedJoin(state) {
  38. opted = true
  39. }
  40. if opt.RemoveUnusedMultiplyOutput(state) {
  41. opted = true
  42. }
  43. if opt.RemoveUnusedSplit(state) {
  44. opted = true
  45. }
  46. if opt.OmitSplitJoin(state) {
  47. opted = true
  48. }
  49. if opt.RemoveUnusedSegmentJoin(state) {
  50. opted = true
  51. }
  52. if opt.RemoveUnusedSegmentSplit(state) {
  53. opted = true
  54. }
  55. if opt.OmitSegmentSplitJoin(state) {
  56. opted = true
  57. }
  58. if !opted {
  59. break
  60. }
  61. }
  62. // 确定指令执行位置的过程,也需要反复进行,直到没有变化为止。
  63. for opt.Pin(state) {
  64. }
  65. // 下面这些只需要执行一次,但需要按顺序
  66. opt.RemoveUnusedFromNode(state)
  67. opt.UseECMultiplier(state)
  68. opt.UseS2STransfer(state)
  69. opt.UseMultipartUpcopyToShardStore(state)
  70. opt.DropUnused(state)
  71. opt.StoreShardWriteResult(state)
  72. opt.GenerateRange(state)
  73. opt.GenerateClone(state)
  74. return plan.Compile(state.DAG.Graph, blder)
  75. }

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