|
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119 |
- package parser
-
- import (
- "gitlink.org.cn/cloudream/storage/common/pkgs/ioswitch2"
- "gitlink.org.cn/cloudream/storage/common/pkgs/ioswitch2/ops2"
- "gitlink.org.cn/cloudream/storage/common/pkgs/storage/factory"
- )
-
- // 将直接从一个存储服务传到另一个存储服务的过程换成S2S传输
- func useS2STransfer(ctx *ParseContext) {
- // S2S传输暂不支持只传文件的一部分
- if ctx.StreamRange.Offset != 0 || ctx.StreamRange.Length != nil {
- return
- }
-
- for fr, frNode := range ctx.FromNodes {
- fromShard, ok := fr.(*ioswitch2.FromShardstore)
- if !ok {
- continue
- }
-
- s2s, err := factory.GetBuilder(fromShard.Storage).CreateS2STransfer()
- if err != nil {
- continue
- }
-
- // 此输出流的所有目的地都要能支持S2S传输
- outVar := frNode.Output().Var()
- if outVar.Dst.Len() == 0 {
- continue
- }
-
- failed := false
- var toShards []*ops2.ShardWriteNode
- // var toShareds []*ops2.SharedLoadNode
-
- loop:
- for i := 0; i < outVar.Dst.Len(); i++ {
- dstNode := outVar.Dst.Get(i)
-
- switch dstNode := dstNode.(type) {
- case *ops2.ShardWriteNode:
- if !s2s.CanTransfer(dstNode.Storage) {
- failed = true
- break
- }
-
- toShards = append(toShards, dstNode)
-
- /* TODO 暂不支持共享存储服务
- case *ops2.SharedLoadNode:
- if !s2s.CanTransfer(to.Storage) {
- failed = true
- break
- }
- toShareds = append(toShareds, to)
- */
- default:
- failed = true
- break loop
- }
- }
- if failed {
- continue
- }
-
- for _, toShard := range toShards {
- s2sNode := ctx.DAG.NewS2STransfer(fromShard.Storage, toShard.Storage)
- // 直传指令在目的地Hub上执行
- s2sNode.Env().CopyFrom(toShard.Env())
-
- // 先获取文件路径,送到S2S节点
- brNode := ctx.DAG.NewBypassFromShardStore(fromShard.Storage.Storage.StorageID, fromShard.FileHash)
- brNode.Env().CopyFrom(frNode.Env())
- brNode.FilePathVar().ToSlot(s2sNode.SrcPathSlot())
-
- // 传输结果通知目的节点
- to := toShard.To.(*ioswitch2.ToShardStore)
- bwNode := ctx.DAG.NewBypassToShardStore(toShard.Storage.Storage.StorageID, to.FileHashStoreKey)
- bwNode.Env().CopyFrom(toShard.Env())
-
- s2sNode.BypassFileInfoVar().ToSlot(bwNode.BypassFileInfoSlot())
- bwNode.BypassCallbackVar().ToSlot(s2sNode.BypassCallbackSlot())
-
- // 从计划中删除目标节点
- ctx.DAG.RemoveNode(toShard)
- delete(ctx.ToNodes, toShard.To)
- }
-
- /*
- for _, toShared := range toShareds {
- s2sNode := ctx.DAG.NewS2STransfer(fromShard.Storage, toShared.Storage)
- // 直传指令在目的地Hub上执行
- s2sNode.Env().CopyFrom(toShared.Env())
-
- // 先获取文件路径,送到S2S节点
- brNode := ctx.DAG.NewBypassFromShardStore(fromShard.Storage.Storage.StorageID, fromShard.FileHash)
- brNode.Env().CopyFrom(toShared.Env())
- brNode.FilePathVar().ToSlot(s2sNode.SrcPathSlot())
-
- // 传输结果通知目的节点
- to := toShared.To.(*ioswitch2.LoadToShared)
- bwNode := ctx.DAG.NewBypassToShardStore(toShard.Storage.Storage.StorageID, to.FileHashStoreKey)
- bwNode.Env().CopyFrom(toShard.Env())
-
- s2sNode.BypassFileInfoVar().ToSlot(bwNode.BypassFileInfoSlot())
- bwNode.BypassCallbackVar().ToSlot(s2sNode.BypassCallbackSlot())
-
- // 从计划中删除目标节点
- ctx.DAG.RemoveNode(toShared)
- delete(ctx.ToNodes, toShared.To)
- }
- */
-
- // 从计划中删除源节点
- ctx.DAG.RemoveNode(frNode)
- delete(ctx.FromNodes, fr)
- }
- }
|