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.9 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. package ops2
  2. import (
  3. "fmt"
  4. "gitlink.org.cn/cloudream/common/pkgs/ioswitch/dag"
  5. "gitlink.org.cn/cloudream/common/pkgs/ioswitch/exec"
  6. clitypes "gitlink.org.cn/cloudream/jcs-pub/client/types"
  7. "gitlink.org.cn/cloudream/jcs-pub/common/pkgs/storage/pool"
  8. "gitlink.org.cn/cloudream/jcs-pub/common/pkgs/storage/types"
  9. )
  10. func init() {
  11. exec.UseOp[*S2STransfer]()
  12. }
  13. type S2STransfer struct {
  14. Src clitypes.UserSpaceDetail
  15. SrcPath exec.VarID
  16. Dst clitypes.UserSpaceDetail
  17. Output exec.VarID
  18. BypassCallback exec.VarID
  19. S2SOption types.S2SOption
  20. }
  21. func (o *S2STransfer) Execute(ctx *exec.ExecContext, e *exec.Executor) error {
  22. srcPath, err := exec.BindVar[*BypassFilePathValue](e, ctx.Context, o.SrcPath)
  23. if err != nil {
  24. return err
  25. }
  26. stgPool, err := exec.GetValueByType[*pool.Pool](ctx)
  27. if err != nil {
  28. return fmt.Errorf("getting storage pool: %w", err)
  29. }
  30. s2s, err := stgPool.GetS2STransfer(&o.Dst)
  31. if err != nil {
  32. return err
  33. }
  34. // 传输文件
  35. dstPath, err := s2s.Transfer(ctx.Context, &o.Src, srcPath.Path, o.S2SOption)
  36. if err != nil {
  37. return err
  38. }
  39. defer s2s.Abort()
  40. // 告知后续Op处理临时文件
  41. e.PutVar(o.Output, &BypassedFileInfoValue{BypassedFileInfo: types.BypassedFileInfo{
  42. Path: dstPath,
  43. Hash: srcPath.Info.Hash,
  44. Size: srcPath.Info.Size,
  45. }})
  46. // 等待后续Op处理临时文件
  47. cb, err := exec.BindVar[*BypassHandleResultValue](e, ctx.Context, o.BypassCallback)
  48. if err != nil {
  49. return fmt.Errorf("getting temp file callback: %v", err)
  50. }
  51. if cb.Commited {
  52. s2s.Complete()
  53. }
  54. return nil
  55. }
  56. func (o *S2STransfer) String() string {
  57. return fmt.Sprintf("S2STransfer %v:%v -> %v:%v, Callback: %v", o.Src.UserSpace.Storage.String(), o.SrcPath, o.Dst.UserSpace.Storage.String(), o.Output, o.BypassCallback)
  58. }
  59. type S2STransferNode struct {
  60. dag.NodeBase
  61. Src clitypes.UserSpaceDetail
  62. Dst clitypes.UserSpaceDetail
  63. Opt types.S2SOption
  64. }
  65. func (b *GraphNodeBuilder) NewS2STransfer(src, dst clitypes.UserSpaceDetail, opt types.S2SOption) *S2STransferNode {
  66. n := &S2STransferNode{
  67. Src: src,
  68. Dst: dst,
  69. Opt: opt,
  70. }
  71. b.AddNode(n)
  72. n.OutputValues().Init(n, 1)
  73. n.InputValues().Init(2)
  74. return n
  75. }
  76. func (n *S2STransferNode) SrcPathSlot() dag.ValueInputSlot {
  77. return dag.ValueInputSlot{
  78. Node: n,
  79. Index: 0,
  80. }
  81. }
  82. func (n *S2STransferNode) BypassCallbackSlot() dag.ValueInputSlot {
  83. return dag.ValueInputSlot{
  84. Node: n,
  85. Index: 1,
  86. }
  87. }
  88. func (n *S2STransferNode) BypassFileInfoVar() dag.ValueOutputSlot {
  89. return dag.ValueOutputSlot{
  90. Node: n,
  91. Index: 0,
  92. }
  93. }
  94. func (n *S2STransferNode) GenerateOp() (exec.Op, error) {
  95. return &S2STransfer{
  96. Src: n.Src,
  97. SrcPath: n.SrcPathSlot().Var().VarID,
  98. Dst: n.Dst,
  99. Output: n.BypassFileInfoVar().Var().VarID,
  100. BypassCallback: n.BypassCallbackSlot().Var().VarID,
  101. S2SOption: n.Opt,
  102. }, nil
  103. }

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