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 14 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534
  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/storage/common/pkgs/ec"
  8. "gitlink.org.cn/cloudream/storage/common/pkgs/ioswitch"
  9. "gitlink.org.cn/cloudream/storage/common/pkgs/ioswitch/dag"
  10. "gitlink.org.cn/cloudream/storage/common/pkgs/ioswitch/exec"
  11. "gitlink.org.cn/cloudream/storage/common/pkgs/ioswitch/ops"
  12. )
  13. type IPFSReadType struct {
  14. FileHash string
  15. Option ipfs.ReadOption
  16. }
  17. func (t *IPFSReadType) InitNode(node *Node) {
  18. dag.NodeNewOutputStream(node, VarProps{})
  19. }
  20. func (t *IPFSReadType) GenerateOp(node *Node, blder *exec.PlanBuilder) error {
  21. addOpByEnv(&ops.IPFSRead{
  22. Output: node.OutputStreams[0].Props.Var.(*ioswitch.StreamVar),
  23. FileHash: t.FileHash,
  24. Option: t.Option,
  25. }, node.Env, blder)
  26. return nil
  27. }
  28. func (t *IPFSReadType) String(node *Node) string {
  29. return fmt.Sprintf("IPFSRead[%s,%v+%v]%v%v", t.FileHash, t.Option.Offset, t.Option.Length, formatStreamIO(node), formatValueIO(node))
  30. }
  31. type IPFSWriteType struct {
  32. FileHashStoreKey string
  33. Range Range
  34. }
  35. func (t *IPFSWriteType) InitNode(node *Node) {
  36. dag.NodeDeclareInputStream(node, 1)
  37. dag.NodeNewOutputValue(node, VarProps{})
  38. }
  39. func (t *IPFSWriteType) GenerateOp(op *Node, blder *exec.PlanBuilder) error {
  40. addOpByEnv(&ops.IPFSWrite{
  41. Input: op.InputStreams[0].Props.Var.(*ioswitch.StreamVar),
  42. FileHash: op.OutputValues[0].Props.Var.(*ioswitch.StringVar),
  43. }, op.Env, blder)
  44. return nil
  45. }
  46. func (t *IPFSWriteType) String(node *Node) string {
  47. return fmt.Sprintf("IPFSWrite[%s,%v+%v](%v>)", t.FileHashStoreKey, t.Range.Offset, t.Range.Length, formatStreamIO(node), formatValueIO(node))
  48. }
  49. type ChunkedSplitType struct {
  50. OutputCount int
  51. ChunkSize int
  52. }
  53. func (t *ChunkedSplitType) InitNode(node *Node) {
  54. dag.NodeDeclareInputStream(node, 1)
  55. for i := 0; i < t.OutputCount; i++ {
  56. dag.NodeNewOutputStream(node, VarProps{})
  57. }
  58. }
  59. func (t *ChunkedSplitType) GenerateOp(op *Node, blder *exec.PlanBuilder) error {
  60. addOpByEnv(&ops.ChunkedSplit{
  61. Input: op.InputStreams[0].Props.Var.(*ioswitch.StreamVar),
  62. Outputs: lo.Map(op.OutputStreams, func(v *StreamVar, idx int) *ioswitch.StreamVar {
  63. return v.Props.Var.(*ioswitch.StreamVar)
  64. }),
  65. ChunkSize: t.ChunkSize,
  66. PaddingZeros: true,
  67. }, op.Env, blder)
  68. return nil
  69. }
  70. func (t *ChunkedSplitType) String(node *Node) string {
  71. return fmt.Sprintf("ChunkedSplit[%v]", t.ChunkSize, formatStreamIO(node), formatValueIO(node))
  72. }
  73. type ChunkedJoinType struct {
  74. InputCount int
  75. ChunkSize int
  76. }
  77. func (t *ChunkedJoinType) InitNode(node *Node) {
  78. dag.NodeDeclareInputStream(node, t.InputCount)
  79. dag.NodeNewOutputStream(node, VarProps{})
  80. }
  81. func (t *ChunkedJoinType) GenerateOp(op *Node, blder *exec.PlanBuilder) error {
  82. addOpByEnv(&ops.ChunkedJoin{
  83. Inputs: lo.Map(op.InputStreams, func(v *StreamVar, idx int) *ioswitch.StreamVar {
  84. return v.Props.Var.(*ioswitch.StreamVar)
  85. }),
  86. Output: op.OutputStreams[0].Props.Var.(*ioswitch.StreamVar),
  87. ChunkSize: t.ChunkSize,
  88. }, op.Env, blder)
  89. return nil
  90. }
  91. func (t *ChunkedJoinType) String(node *Node) string {
  92. return fmt.Sprintf("ChunkedJoin[%v]", t.ChunkSize, formatStreamIO(node), formatValueIO(node))
  93. }
  94. type CloneStreamType struct{}
  95. func (t *CloneStreamType) InitNode(node *Node) {
  96. dag.NodeDeclareInputStream(node, 1)
  97. }
  98. func (t *CloneStreamType) GenerateOp(op *Node, blder *exec.PlanBuilder) error {
  99. addOpByEnv(&ops.CloneStream{
  100. Input: op.InputStreams[0].Props.Var.(*ioswitch.StreamVar),
  101. Outputs: lo.Map(op.OutputStreams, func(v *StreamVar, idx int) *ioswitch.StreamVar {
  102. return v.Props.Var.(*ioswitch.StreamVar)
  103. }),
  104. }, op.Env, blder)
  105. return nil
  106. }
  107. func (t *CloneStreamType) NewOutput(node *Node) *StreamVar {
  108. return dag.NodeNewOutputStream(node, VarProps{})
  109. }
  110. func (t *CloneStreamType) String(node *Node) string {
  111. return fmt.Sprintf("CloneStream[]%v%v", formatStreamIO(node), formatValueIO(node))
  112. }
  113. type CloneVarType struct{}
  114. func (t *CloneVarType) InitNode(node *Node) {
  115. dag.NodeDeclareInputValue(node, 1)
  116. }
  117. func (t *CloneVarType) GenerateOp(op *Node, blder *exec.PlanBuilder) error {
  118. addOpByEnv(&ops.CloneVar{
  119. Raw: op.InputValues[0].Props.Var,
  120. Cloneds: lo.Map(op.OutputValues, func(v *ValueVar, idx int) ioswitch.Var {
  121. return v.Props.Var
  122. }),
  123. }, op.Env, blder)
  124. return nil
  125. }
  126. func (t *CloneVarType) NewOutput(node *Node) *ValueVar {
  127. return dag.NodeNewOutputValue(node, VarProps{})
  128. }
  129. func (t *CloneVarType) String(node *Node) string {
  130. return fmt.Sprintf("CloneVar[]%v%v", formatStreamIO(node), formatValueIO(node))
  131. }
  132. type MultiplyType struct {
  133. EC cdssdk.ECRedundancy
  134. }
  135. func (t *MultiplyType) InitNode(node *Node) {}
  136. func (t *MultiplyType) GenerateOp(op *Node, blder *exec.PlanBuilder) error {
  137. var inputIdxs []int
  138. var outputIdxs []int
  139. for _, in := range op.InputStreams {
  140. inputIdxs = append(inputIdxs, in.Props.StreamIndex)
  141. }
  142. for _, out := range op.OutputStreams {
  143. outputIdxs = append(outputIdxs, out.Props.StreamIndex)
  144. }
  145. rs, err := ec.NewRs(t.EC.K, t.EC.N)
  146. coef, err := rs.GenerateMatrix(inputIdxs, outputIdxs)
  147. if err != nil {
  148. return err
  149. }
  150. addOpByEnv(&ops.ECMultiply{
  151. Coef: coef,
  152. Inputs: lo.Map(op.InputStreams, func(v *StreamVar, idx int) *ioswitch.StreamVar { return v.Props.Var.(*ioswitch.StreamVar) }),
  153. Outputs: lo.Map(op.OutputStreams, func(v *StreamVar, idx int) *ioswitch.StreamVar { return v.Props.Var.(*ioswitch.StreamVar) }),
  154. ChunkSize: t.EC.ChunkSize,
  155. }, op.Env, blder)
  156. return nil
  157. }
  158. func (t *MultiplyType) AddInput(node *Node, str *StreamVar) {
  159. node.InputStreams = append(node.InputStreams, str)
  160. str.To(node, len(node.InputStreams)-1)
  161. }
  162. func (t *MultiplyType) NewOutput(node *Node, dataIndex int) *StreamVar {
  163. return dag.NodeNewOutputStream(node, VarProps{StreamIndex: dataIndex})
  164. }
  165. func (t *MultiplyType) String(node *Node) string {
  166. return fmt.Sprintf("Multiply[]%v%v", formatStreamIO(node), formatValueIO(node))
  167. }
  168. type FileReadType struct {
  169. FilePath string
  170. }
  171. func (t *FileReadType) InitNode(node *Node) {
  172. dag.NodeNewOutputStream(node, VarProps{})
  173. }
  174. func (t *FileReadType) GenerateOp(op *Node, blder *exec.PlanBuilder) error {
  175. addOpByEnv(&ops.FileRead{
  176. Output: op.OutputStreams[0].Props.Var.(*ioswitch.StreamVar),
  177. FilePath: t.FilePath,
  178. }, op.Env, blder)
  179. return nil
  180. }
  181. func (t *FileReadType) String(node *Node) string {
  182. return fmt.Sprintf("FileRead[%s]%v%v", t.FilePath, formatStreamIO(node), formatValueIO(node))
  183. }
  184. type FileWriteType struct {
  185. FilePath string
  186. }
  187. func (t *FileWriteType) InitNode(node *Node) {
  188. dag.NodeDeclareInputStream(node, 1)
  189. }
  190. func (t *FileWriteType) GenerateOp(op *Node, blder *exec.PlanBuilder) error {
  191. addOpByEnv(&ops.FileWrite{
  192. Input: op.InputStreams[0].Props.Var.(*ioswitch.StreamVar),
  193. FilePath: t.FilePath,
  194. }, op.Env, blder)
  195. return nil
  196. }
  197. type FromExecutorType struct {
  198. Handle *exec.ExecutorWriteStream
  199. }
  200. func (t *FromExecutorType) InitNode(node *Node) {
  201. dag.NodeNewOutputStream(node, VarProps{})
  202. }
  203. func (t *FromExecutorType) GenerateOp(op *Node, blder *exec.PlanBuilder) error {
  204. t.Handle.Var = op.OutputStreams[0].Props.Var.(*ioswitch.StreamVar)
  205. return nil
  206. }
  207. func (t *FromExecutorType) String(node *Node) string {
  208. return fmt.Sprintf("FromExecutor[]%v%v", formatStreamIO(node), formatValueIO(node))
  209. }
  210. type ToExecutorType struct {
  211. Handle *exec.ExecutorReadStream
  212. Range Range
  213. }
  214. func (t *ToExecutorType) InitNode(node *Node) {
  215. dag.NodeDeclareInputStream(node, 1)
  216. }
  217. func (t *ToExecutorType) GenerateOp(op *Node, blder *exec.PlanBuilder) error {
  218. t.Handle.Var = op.InputStreams[0].Props.Var.(*ioswitch.StreamVar)
  219. return nil
  220. }
  221. func (t *ToExecutorType) String(node *Node) string {
  222. return fmt.Sprintf("ToExecutor[%v+%v]%v%v", t.Range.Offset, t.Range.Length, formatStreamIO(node), formatValueIO(node))
  223. }
  224. type StoreType struct {
  225. StoreKey string
  226. }
  227. func (t *StoreType) InitNode(node *Node) {
  228. dag.NodeDeclareInputValue(node, 1)
  229. }
  230. func (t *StoreType) GenerateOp(op *Node, blder *exec.PlanBuilder) error {
  231. blder.AtExecutor().AddOp(&ops.Store{
  232. Var: op.InputValues[0].Props.Var,
  233. Key: t.StoreKey,
  234. Store: blder.ExecutorPlan.StoreMap,
  235. })
  236. return nil
  237. }
  238. func (t *StoreType) String(node *Node) string {
  239. return fmt.Sprintf("Store[%s]%v%v", t.StoreKey, formatStreamIO(node), formatValueIO(node))
  240. }
  241. type DropType struct{}
  242. func (t *DropType) InitNode(node *Node) {
  243. dag.NodeDeclareInputStream(node, 1)
  244. }
  245. func (t *DropType) GenerateOp(op *Node, blder *exec.PlanBuilder) error {
  246. addOpByEnv(&ops.DropStream{
  247. Input: op.InputStreams[0].Props.Var.(*ioswitch.StreamVar),
  248. }, op.Env, blder)
  249. return nil
  250. }
  251. func (t *DropType) String(node *Node) string {
  252. return fmt.Sprintf("Drop[]%v%v", formatStreamIO(node), formatValueIO(node))
  253. }
  254. type SendStreamType struct {
  255. }
  256. func (t *SendStreamType) InitNode(node *Node) {
  257. dag.NodeDeclareInputStream(node, 1)
  258. dag.NodeNewOutputStream(node, VarProps{})
  259. }
  260. func (t *SendStreamType) GenerateOp(op *Node, blder *exec.PlanBuilder) error {
  261. toAgt := op.OutputStreams[0].Toes[0].Node.Env.Worker.(*AgentWorker)
  262. addOpByEnv(&ops.SendStream{
  263. Input: op.InputStreams[0].Props.Var.(*ioswitch.StreamVar),
  264. Send: op.OutputStreams[0].Props.Var.(*ioswitch.StreamVar),
  265. Node: toAgt.Node,
  266. }, op.Env, blder)
  267. return nil
  268. }
  269. func (t *SendStreamType) String(node *Node) string {
  270. return fmt.Sprintf("SendStream[]%v%v", formatStreamIO(node), formatValueIO(node))
  271. }
  272. type SendVarType struct {
  273. }
  274. func (t *SendVarType) InitNode(node *Node) {
  275. dag.NodeDeclareInputValue(node, 1)
  276. dag.NodeNewOutputValue(node, VarProps{})
  277. }
  278. func (t *SendVarType) GenerateOp(op *Node, blder *exec.PlanBuilder) error {
  279. toAgt := op.OutputValues[0].Toes[0].Node.Env.Worker.(*AgentWorker)
  280. addOpByEnv(&ops.SendVar{
  281. Input: op.InputValues[0].Props.Var,
  282. Send: op.OutputValues[0].Props.Var,
  283. Node: toAgt.Node,
  284. }, op.Env, blder)
  285. return nil
  286. }
  287. func (t *SendVarType) String(node *Node) string {
  288. return fmt.Sprintf("SendVar[]%v%v", formatStreamIO(node), formatValueIO(node))
  289. }
  290. type GetStreamType struct {
  291. }
  292. func (t *GetStreamType) InitNode(node *Node) {
  293. dag.NodeDeclareInputStream(node, 1)
  294. dag.NodeNewOutputValue(node, VarProps{})
  295. dag.NodeNewOutputStream(node, VarProps{})
  296. }
  297. func (t *GetStreamType) GenerateOp(op *Node, blder *exec.PlanBuilder) error {
  298. fromAgt := op.InputStreams[0].From.Node.Env.Worker.(*AgentWorker)
  299. addOpByEnv(&ops.GetStream{
  300. Signal: op.OutputValues[0].Props.Var.(*ioswitch.SignalVar),
  301. Output: op.OutputStreams[0].Props.Var.(*ioswitch.StreamVar),
  302. Target: op.InputStreams[0].Props.Var.(*ioswitch.StreamVar),
  303. Node: fromAgt.Node,
  304. }, op.Env, blder)
  305. return nil
  306. }
  307. func (t *GetStreamType) String(node *Node) string {
  308. return fmt.Sprintf("GetStream[]%v%v", formatStreamIO(node), formatValueIO(node))
  309. }
  310. type GetVaType struct {
  311. }
  312. func (t *GetVaType) InitNode(node *Node) {
  313. dag.NodeDeclareInputValue(node, 1)
  314. dag.NodeNewOutputValue(node, VarProps{})
  315. dag.NodeNewOutputValue(node, VarProps{})
  316. }
  317. func (t *GetVaType) GenerateOp(op *Node, blder *exec.PlanBuilder) error {
  318. fromAgt := op.InputValues[0].From.Node.Env.Worker.(*AgentWorker)
  319. addOpByEnv(&ops.GetVar{
  320. Signal: op.OutputValues[0].Props.Var.(*ioswitch.SignalVar),
  321. Output: op.OutputValues[1].Props.Var,
  322. Target: op.InputValues[0].Props.Var,
  323. Node: fromAgt.Node,
  324. }, op.Env, blder)
  325. return nil
  326. }
  327. func (t *GetVaType) String(node *Node) string {
  328. return fmt.Sprintf("GetVar[]%v%v", formatStreamIO(node), formatValueIO(node))
  329. }
  330. type RangeType struct {
  331. Range Range
  332. }
  333. func (t *RangeType) InitNode(node *Node) {
  334. dag.NodeDeclareInputStream(node, 1)
  335. dag.NodeNewOutputStream(node, VarProps{})
  336. }
  337. func (t *RangeType) GenerateOp(op *Node, blder *exec.PlanBuilder) error {
  338. addOpByEnv(&ops.Range{
  339. Input: op.InputStreams[0].Props.Var.(*ioswitch.StreamVar),
  340. Output: op.OutputStreams[0].Props.Var.(*ioswitch.StreamVar),
  341. Offset: t.Range.Offset,
  342. Length: t.Range.Length,
  343. }, op.Env, blder)
  344. return nil
  345. }
  346. func (t *RangeType) String(node *Node) string {
  347. return fmt.Sprintf("Range[%v+%v]%v%v", t.Range.Offset, t.Range.Length, formatStreamIO(node), formatValueIO(node))
  348. }
  349. type HoldUntilType struct {
  350. }
  351. func (t *HoldUntilType) InitNode(node *Node) {
  352. dag.NodeDeclareInputValue(node, 1)
  353. }
  354. func (t *HoldUntilType) GenerateOp(op *Node, blder *exec.PlanBuilder) error {
  355. o := &ops.HoldUntil{
  356. Waits: []*ioswitch.SignalVar{op.InputValues[0].Props.Var.(*ioswitch.SignalVar)},
  357. }
  358. for i := 0; i < len(op.OutputValues); i++ {
  359. o.Holds = append(o.Holds, op.InputValues[i+1].Props.Var)
  360. o.Emits = append(o.Emits, op.OutputValues[i].Props.Var)
  361. }
  362. for i := 0; i < len(op.OutputStreams); i++ {
  363. o.Holds = append(o.Holds, op.InputStreams[i].Props.Var)
  364. o.Emits = append(o.Emits, op.OutputStreams[i].Props.Var)
  365. }
  366. addOpByEnv(o, op.Env, blder)
  367. return nil
  368. }
  369. func (t *HoldUntilType) String(node *Node) string {
  370. return fmt.Sprintf("HoldUntil[]%v%v", formatStreamIO(node), formatValueIO(node))
  371. }
  372. func addOpByEnv(op ioswitch.Op, env dag.NodeEnv, blder *exec.PlanBuilder) {
  373. switch env.Type {
  374. case dag.EnvWorker:
  375. blder.AtAgent(env.Worker.(*AgentWorker).Node).AddOp(op)
  376. case dag.EnvExecutor:
  377. blder.AtExecutor().AddOp(op)
  378. }
  379. }
  380. func formatStreamIO(node *Node) string {
  381. is := ""
  382. for i, in := range node.InputStreams {
  383. if i > 0 {
  384. is += ","
  385. }
  386. if in == nil {
  387. is += "."
  388. } else {
  389. is += fmt.Sprintf("%v", in.ID)
  390. }
  391. }
  392. os := ""
  393. for i, out := range node.OutputStreams {
  394. if i > 0 {
  395. os += ","
  396. }
  397. if out == nil {
  398. os += "."
  399. } else {
  400. os += fmt.Sprintf("%v", out.ID)
  401. }
  402. }
  403. if is == "" && os == "" {
  404. return ""
  405. }
  406. return fmt.Sprintf("S{%s>%s}", is, os)
  407. }
  408. func formatValueIO(node *Node) string {
  409. is := ""
  410. for i, in := range node.InputValues {
  411. if i > 0 {
  412. is += ","
  413. }
  414. if in == nil {
  415. is += "."
  416. } else {
  417. is += fmt.Sprintf("%v", in.ID)
  418. }
  419. }
  420. os := ""
  421. for i, out := range node.OutputValues {
  422. if i > 0 {
  423. os += ","
  424. }
  425. if out == nil {
  426. os += "."
  427. } else {
  428. os += fmt.Sprintf("%v", out.ID)
  429. }
  430. }
  431. if is == "" && os == "" {
  432. return ""
  433. }
  434. return fmt.Sprintf("V{%s>%s}", is, os)
  435. }

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