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.

s2s.go 2.2 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. package opt
  2. import (
  3. "gitlink.org.cn/cloudream/jcs-pub/common/pkgs/ioswitch/dag"
  4. "gitlink.org.cn/cloudream/jcs-pub/common/pkgs/ioswitch2/ops2"
  5. "gitlink.org.cn/cloudream/jcs-pub/common/pkgs/ioswitch2/parser/state"
  6. "gitlink.org.cn/cloudream/jcs-pub/common/pkgs/storage/factory"
  7. )
  8. // 将直接从一个存储服务传到另一个存储服务的过程换成S2S传输
  9. func UseS2STransfer(ctx *state.GenerateState) {
  10. // S2S传输暂不支持只传文件的一部分
  11. if ctx.StreamRange.Offset != 0 || ctx.StreamRange.Length != nil {
  12. return
  13. }
  14. dag.WalkOnlyType[*ops2.BaseWriteNode](ctx.DAG.Graph, func(node *ops2.BaseWriteNode) bool {
  15. inputVar := node.Input().Var()
  16. if inputVar == nil {
  17. return true
  18. }
  19. s2s, err := factory.GetBuilder(&node.UserSpace).CreateS2STransfer(true)
  20. if err != nil {
  21. return true
  22. }
  23. // 只有BaseRead->BaseWrite的情况才可以进行S2S传输
  24. switch inputNode := inputVar.Src.(type) {
  25. case *ops2.BaseReadNode:
  26. if !s2s.CanTransfer(&inputNode.UserSpace, &node.UserSpace) {
  27. return true
  28. }
  29. s2sNode := ctx.DAG.NewS2STransfer(inputNode.UserSpace, inputNode.Path, node.UserSpace, node.Path)
  30. // 直传指令在目的地Hub上执行
  31. s2sNode.Env().CopyFrom(node.Env())
  32. // 原本BaseWriteNode的FileInfoVar被替换成S2SNode的FileInfoVar
  33. for _, dstSlot := range node.FileInfoVar().ListDstSlots() {
  34. s2sNode.FileInfoVar().ToSlot(dstSlot)
  35. }
  36. case *ops2.BaseReadDynNode:
  37. if !s2s.CanTransfer(&inputNode.UserSpace, &node.UserSpace) {
  38. return true
  39. }
  40. s2sNode := ctx.DAG.NewS2STransferDyn(inputNode.UserSpace, node.UserSpace, node.Path)
  41. // 直传指令在目的地Hub上执行
  42. s2sNode.Env().CopyFrom(node.Env())
  43. // 原本BaseWriteNode的FileInfoVar被替换成S2SNode的FileInfoVar
  44. for _, dstSlot := range node.FileInfoVar().ListDstSlots() {
  45. s2sNode.FileInfoVar().ToSlot(dstSlot)
  46. }
  47. // 传递给BaseReadDyn的FileInfo也给S2S一份
  48. srcFileInfoVar := inputNode.FileInfoSlot().Var()
  49. if srcFileInfoVar != nil {
  50. srcFileInfoVar.ToSlot(s2sNode.SrcFileInfoSlot())
  51. }
  52. default:
  53. return true
  54. }
  55. // 中断srcVar的流向
  56. inputVar.NotTo(node)
  57. // 从计划中删除目标节点
  58. ctx.DAG.RemoveNode(node)
  59. return true
  60. })
  61. }

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