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.

ops.go 9.0 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401
  1. package plans
  2. import (
  3. "fmt"
  4. "github.com/samber/lo"
  5. "gitlink.org.cn/cloudream/common/pkgs/ipfs"
  6. cdssdk "gitlink.org.cn/cloudream/common/sdks/storage"
  7. "gitlink.org.cn/cloudream/common/utils/lo2"
  8. "gitlink.org.cn/cloudream/storage/common/pkgs/ec"
  9. "gitlink.org.cn/cloudream/storage/common/pkgs/ioswitch"
  10. "gitlink.org.cn/cloudream/storage/common/pkgs/ioswitch/ops"
  11. )
  12. type VarIndex int
  13. type StreamVar struct {
  14. DataIndex int
  15. From *Node
  16. Toes []*Node
  17. Var *ioswitch.StreamVar
  18. }
  19. func (v *StreamVar) AddTo(to *Node) {
  20. v.Toes = append(v.Toes, to)
  21. }
  22. func (v *StreamVar) RemoveTo(to *Node) {
  23. v.Toes = lo2.Remove(v.Toes, to)
  24. }
  25. type ValueVarType int
  26. const (
  27. StringValueVar ValueVarType = iota
  28. SignalValueVar
  29. )
  30. type ValueVar struct {
  31. Type ValueVarType
  32. From *Node
  33. Toes []*Node
  34. Var ioswitch.Var
  35. }
  36. func (v *ValueVar) AddTo(to *Node) {
  37. v.Toes = append(v.Toes, to)
  38. }
  39. func (v *ValueVar) RemoveTo(to *Node) {
  40. v.Toes = lo2.Remove(v.Toes, to)
  41. }
  42. type OpEnv interface {
  43. Equals(env OpEnv) bool
  44. }
  45. type AgentEnv struct {
  46. Node cdssdk.Node
  47. }
  48. func (e *AgentEnv) Equals(env OpEnv) bool {
  49. if agentEnv, ok := env.(*AgentEnv); ok {
  50. return e.Node.NodeID == agentEnv.Node.NodeID
  51. }
  52. return false
  53. }
  54. type ExecutorEnv struct{}
  55. func (e *ExecutorEnv) Equals(env OpEnv) bool {
  56. _, ok := env.(*ExecutorEnv)
  57. return ok
  58. }
  59. type OpType interface {
  60. GenerateOp(node *Node, blder *PlanBuilder) error
  61. }
  62. type Node struct {
  63. Env OpEnv // Op将在哪里执行,Agent或者Executor
  64. Type OpType
  65. InputStreams []*StreamVar
  66. OutputStreams []*StreamVar
  67. InputValues []*ValueVar
  68. OutputValues []*ValueVar
  69. }
  70. func (o *Node) NewOutputStream(dataIndex int) *StreamVar {
  71. v := &StreamVar{DataIndex: dataIndex, From: o}
  72. o.OutputStreams = append(o.OutputStreams, v)
  73. return v
  74. }
  75. func (o *Node) AddInputStream(str *StreamVar) {
  76. o.InputStreams = append(o.InputStreams, str)
  77. str.AddTo(o)
  78. }
  79. func (o *Node) ReplaceInputStream(old *StreamVar, new *StreamVar) {
  80. old.RemoveTo(o)
  81. new.AddTo(o)
  82. idx := lo.IndexOf(o.InputStreams, old)
  83. o.InputStreams[idx] = new
  84. }
  85. func (o *Node) NewOutputVar(typ ValueVarType) *ValueVar {
  86. v := &ValueVar{Type: typ, From: o}
  87. o.OutputValues = append(o.OutputValues, v)
  88. return v
  89. }
  90. func (o *Node) AddInputVar(v *ValueVar) {
  91. o.InputValues = append(o.InputValues, v)
  92. v.AddTo(o)
  93. }
  94. func (o *Node) ReplaceInputVar(old *ValueVar, new *ValueVar) {
  95. old.RemoveTo(o)
  96. new.AddTo(o)
  97. idx := lo.IndexOf(o.InputValues, old)
  98. o.InputValues[idx] = new
  99. }
  100. func (o *Node) String() string {
  101. return fmt.Sprintf("Node(%T)", o.Type)
  102. }
  103. type IPFSReadType struct {
  104. FileHash string
  105. Option ipfs.ReadOption
  106. }
  107. func (t *IPFSReadType) GenerateOp(node *Node, blder *PlanBuilder) error {
  108. addOpByEnv(&ops.IPFSRead{
  109. Output: node.OutputStreams[0].Var,
  110. FileHash: t.FileHash,
  111. Option: t.Option,
  112. }, node.Env, blder)
  113. return nil
  114. }
  115. type IPFSWriteType struct {
  116. FileHashStoreKey string
  117. Range Range
  118. }
  119. func (t *IPFSWriteType) GenerateOp(op *Node, blder *PlanBuilder) error {
  120. addOpByEnv(&ops.IPFSWrite{
  121. Input: op.InputStreams[0].Var,
  122. FileHash: op.OutputValues[0].Var.(*ioswitch.StringVar),
  123. }, op.Env, blder)
  124. return nil
  125. }
  126. type ChunkedSplitType struct {
  127. ChunkSize int
  128. PaddingZeros bool
  129. }
  130. func (t *ChunkedSplitType) GenerateOp(op *Node, blder *PlanBuilder) error {
  131. addOpByEnv(&ops.ChunkedSplit{
  132. Input: op.InputStreams[0].Var,
  133. Outputs: lo.Map(op.OutputStreams, func(v *StreamVar, idx int) *ioswitch.StreamVar {
  134. return v.Var
  135. }),
  136. ChunkSize: t.ChunkSize,
  137. PaddingZeros: t.PaddingZeros,
  138. }, op.Env, blder)
  139. return nil
  140. }
  141. type ChunkedJoinType struct {
  142. ChunkSize int
  143. }
  144. func (t *ChunkedJoinType) GenerateOp(op *Node, blder *PlanBuilder) error {
  145. addOpByEnv(&ops.ChunkedJoin{
  146. Inputs: lo.Map(op.InputStreams, func(v *StreamVar, idx int) *ioswitch.StreamVar {
  147. return v.Var
  148. }),
  149. Output: op.OutputStreams[0].Var,
  150. ChunkSize: t.ChunkSize,
  151. }, op.Env, blder)
  152. return nil
  153. }
  154. type CloneStreamType struct{}
  155. func (t *CloneStreamType) GenerateOp(op *Node, blder *PlanBuilder) error {
  156. addOpByEnv(&ops.CloneStream{
  157. Input: op.InputStreams[0].Var,
  158. Outputs: lo.Map(op.OutputStreams, func(v *StreamVar, idx int) *ioswitch.StreamVar {
  159. return v.Var
  160. }),
  161. }, op.Env, blder)
  162. return nil
  163. }
  164. type CloneVarType struct{}
  165. func (t *CloneVarType) GenerateOp(op *Node, blder *PlanBuilder) error {
  166. addOpByEnv(&ops.CloneVar{
  167. Raw: op.InputValues[0].Var,
  168. Cloneds: lo.Map(op.OutputValues, func(v *ValueVar, idx int) ioswitch.Var {
  169. return v.Var
  170. }),
  171. }, op.Env, blder)
  172. return nil
  173. }
  174. type MultiplyOp struct {
  175. EC cdssdk.ECRedundancy
  176. }
  177. func (t *MultiplyOp) GenerateOp(op *Node, blder *PlanBuilder) error {
  178. var inputIdxs []int
  179. var outputIdxs []int
  180. for _, in := range op.InputStreams {
  181. inputIdxs = append(inputIdxs, in.DataIndex)
  182. }
  183. for _, out := range op.OutputStreams {
  184. outputIdxs = append(outputIdxs, out.DataIndex)
  185. }
  186. rs, err := ec.NewRs(t.EC.K, t.EC.N)
  187. coef, err := rs.GenerateMatrix(inputIdxs, outputIdxs)
  188. if err != nil {
  189. return err
  190. }
  191. addOpByEnv(&ops.ECMultiply{
  192. Coef: coef,
  193. Inputs: lo.Map(op.InputStreams, func(v *StreamVar, idx int) *ioswitch.StreamVar { return v.Var }),
  194. Outputs: lo.Map(op.OutputStreams, func(v *StreamVar, idx int) *ioswitch.StreamVar { return v.Var }),
  195. ChunkSize: t.EC.ChunkSize,
  196. }, op.Env, blder)
  197. return nil
  198. }
  199. type FileReadOp struct {
  200. FilePath string
  201. }
  202. func (t *FileReadOp) GenerateOp(op *Node, blder *PlanBuilder) error {
  203. addOpByEnv(&ops.FileRead{
  204. Output: op.OutputStreams[0].Var,
  205. FilePath: t.FilePath,
  206. }, op.Env, blder)
  207. return nil
  208. }
  209. type FileWriteOp struct {
  210. FilePath string
  211. }
  212. func (t *FileWriteOp) GenerateOp(op *Node, blder *PlanBuilder) error {
  213. addOpByEnv(&ops.FileWrite{
  214. Input: op.InputStreams[0].Var,
  215. FilePath: t.FilePath,
  216. }, op.Env, blder)
  217. return nil
  218. }
  219. type FromExecutorOp struct {
  220. Handle *ExecutorWriteStream
  221. }
  222. func (t *FromExecutorOp) GenerateOp(op *Node, blder *PlanBuilder) error {
  223. t.Handle.Var = op.OutputStreams[0].Var
  224. return nil
  225. }
  226. type ToExecutorOp struct {
  227. Handle *ExecutorReadStream
  228. Range Range
  229. }
  230. func (t *ToExecutorOp) GenerateOp(op *Node, blder *PlanBuilder) error {
  231. t.Handle.Var = op.InputStreams[0].Var
  232. return nil
  233. }
  234. type StoreOp struct {
  235. StoreKey string
  236. }
  237. func (t *StoreOp) GenerateOp(op *Node, blder *PlanBuilder) error {
  238. blder.AtExecutor().AddOp(&ops.Store{
  239. Var: op.InputValues[0].Var,
  240. Key: t.StoreKey,
  241. Store: blder.ExecutorPlan.StoreMap,
  242. })
  243. return nil
  244. }
  245. type DropOp struct{}
  246. func (t *DropOp) GenerateOp(op *Node, blder *PlanBuilder) error {
  247. addOpByEnv(&ops.DropStream{
  248. Input: op.InputStreams[0].Var,
  249. }, op.Env, blder)
  250. return nil
  251. }
  252. type SendStreamOp struct{}
  253. func (t *SendStreamOp) GenerateOp(op *Node, blder *PlanBuilder) error {
  254. toAgt := op.OutputStreams[0].Toes[0].Env.(*AgentEnv)
  255. addOpByEnv(&ops.SendStream{
  256. Input: op.InputStreams[0].Var,
  257. Send: op.OutputStreams[0].Var,
  258. Node: toAgt.Node,
  259. }, op.Env, blder)
  260. return nil
  261. }
  262. type GetStreamOp struct{}
  263. func (t *GetStreamOp) GenerateOp(op *Node, blder *PlanBuilder) error {
  264. fromAgt := op.InputStreams[0].From.Env.(*AgentEnv)
  265. addOpByEnv(&ops.GetStream{
  266. Signal: op.OutputValues[0].Var.(*ioswitch.SignalVar),
  267. Output: op.OutputStreams[0].Var,
  268. Get: op.InputStreams[0].Var,
  269. Node: fromAgt.Node,
  270. }, op.Env, blder)
  271. return nil
  272. }
  273. type SendVarOp struct{}
  274. func (t *SendVarOp) GenerateOp(op *Node, blder *PlanBuilder) error {
  275. toAgt := op.OutputValues[0].Toes[0].Env.(*AgentEnv)
  276. addOpByEnv(&ops.SendVar{
  277. Input: op.InputValues[0].Var,
  278. Send: op.OutputValues[0].Var,
  279. Node: toAgt.Node,
  280. }, op.Env, blder)
  281. return nil
  282. }
  283. type GetVarOp struct{}
  284. func (t *GetVarOp) GenerateOp(op *Node, blder *PlanBuilder) error {
  285. fromAgt := op.InputValues[0].From.Env.(*AgentEnv)
  286. addOpByEnv(&ops.GetVar{
  287. Signal: op.OutputValues[0].Var.(*ioswitch.SignalVar),
  288. Output: op.OutputValues[1].Var,
  289. Get: op.InputValues[0].Var,
  290. Node: fromAgt.Node,
  291. }, op.Env, blder)
  292. return nil
  293. }
  294. type RangeType struct {
  295. Range Range
  296. }
  297. func (t *RangeType) GenerateOp(op *Node, blder *PlanBuilder) error {
  298. addOpByEnv(&ops.Range{
  299. Input: op.InputStreams[0].Var,
  300. Output: op.OutputStreams[0].Var,
  301. Offset: t.Range.Offset,
  302. Length: t.Range.Length,
  303. }, op.Env, blder)
  304. return nil
  305. }
  306. type HoldUntilOp struct {
  307. }
  308. func (t *HoldUntilOp) GenerateOp(op *Node, blder *PlanBuilder) error {
  309. o := &ops.HoldUntil{
  310. Waits: []*ioswitch.SignalVar{op.InputValues[0].Var.(*ioswitch.SignalVar)},
  311. }
  312. for i := 0; i < len(op.OutputValues); i++ {
  313. o.Holds = append(o.Holds, op.InputValues[i+1].Var)
  314. o.Emits = append(o.Emits, op.OutputValues[i].Var)
  315. }
  316. for i := 0; i < len(op.OutputStreams); i++ {
  317. o.Holds = append(o.Holds, op.InputStreams[i].Var)
  318. o.Emits = append(o.Emits, op.OutputStreams[i].Var)
  319. }
  320. addOpByEnv(o, op.Env, blder)
  321. return nil
  322. }
  323. func addOpByEnv(op ioswitch.Op, env OpEnv, blder *PlanBuilder) {
  324. switch env := env.(type) {
  325. case *AgentEnv:
  326. blder.AtAgent(env.Node).AddOp(op)
  327. case *ExecutorEnv:
  328. blder.AtExecutor().AddOp(op)
  329. }
  330. }

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