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 }