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.

misc.go 4.3 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. package opt
  2. import (
  3. "gitlink.org.cn/cloudream/common/pkgs/ioswitch/dag"
  4. "gitlink.org.cn/cloudream/common/utils/math2"
  5. "gitlink.org.cn/cloudream/storage/common/pkgs/ioswitch2/ops2"
  6. "gitlink.org.cn/cloudream/storage/common/pkgs/ioswitch2/parser/state"
  7. )
  8. // 删除未使用的From流,不会删除FromDriver
  9. func RemoveUnusedFromNode(ctx *state.GenerateState) {
  10. dag.WalkOnlyType[ops2.FromNode](ctx.DAG.Graph, func(node ops2.FromNode) bool {
  11. if _, ok := node.(*ops2.FromDriverNode); ok {
  12. return true
  13. }
  14. if node.Output().Var().Dst.Len() == 0 {
  15. ctx.DAG.RemoveNode(node)
  16. }
  17. return true
  18. })
  19. }
  20. // 对于所有未使用的流,增加Drop指令
  21. func DropUnused(ctx *state.GenerateState) {
  22. ctx.DAG.Walk(func(node dag.Node) bool {
  23. for _, out := range node.OutputStreams().Slots.RawArray() {
  24. if out.Dst.Len() == 0 {
  25. n := ctx.DAG.NewDropStream()
  26. *n.Env() = *node.Env()
  27. n.SetInput(out)
  28. }
  29. }
  30. return true
  31. })
  32. }
  33. // 为IPFS写入指令存储结果
  34. func StoreShardWriteResult(ctx *state.GenerateState) {
  35. dag.WalkOnlyType[*ops2.ShardWriteNode](ctx.DAG.Graph, func(n *ops2.ShardWriteNode) bool {
  36. if n.FileHashStoreKey == "" {
  37. return true
  38. }
  39. storeNode := ctx.DAG.NewStore()
  40. storeNode.Env().ToEnvDriver()
  41. storeNode.Store(n.FileHashStoreKey, n.FileHashVar())
  42. return true
  43. })
  44. dag.WalkOnlyType[*ops2.BypassToShardStoreNode](ctx.DAG.Graph, func(n *ops2.BypassToShardStoreNode) bool {
  45. if n.FileHashStoreKey == "" {
  46. return true
  47. }
  48. storeNode := ctx.DAG.NewStore()
  49. storeNode.Env().ToEnvDriver()
  50. storeNode.Store(n.FileHashStoreKey, n.FileHashVar().Var())
  51. return true
  52. })
  53. }
  54. // 生成Range指令。StreamRange可能超过文件总大小,但Range指令会在数据量不够时不报错而是正常返回
  55. func GenerateRange(ctx *state.GenerateState) {
  56. for to, toNode := range ctx.ToNodes {
  57. toStrIdx := to.GetStreamIndex()
  58. toRng := to.GetRange()
  59. if toStrIdx.IsRaw() {
  60. n := ctx.DAG.NewRange()
  61. toInput := toNode.Input()
  62. *n.Env() = *toInput.Var().Src.Env()
  63. rnged := n.RangeStream(toInput.Var(), math2.Range{
  64. Offset: toRng.Offset - ctx.StreamRange.Offset,
  65. Length: toRng.Length,
  66. })
  67. toInput.Var().NotTo(toNode)
  68. toNode.SetInput(rnged)
  69. } else if toStrIdx.IsEC() {
  70. stripSize := int64(ctx.Ft.ECParam.ChunkSize * ctx.Ft.ECParam.K)
  71. blkStartIdx := ctx.StreamRange.Offset / stripSize
  72. blkStart := blkStartIdx * int64(ctx.Ft.ECParam.ChunkSize)
  73. n := ctx.DAG.NewRange()
  74. toInput := toNode.Input()
  75. *n.Env() = *toInput.Var().Src.Env()
  76. rnged := n.RangeStream(toInput.Var(), math2.Range{
  77. Offset: toRng.Offset - blkStart,
  78. Length: toRng.Length,
  79. })
  80. toInput.Var().NotTo(toNode)
  81. toNode.SetInput(rnged)
  82. } else if toStrIdx.IsSegment() {
  83. // if frNode, ok := toNode.Input().Var().From().Node.(ops2.FromNode); ok {
  84. // // 目前只有To也是分段时,才可能对接一个提供分段的From,此时不需要再生成Range指令
  85. // if frNode.GetFrom().GetStreamIndex().IsSegment() {
  86. // continue
  87. // }
  88. // }
  89. // segStart := ctx.Ft.SegmentParam.CalcSegmentStart(toStrIdx.Index)
  90. // strStart := segStart + toRng.Offset
  91. // n := ctx.DAG.NewRange()
  92. // toInput := toNode.Input()
  93. // *n.Env() = *toInput.Var().From().Node.Env()
  94. // rnged := n.RangeStream(toInput.Var(), exec.Range{
  95. // Offset: strStart - ctx.StreamRange.Offset,
  96. // Length: toRng.Length,
  97. // })
  98. // toInput.Var().NotTo(toNode, toInput.Index)
  99. // toNode.SetInput(rnged)
  100. }
  101. }
  102. }
  103. // 生成Clone指令
  104. func GenerateClone(ctx *state.GenerateState) {
  105. ctx.DAG.Walk(func(node dag.Node) bool {
  106. for _, outVar := range node.OutputStreams().Slots.RawArray() {
  107. if outVar.Dst.Len() <= 1 {
  108. continue
  109. }
  110. c := ctx.DAG.NewCloneStream()
  111. *c.Env() = *node.Env()
  112. for _, dst := range outVar.Dst.RawArray() {
  113. c.NewOutput().To(dst, dst.InputStreams().IndexOf(outVar))
  114. }
  115. outVar.Dst.Resize(0)
  116. c.SetInput(outVar)
  117. }
  118. for _, outVar := range node.OutputValues().Slots.RawArray() {
  119. if outVar.Dst.Len() <= 1 {
  120. continue
  121. }
  122. t := ctx.DAG.NewCloneValue()
  123. *t.Env() = *node.Env()
  124. for _, dst := range outVar.Dst.RawArray() {
  125. t.NewOutput().To(dst, dst.InputValues().IndexOf(outVar))
  126. }
  127. outVar.Dst.Resize(0)
  128. t.SetInput(outVar)
  129. }
  130. return true
  131. })
  132. }

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