forked from TrueCloudLab/frostfs-node
[#221] node: Allow using vector copies_number
Also, take into account that value in general (it was not used before at all). Signed-off-by: Pavel Karpy <p.karpy@yadro.com>
This commit is contained in:
parent
d02950ad63
commit
ee58b390bb
4 changed files with 40 additions and 8 deletions
|
@ -38,6 +38,7 @@ type Traverser struct {
|
|||
|
||||
type cfg struct {
|
||||
trackCopies bool
|
||||
copyNumbers []uint32
|
||||
|
||||
flatSuccess *uint32
|
||||
|
||||
|
@ -84,19 +85,23 @@ func NewTraverser(opts ...Option) (*Traverser, error) {
|
|||
return nil, fmt.Errorf("could not build placement: %w", err)
|
||||
}
|
||||
|
||||
// backward compatibility for scalar `copies_number`
|
||||
if len(cfg.copyNumbers) == 1 {
|
||||
cfg.flatSuccess = &cfg.copyNumbers[0]
|
||||
}
|
||||
|
||||
var rem []int
|
||||
if cfg.flatSuccess != nil {
|
||||
ns = flatNodes(ns)
|
||||
rem = []int{int(*cfg.flatSuccess)}
|
||||
} else {
|
||||
replNum := cfg.policy.NumberOfReplicas()
|
||||
rem = make([]int, 0, replNum)
|
||||
rem = defaultCopiesVector(cfg.policy)
|
||||
|
||||
for i := 0; i < replNum; i++ {
|
||||
if cfg.trackCopies {
|
||||
rem = append(rem, int(cfg.policy.ReplicaNumberByIndex(i)))
|
||||
} else {
|
||||
rem = append(rem, -1)
|
||||
for i := range rem {
|
||||
if !cfg.trackCopies {
|
||||
rem[i] = -1
|
||||
} else if len(cfg.copyNumbers) > i {
|
||||
rem[i] = int(cfg.copyNumbers[i])
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -108,6 +113,17 @@ func NewTraverser(opts ...Option) (*Traverser, error) {
|
|||
}, nil
|
||||
}
|
||||
|
||||
func defaultCopiesVector(policy netmap.PlacementPolicy) []int {
|
||||
replNum := policy.NumberOfReplicas()
|
||||
copyVector := make([]int, 0, replNum)
|
||||
|
||||
for i := 0; i < replNum; i++ {
|
||||
copyVector = append(copyVector, int(policy.ReplicaNumberByIndex(i)))
|
||||
}
|
||||
|
||||
return copyVector
|
||||
}
|
||||
|
||||
func flatNodes(ns [][]netmap.NodeInfo) [][]netmap.NodeInfo {
|
||||
sz := 0
|
||||
for i := range ns {
|
||||
|
@ -265,3 +281,9 @@ func WithoutSuccessTracking() Option {
|
|||
c.trackCopies = false
|
||||
}
|
||||
}
|
||||
|
||||
func WithCopyNumbers(v []uint32) Option {
|
||||
return func(c *cfg) {
|
||||
c.copyNumbers = v
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue