|
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182 |
- package ops2
-
- import (
- "fmt"
-
- "gitlink.org.cn/cloudream/jcs-pub/common/pkgs/ioswitch/dag"
- "gitlink.org.cn/cloudream/jcs-pub/common/pkgs/ioswitch/exec"
- "gitlink.org.cn/cloudream/jcs-pub/common/pkgs/storage/pool"
- jcstypes "gitlink.org.cn/cloudream/jcs-pub/common/types"
- )
-
- func init() {
- exec.UseOp[*S2STransfer]()
- exec.UseOp[*S2STransferDyn]()
- }
-
- type S2STransfer struct {
- SrcSpace jcstypes.UserSpaceDetail
- SrcPath jcstypes.JPath
- DstSpace jcstypes.UserSpaceDetail
- DstPath jcstypes.JPath
- Output exec.VarID
- }
-
- func (o *S2STransfer) Execute(ctx *exec.ExecContext, e *exec.Executor) error {
- stgPool, err := exec.GetValueByType[*pool.Pool](ctx)
- if err != nil {
- return fmt.Errorf("getting storage pool: %w", err)
- }
-
- s2s, err := stgPool.GetS2STransfer(&o.DstSpace)
- if err != nil {
- return err
- }
-
- // 传输文件
- fileInfo, err := s2s.Transfer(ctx.Context, &o.SrcSpace, o.SrcPath, o.DstPath)
- if err != nil {
- return err
- }
- defer s2s.Close()
-
- // 告知后续Op处理临时文件
- e.PutVar(o.Output, &FileInfoValue{FileInfo: fileInfo})
- return nil
- }
-
- func (o *S2STransfer) String() string {
- return fmt.Sprintf("S2STransfer %v:%v -> %v:%v, %v",
- o.SrcSpace.UserSpace.Storage.String(),
- o.SrcPath,
- o.DstSpace.UserSpace.Storage.String(),
- o.DstPath,
- o.Output)
- }
-
- type S2STransferDyn struct {
- SrcSpace jcstypes.UserSpaceDetail
- SrcFileInfo exec.VarID
- DstSpace jcstypes.UserSpaceDetail
- DstPath jcstypes.JPath
- Output exec.VarID
- }
-
- func (o *S2STransferDyn) Execute(ctx *exec.ExecContext, e *exec.Executor) error {
- stgPool, err := exec.GetValueByType[*pool.Pool](ctx)
- if err != nil {
- return fmt.Errorf("getting storage pool: %w", err)
- }
-
- srcInfo, err := exec.BindVar[*FileInfoValue](e, ctx.Context, o.SrcFileInfo)
- if err != nil {
- return err
- }
-
- s2s, err := stgPool.GetS2STransfer(&o.DstSpace)
- if err != nil {
- return err
- }
-
- // 传输文件
- fileInfo, err := s2s.Transfer(ctx.Context, &o.SrcSpace, srcInfo.Path, o.DstPath)
- if err != nil {
- return err
- }
- defer s2s.Close()
-
- // 告知后续Op处理临时文件
- e.PutVar(o.Output, &FileInfoValue{FileInfo: fileInfo})
- return nil
- }
-
- func (o *S2STransferDyn) String() string {
- return fmt.Sprintf("S2STransferDyn %v:%v -> %v:%v, %v",
- o.SrcSpace.UserSpace.Storage.String(),
- o.SrcFileInfo,
- o.DstSpace.UserSpace.Storage.String(),
- o.DstPath,
- o.Output)
- }
-
- type S2STransferNode struct {
- dag.NodeBase
- SrcSpace jcstypes.UserSpaceDetail
- SrcPath jcstypes.JPath
- DstSpace jcstypes.UserSpaceDetail
- DstPath jcstypes.JPath
- }
-
- func (b *GraphNodeBuilder) NewS2STransfer(srcSpace jcstypes.UserSpaceDetail, srcPath jcstypes.JPath, dstSpace jcstypes.UserSpaceDetail, dstPath jcstypes.JPath) *S2STransferNode {
- n := &S2STransferNode{
- SrcSpace: srcSpace,
- SrcPath: srcPath,
- DstSpace: dstSpace,
- DstPath: dstPath,
- }
- b.AddNode(n)
-
- n.OutputValues().Init(n, 1)
- return n
- }
-
- func (n *S2STransferNode) FileInfoVar() dag.ValueOutputSlot {
- return dag.ValueOutputSlot{
- Node: n,
- Index: 0,
- }
- }
-
- func (n *S2STransferNode) GenerateOp() (exec.Op, error) {
- return &S2STransfer{
- SrcSpace: n.SrcSpace,
- SrcPath: n.SrcPath,
- DstSpace: n.DstSpace,
- DstPath: n.DstPath,
- Output: n.FileInfoVar().Var().VarID,
- }, nil
- }
-
- type S2STransferDynNode struct {
- dag.NodeBase
- SrcSpace jcstypes.UserSpaceDetail
- DstSpace jcstypes.UserSpaceDetail
- DstPath jcstypes.JPath
- }
-
- func (b *GraphNodeBuilder) NewS2STransferDyn(srcSpace jcstypes.UserSpaceDetail, dstSpace jcstypes.UserSpaceDetail, dstPath jcstypes.JPath) *S2STransferDynNode {
- n := &S2STransferDynNode{
- SrcSpace: srcSpace,
- DstSpace: dstSpace,
- DstPath: dstPath,
- }
- b.AddNode(n)
-
- n.InputValues().Init(1)
- n.OutputValues().Init(n, 1)
- return n
- }
-
- func (n *S2STransferDynNode) SrcFileInfoSlot() dag.ValueInputSlot {
- return dag.ValueInputSlot{
- Node: n,
- Index: 0,
- }
- }
-
- func (n *S2STransferDynNode) FileInfoVar() dag.ValueOutputSlot {
- return dag.ValueOutputSlot{
- Node: n,
- Index: 0,
- }
- }
-
- func (n *S2STransferDynNode) GenerateOp() (exec.Op, error) {
- return &S2STransferDyn{
- SrcSpace: n.SrcSpace,
- SrcFileInfo: n.SrcFileInfoSlot().Var().VarID,
- DstSpace: n.DstSpace,
- DstPath: n.DstPath,
- Output: n.FileInfoVar().Var().VarID,
- }, nil
- }
|