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

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

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