|
- package plans
-
- import (
- "fmt"
-
- "gitlink.org.cn/cloudream/common/utils/os2"
- "gitlink.org.cn/cloudream/jcs-pub/common/pkgs/ioswitch/exec"
- "gitlink.org.cn/cloudream/jcs-pub/common/pkgs/ioswitch/plan"
- "gitlink.org.cn/cloudream/jcs-pub/common/pkgs/ioswitch2/ops2"
- stgtypes "gitlink.org.cn/cloudream/jcs-pub/common/pkgs/storage/types"
- jcstypes "gitlink.org.cn/cloudream/jcs-pub/common/types"
- )
-
- func CompleteMultipart(blocks []jcstypes.ObjectBlock, blockSpaces []jcstypes.UserSpaceDetail, targetSpace jcstypes.UserSpaceDetail, shardInfoKey string, blder *exec.PlanBuilder) error {
- da := ops2.NewGraphNodeBuilder()
-
- sizes := make([]int64, len(blocks))
- for i, blk := range blocks {
- sizes[i] = blk.Size
- }
- joinNode := da.NewSegmentJoin(sizes)
- if err := setEnvBySpace(joinNode, &targetSpace); err != nil {
- return fmt.Errorf("set node env by user space: %w", err)
- }
-
- for i, blk := range blocks {
- gs := da.NewGetShardInfo(blockSpaces[i], blk.FileHash)
- gs.Env().ToEnvDriver(true)
-
- br := da.NewBaseReadDyn(nil, blockSpaces[i], stgtypes.DefaultOpen())
- if err := setEnvBySpace(br, &blockSpaces[i]); err != nil {
- return fmt.Errorf("set node env by user space: %w", err)
- }
-
- gs.FileInfoVar().ToSlot(br.FileInfoSlot())
-
- br.Output().ToSlot(joinNode.InputSlot(i))
- }
-
- // TODO 应该采取更合理的方式同时支持Parser和直接生成DAG
- br := da.NewBaseWrite(nil, targetSpace, stgtypes.MakeTempDirPath(&targetSpace, os2.GenerateRandomFileName(20)), stgtypes.WriteOption{})
- if err := setEnvBySpace(br, &targetSpace); err != nil {
- return fmt.Errorf("set node env by user space: %w", err)
- }
-
- as := da.NewStoreShard(targetSpace, shardInfoKey)
- as.Env().ToEnvDriver(true)
-
- joinNode.Joined().ToSlot(br.Input())
-
- if shardInfoKey != "" {
- store := da.NewStore()
- store.Env().ToEnvDriver(true)
- store.Store(shardInfoKey, as.ShardInfoVar().Var())
- }
-
- err := plan.Compile(da.Graph, blder)
- if err != nil {
- return err
- }
-
- return nil
- }
|