diff --git a/pkgs/ioswitch/plan/generate.go b/pkgs/ioswitch/plan/generate.go index 6a7362b..e627cbe 100644 --- a/pkgs/ioswitch/plan/generate.go +++ b/pkgs/ioswitch/plan/generate.go @@ -4,7 +4,6 @@ import ( "gitlink.org.cn/cloudream/common/pkgs/ioswitch/dag" "gitlink.org.cn/cloudream/common/pkgs/ioswitch/exec" "gitlink.org.cn/cloudream/common/pkgs/ioswitch/plan/ops" - "gitlink.org.cn/cloudream/storage/common/pkgs/ioswitch" ) func Generate(graph *dag.Graph, planBld *exec.PlanBuilder) error { @@ -24,11 +23,11 @@ func generateSend(graph *dag.Graph) { switch to.Node.Env.Type { case dag.EnvDriver: // // 如果是要送到Driver,则只能由Driver主动去拉取 - getNode := graph.NewNode(&ops.GetStreamType{}, ioswitch.NodeProps{}) + getNode := graph.NewNode(&ops.GetStreamType{}, nil) getNode.Env.ToEnvDriver() // // 同时需要对此变量生成HoldUntil指令,避免Plan结束时Get指令还未到达 - holdNode := graph.NewNode(&ops.HoldUntilType{}, ioswitch.NodeProps{}) + holdNode := graph.NewNode(&ops.HoldUntilType{}, nil) holdNode.Env = node.Env // 将Get指令的信号送到Hold指令 @@ -43,7 +42,7 @@ func generateSend(graph *dag.Graph) { case dag.EnvWorker: // 如果是要送到Agent,则可以直接发送 - n := graph.NewNode(&ops.SendStreamType{}, ioswitch.NodeProps{}) + n := graph.NewNode(&ops.SendStreamType{}, nil) n.Env = node.Env n.OutputStreams[0].To(to.Node, to.SlotIndex) out.Toes = nil @@ -60,11 +59,11 @@ func generateSend(graph *dag.Graph) { switch to.Node.Env.Type { case dag.EnvDriver: // // 如果是要送到Driver,则只能由Driver主动去拉取 - getNode := graph.NewNode(&ops.GetVaType{}, ioswitch.NodeProps{}) + getNode := graph.NewNode(&ops.GetVaType{}, nil) getNode.Env.ToEnvDriver() // // 同时需要对此变量生成HoldUntil指令,避免Plan结束时Get指令还未到达 - holdNode := graph.NewNode(&ops.HoldUntilType{}, ioswitch.NodeProps{}) + holdNode := graph.NewNode(&ops.HoldUntilType{}, nil) holdNode.Env = node.Env // 将Get指令的信号送到Hold指令 @@ -79,7 +78,7 @@ func generateSend(graph *dag.Graph) { case dag.EnvWorker: // 如果是要送到Agent,则可以直接发送 - n := graph.NewNode(&ops.SendVarType{}, ioswitch.NodeProps{}) + n := graph.NewNode(&ops.SendVarType{}, nil) n.Env = node.Env n.OutputValues[0].To(to.Node, to.SlotIndex) out.Toes = nil diff --git a/sdks/storage/models.go b/sdks/storage/models.go index 9a79cd6..c07d95f 100644 --- a/sdks/storage/models.go +++ b/sdks/storage/models.go @@ -37,6 +37,7 @@ var RedundancyUnion = serder.UseTypeUnionInternallyTagged(types.Ref(types.NewTyp (*NoneRedundancy)(nil), (*RepRedundancy)(nil), (*ECRedundancy)(nil), + (*LRCRedundancy)(nil), )), "type") type NoneRedundancy struct { @@ -93,6 +94,42 @@ func (b *ECRedundancy) Value() (driver.Value, error) { return serder.ObjectToJSONEx[Redundancy](b) } +var DefaultLRCRedundancy = *NewLRCRedundancy(3, 2, []int{2}, 1024*1024*5) + +type LRCRedundancy struct { + serder.Metadata `union:"lrc"` + Type string `json:"type"` + K int `json:"k"` + N int `json:"n"` + Groups []int `json:"groups"` + ChunkSize int `json:"chunkSize"` +} + +func NewLRCRedundancy(k int, n int, groups []int, chunkSize int) *LRCRedundancy { + return &LRCRedundancy{ + Type: "lrc", + K: k, + N: n, + Groups: groups, + ChunkSize: chunkSize, + } +} +func (b *LRCRedundancy) Value() (driver.Value, error) { + return serder.ObjectToJSONEx[Redundancy](b) +} + +// 判断指定块属于哪个组。如果都不属于,则返回-1。 +func (b *LRCRedundancy) FindGroup(idx int) int { + for i, group := range b.Groups { + if idx < group { + return i + } + idx -= group + } + + return -1 +} + const ( PackageStateNormal = "Normal" PackageStateDeleted = "Deleted"