forked from TrueCloudLab/frostfs-node
[#265] innerring: Select containers to audit
Signed-off-by: Alex Vanin <alexey@nspcc.ru>
This commit is contained in:
parent
87e1252065
commit
3d3d058b05
8 changed files with 263 additions and 11 deletions
113
pkg/innerring/processors/audit/scheduler_test.go
Normal file
113
pkg/innerring/processors/audit/scheduler_test.go
Normal file
|
@ -0,0 +1,113 @@
|
|||
package audit_test
|
||||
|
||||
import (
|
||||
"crypto/rand"
|
||||
"crypto/sha256"
|
||||
"testing"
|
||||
|
||||
"github.com/nspcc-dev/neofs-api-go/pkg/container"
|
||||
"github.com/nspcc-dev/neofs-node/pkg/innerring/processors/audit"
|
||||
"github.com/stretchr/testify/require"
|
||||
)
|
||||
|
||||
func TestSelect(t *testing.T) {
|
||||
cids := generateContainers(10)
|
||||
|
||||
t.Run("invalid input", func(t *testing.T) {
|
||||
require.Empty(t, audit.Select(cids, 0, 0, 0))
|
||||
})
|
||||
|
||||
t.Run("even split", func(t *testing.T) {
|
||||
const irSize = 5 // every node takes two audit nodes
|
||||
|
||||
m := hitMap(cids)
|
||||
|
||||
for i := 0; i < irSize; i++ {
|
||||
s := audit.Select(cids, 0, uint64(i), irSize)
|
||||
require.Equal(t, len(cids)/irSize, len(s))
|
||||
|
||||
for _, id := range s {
|
||||
n, ok := m[id.String()]
|
||||
require.True(t, ok)
|
||||
require.Equal(t, 0, n)
|
||||
m[id.String()] = 1
|
||||
}
|
||||
}
|
||||
|
||||
require.True(t, allHit(m))
|
||||
})
|
||||
|
||||
t.Run("odd split", func(t *testing.T) {
|
||||
const irSize = 3
|
||||
|
||||
m := hitMap(cids)
|
||||
|
||||
for i := 0; i < irSize; i++ {
|
||||
s := audit.Select(cids, 0, uint64(i), irSize)
|
||||
|
||||
for _, id := range s {
|
||||
n, ok := m[id.String()]
|
||||
require.True(t, ok)
|
||||
require.Equal(t, 0, n)
|
||||
m[id.String()] = 1
|
||||
}
|
||||
}
|
||||
|
||||
require.True(t, allHit(m))
|
||||
})
|
||||
|
||||
t.Run("epoch shift", func(t *testing.T) {
|
||||
const irSize = 4
|
||||
|
||||
m := hitMap(cids)
|
||||
|
||||
for i := 0; i < irSize; i++ {
|
||||
s := audit.Select(cids, uint64(i), 0, irSize)
|
||||
|
||||
for _, id := range s {
|
||||
n, ok := m[id.String()]
|
||||
require.True(t, ok)
|
||||
require.Equal(t, 0, n)
|
||||
m[id.String()] = 1
|
||||
}
|
||||
}
|
||||
|
||||
require.True(t, allHit(m))
|
||||
})
|
||||
}
|
||||
|
||||
func generateContainers(n int) []*container.ID {
|
||||
var buf [sha256.Size]byte
|
||||
result := make([]*container.ID, 0, n)
|
||||
|
||||
for i := 0; i < n; i++ {
|
||||
_, _ = rand.Read(buf[:])
|
||||
|
||||
cid := container.NewID()
|
||||
cid.SetSHA256(buf)
|
||||
|
||||
result = append(result, cid)
|
||||
}
|
||||
|
||||
return result
|
||||
}
|
||||
|
||||
func hitMap(ids []*container.ID) map[string]int {
|
||||
result := make(map[string]int, len(ids))
|
||||
|
||||
for _, id := range ids {
|
||||
result[id.String()] = 0
|
||||
}
|
||||
|
||||
return result
|
||||
}
|
||||
|
||||
func allHit(m map[string]int) bool {
|
||||
for _, v := range m {
|
||||
if v == 0 {
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
return true
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue