Browse Source

增加LRC冗余方式

pull/50/head
Sydonian 1 year ago
parent
commit
05dc74dda6
2 changed files with 43 additions and 7 deletions
  1. +6
    -7
      pkgs/ioswitch/plan/generate.go
  2. +37
    -0
      sdks/storage/models.go

+ 6
- 7
pkgs/ioswitch/plan/generate.go View File

@@ -4,7 +4,6 @@ import (
"gitlink.org.cn/cloudream/common/pkgs/ioswitch/dag" "gitlink.org.cn/cloudream/common/pkgs/ioswitch/dag"
"gitlink.org.cn/cloudream/common/pkgs/ioswitch/exec" "gitlink.org.cn/cloudream/common/pkgs/ioswitch/exec"
"gitlink.org.cn/cloudream/common/pkgs/ioswitch/plan/ops" "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 { func Generate(graph *dag.Graph, planBld *exec.PlanBuilder) error {
@@ -24,11 +23,11 @@ func generateSend(graph *dag.Graph) {
switch to.Node.Env.Type { switch to.Node.Env.Type {
case dag.EnvDriver: case dag.EnvDriver:
// // 如果是要送到Driver,则只能由Driver主动去拉取 // // 如果是要送到Driver,则只能由Driver主动去拉取
getNode := graph.NewNode(&ops.GetStreamType{}, ioswitch.NodeProps{})
getNode := graph.NewNode(&ops.GetStreamType{}, nil)
getNode.Env.ToEnvDriver() getNode.Env.ToEnvDriver()


// // 同时需要对此变量生成HoldUntil指令,避免Plan结束时Get指令还未到达 // // 同时需要对此变量生成HoldUntil指令,避免Plan结束时Get指令还未到达
holdNode := graph.NewNode(&ops.HoldUntilType{}, ioswitch.NodeProps{})
holdNode := graph.NewNode(&ops.HoldUntilType{}, nil)
holdNode.Env = node.Env holdNode.Env = node.Env


// 将Get指令的信号送到Hold指令 // 将Get指令的信号送到Hold指令
@@ -43,7 +42,7 @@ func generateSend(graph *dag.Graph) {


case dag.EnvWorker: case dag.EnvWorker:
// 如果是要送到Agent,则可以直接发送 // 如果是要送到Agent,则可以直接发送
n := graph.NewNode(&ops.SendStreamType{}, ioswitch.NodeProps{})
n := graph.NewNode(&ops.SendStreamType{}, nil)
n.Env = node.Env n.Env = node.Env
n.OutputStreams[0].To(to.Node, to.SlotIndex) n.OutputStreams[0].To(to.Node, to.SlotIndex)
out.Toes = nil out.Toes = nil
@@ -60,11 +59,11 @@ func generateSend(graph *dag.Graph) {
switch to.Node.Env.Type { switch to.Node.Env.Type {
case dag.EnvDriver: case dag.EnvDriver:
// // 如果是要送到Driver,则只能由Driver主动去拉取 // // 如果是要送到Driver,则只能由Driver主动去拉取
getNode := graph.NewNode(&ops.GetVaType{}, ioswitch.NodeProps{})
getNode := graph.NewNode(&ops.GetVaType{}, nil)
getNode.Env.ToEnvDriver() getNode.Env.ToEnvDriver()


// // 同时需要对此变量生成HoldUntil指令,避免Plan结束时Get指令还未到达 // // 同时需要对此变量生成HoldUntil指令,避免Plan结束时Get指令还未到达
holdNode := graph.NewNode(&ops.HoldUntilType{}, ioswitch.NodeProps{})
holdNode := graph.NewNode(&ops.HoldUntilType{}, nil)
holdNode.Env = node.Env holdNode.Env = node.Env


// 将Get指令的信号送到Hold指令 // 将Get指令的信号送到Hold指令
@@ -79,7 +78,7 @@ func generateSend(graph *dag.Graph) {


case dag.EnvWorker: case dag.EnvWorker:
// 如果是要送到Agent,则可以直接发送 // 如果是要送到Agent,则可以直接发送
n := graph.NewNode(&ops.SendVarType{}, ioswitch.NodeProps{})
n := graph.NewNode(&ops.SendVarType{}, nil)
n.Env = node.Env n.Env = node.Env
n.OutputValues[0].To(to.Node, to.SlotIndex) n.OutputValues[0].To(to.Node, to.SlotIndex)
out.Toes = nil out.Toes = nil


+ 37
- 0
sdks/storage/models.go View File

@@ -37,6 +37,7 @@ var RedundancyUnion = serder.UseTypeUnionInternallyTagged(types.Ref(types.NewTyp
(*NoneRedundancy)(nil), (*NoneRedundancy)(nil),
(*RepRedundancy)(nil), (*RepRedundancy)(nil),
(*ECRedundancy)(nil), (*ECRedundancy)(nil),
(*LRCRedundancy)(nil),
)), "type") )), "type")


type NoneRedundancy struct { type NoneRedundancy struct {
@@ -93,6 +94,42 @@ func (b *ECRedundancy) Value() (driver.Value, error) {
return serder.ObjectToJSONEx[Redundancy](b) 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 ( const (
PackageStateNormal = "Normal" PackageStateNormal = "Normal"
PackageStateDeleted = "Deleted" PackageStateDeleted = "Deleted"


Loading…
Cancel
Save