forked from TrueCloudLab/frostfs-node
[#166] node: Parallelize background tree service sync by batching
* Merge operations Signed-off-by: Airat Arifullin a.arifullin@yadro.com
This commit is contained in:
parent
299b24b974
commit
9d01029733
2 changed files with 240 additions and 80 deletions
85
pkg/services/tree/sync_test.go
Normal file
85
pkg/services/tree/sync_test.go
Normal file
|
@ -0,0 +1,85 @@
|
|||
package tree
|
||||
|
||||
import (
|
||||
"context"
|
||||
"testing"
|
||||
|
||||
"git.frostfs.info/TrueCloudLab/frostfs-node/pkg/local_object_storage/pilorama"
|
||||
"github.com/stretchr/testify/require"
|
||||
)
|
||||
|
||||
func Test_mergeOperationStreams(t *testing.T) {
|
||||
tests := []struct {
|
||||
name string
|
||||
ctx context.Context
|
||||
opTimes [][]uint64
|
||||
wantValues []uint64
|
||||
wantMinHeight uint64
|
||||
}{
|
||||
{
|
||||
name: "1",
|
||||
ctx: context.Background(),
|
||||
opTimes: [][]uint64{
|
||||
{250, 251, 255},
|
||||
{252, 253, 254, 256, 257},
|
||||
},
|
||||
wantValues: []uint64{250, 251, 252, 253, 254, 255, 256, 257},
|
||||
wantMinHeight: 255,
|
||||
},
|
||||
{
|
||||
name: "2",
|
||||
ctx: context.Background(),
|
||||
opTimes: [][]uint64{
|
||||
{250, 251, 255, 259},
|
||||
{252, 253, 254, 256, 257},
|
||||
},
|
||||
wantValues: []uint64{250, 251, 252, 253, 254, 255, 256, 257, 259},
|
||||
wantMinHeight: 257,
|
||||
},
|
||||
{
|
||||
name: "3",
|
||||
ctx: context.Background(),
|
||||
opTimes: [][]uint64{
|
||||
{250, 251, 255},
|
||||
{249, 250, 251, 253, 254, 256, 257},
|
||||
},
|
||||
wantValues: []uint64{249, 250, 250, 251, 251, 253, 254, 255, 256, 257},
|
||||
wantMinHeight: 255,
|
||||
},
|
||||
}
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
nodeOpChans := make([]chan *pilorama.Move, len(tt.opTimes))
|
||||
for i := range nodeOpChans {
|
||||
nodeOpChans[i] = make(chan *pilorama.Move)
|
||||
}
|
||||
|
||||
// generate and put values to all chans
|
||||
for i, ch := range nodeOpChans {
|
||||
i := i
|
||||
ch := ch
|
||||
go func() {
|
||||
for _, tm := range tt.opTimes[i] {
|
||||
op := &pilorama.Move{}
|
||||
op.Time = tm
|
||||
ch <- op
|
||||
}
|
||||
close(nodeOpChans[i])
|
||||
}()
|
||||
}
|
||||
|
||||
merged := make(chan *pilorama.Move, 1)
|
||||
min := make(chan uint64)
|
||||
go func() {
|
||||
min <- mergeOperationStreams(tt.ctx, nodeOpChans, merged)
|
||||
}()
|
||||
|
||||
var res []uint64
|
||||
for op := range merged {
|
||||
res = append(res, op.Time)
|
||||
}
|
||||
require.Equal(t, tt.wantValues, res)
|
||||
require.Equal(t, tt.wantMinHeight, <-min)
|
||||
})
|
||||
}
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue