Signed-off-by: Goutham Veeramachaneni <cs14btech11014@iith.ac.in>pull/5805/head
parent
bc3fee4820
commit
ce23adb579
@ -0,0 +1,232 @@ |
|||||||
|
package tsdb |
||||||
|
|
||||||
|
import ( |
||||||
|
"sort" |
||||||
|
"testing" |
||||||
|
|
||||||
|
"github.com/stretchr/testify/require" |
||||||
|
) |
||||||
|
|
||||||
|
func TestCompactionSelect(t *testing.T) { |
||||||
|
opts := &compactorOptions{ |
||||||
|
blockRanges: []int64{ |
||||||
|
20, |
||||||
|
60, |
||||||
|
240, |
||||||
|
720, |
||||||
|
2160, |
||||||
|
}, |
||||||
|
} |
||||||
|
|
||||||
|
type dirMetaSimple struct { |
||||||
|
dir string |
||||||
|
tr []int64 |
||||||
|
} |
||||||
|
|
||||||
|
cases := []struct { |
||||||
|
blocks []dirMetaSimple |
||||||
|
planned [][]string |
||||||
|
}{ |
||||||
|
{ |
||||||
|
blocks: []dirMetaSimple{ |
||||||
|
{ |
||||||
|
dir: "1", |
||||||
|
tr: []int64{0, 20}, |
||||||
|
}, |
||||||
|
}, |
||||||
|
planned: nil, |
||||||
|
}, |
||||||
|
{ |
||||||
|
blocks: []dirMetaSimple{ |
||||||
|
{ |
||||||
|
dir: "1", |
||||||
|
tr: []int64{0, 20}, |
||||||
|
}, |
||||||
|
{ |
||||||
|
dir: "2", |
||||||
|
tr: []int64{20, 40}, |
||||||
|
}, |
||||||
|
{ |
||||||
|
dir: "3", |
||||||
|
tr: []int64{40, 60}, |
||||||
|
}, |
||||||
|
}, |
||||||
|
planned: [][]string{{"1", "2", "3"}}, |
||||||
|
}, |
||||||
|
{ |
||||||
|
blocks: []dirMetaSimple{ |
||||||
|
{ |
||||||
|
dir: "1", |
||||||
|
tr: []int64{0, 20}, |
||||||
|
}, |
||||||
|
{ |
||||||
|
dir: "2", |
||||||
|
tr: []int64{20, 40}, |
||||||
|
}, |
||||||
|
{ |
||||||
|
dir: "3", |
||||||
|
tr: []int64{40, 60}, |
||||||
|
}, |
||||||
|
{ |
||||||
|
dir: "4", |
||||||
|
tr: []int64{60, 120}, |
||||||
|
}, |
||||||
|
{ |
||||||
|
dir: "5", |
||||||
|
tr: []int64{120, 180}, |
||||||
|
}, |
||||||
|
}, |
||||||
|
planned: [][]string{{"1", "2", "3"}}, // We still need 0-60 to compact 0-240
|
||||||
|
}, |
||||||
|
{ |
||||||
|
blocks: []dirMetaSimple{ |
||||||
|
{ |
||||||
|
dir: "1", |
||||||
|
tr: []int64{0, 20}, |
||||||
|
}, |
||||||
|
{ |
||||||
|
dir: "2", |
||||||
|
tr: []int64{20, 40}, |
||||||
|
}, |
||||||
|
{ |
||||||
|
dir: "3", |
||||||
|
tr: []int64{40, 60}, |
||||||
|
}, |
||||||
|
{ |
||||||
|
dir: "4", |
||||||
|
tr: []int64{60, 120}, |
||||||
|
}, |
||||||
|
{ |
||||||
|
dir: "5", |
||||||
|
tr: []int64{120, 180}, |
||||||
|
}, |
||||||
|
{ |
||||||
|
dir: "6", |
||||||
|
tr: []int64{720, 960}, |
||||||
|
}, |
||||||
|
{ |
||||||
|
dir: "7", |
||||||
|
tr: []int64{1200, 1440}, |
||||||
|
}, |
||||||
|
}, |
||||||
|
planned: [][]string{{"6", "7"}}, |
||||||
|
}, |
||||||
|
{ |
||||||
|
blocks: []dirMetaSimple{ |
||||||
|
{ |
||||||
|
dir: "1", |
||||||
|
tr: []int64{0, 20}, |
||||||
|
}, |
||||||
|
{ |
||||||
|
dir: "2", |
||||||
|
tr: []int64{60, 80}, |
||||||
|
}, |
||||||
|
{ |
||||||
|
dir: "3", |
||||||
|
tr: []int64{80, 100}, |
||||||
|
}, |
||||||
|
}, |
||||||
|
planned: [][]string{{"2", "3"}}, |
||||||
|
}, |
||||||
|
} |
||||||
|
|
||||||
|
c := &compactor{ |
||||||
|
opts: opts, |
||||||
|
} |
||||||
|
sliceDirs := func(dms []dirMeta) [][]string { |
||||||
|
if len(dms) == 0 { |
||||||
|
return nil |
||||||
|
} |
||||||
|
var res []string |
||||||
|
for _, dm := range dms { |
||||||
|
res = append(res, dm.dir) |
||||||
|
} |
||||||
|
return [][]string{res} |
||||||
|
} |
||||||
|
|
||||||
|
dmFromSimple := func(dms []dirMetaSimple) []dirMeta { |
||||||
|
dirs := make([]dirMeta, 0, len(dms)) |
||||||
|
for _, dir := range dms { |
||||||
|
dirs = append(dirs, dirMeta{ |
||||||
|
dir: dir.dir, |
||||||
|
meta: &BlockMeta{ |
||||||
|
MinTime: dir.tr[0], |
||||||
|
MaxTime: dir.tr[1], |
||||||
|
}, |
||||||
|
}) |
||||||
|
} |
||||||
|
|
||||||
|
return dirs |
||||||
|
} |
||||||
|
|
||||||
|
for _, tc := range cases { |
||||||
|
require.Equal(t, tc.planned, sliceDirs(c.selectDirs(dmFromSimple(tc.blocks)))) |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
func TestSplitByRange(t *testing.T) { |
||||||
|
splitterFunc := func(ds []dirMeta, tr int64) [][]dirMeta { |
||||||
|
rMap := make(map[int64][]dirMeta) |
||||||
|
for _, dir := range ds { |
||||||
|
t0 := dir.meta.MinTime - dir.meta.MinTime%tr |
||||||
|
if intervalContains(t0, t0+tr, dir.meta.MinTime) && intervalContains(t0, t0+tr, dir.meta.MaxTime) { |
||||||
|
rMap[t0] = append(rMap[t0], dir) |
||||||
|
} |
||||||
|
} |
||||||
|
res := make([][]dirMeta, 0, len(rMap)) |
||||||
|
for _, v := range rMap { |
||||||
|
res = append(res, v) |
||||||
|
} |
||||||
|
|
||||||
|
sort.Slice(res, func(i, j int) bool { |
||||||
|
return res[i][0].meta.MinTime < res[j][0].meta.MinTime |
||||||
|
}) |
||||||
|
|
||||||
|
return res |
||||||
|
} |
||||||
|
|
||||||
|
cases := []struct { |
||||||
|
trange int64 |
||||||
|
ranges [][]int64 |
||||||
|
output [][][]int64 |
||||||
|
}{ |
||||||
|
{ |
||||||
|
trange: 60, |
||||||
|
ranges: [][]int64{{0, 10}}, |
||||||
|
}, |
||||||
|
{ |
||||||
|
trange: 60, |
||||||
|
ranges: [][]int64{{0, 60}}, |
||||||
|
}, |
||||||
|
{ |
||||||
|
trange: 60, |
||||||
|
ranges: [][]int64{{0, 10}, {30, 60}}, |
||||||
|
}, |
||||||
|
{ |
||||||
|
trange: 60, |
||||||
|
ranges: [][]int64{{0, 10}, {60, 90}}, |
||||||
|
}, |
||||||
|
{ |
||||||
|
trange: 60, |
||||||
|
ranges: [][]int64{{0, 10}, {20, 30}, {90, 120}}, |
||||||
|
}, |
||||||
|
{ |
||||||
|
trange: 60, |
||||||
|
ranges: [][]int64{{0, 10}, {59, 60}, {60, 120}, {120, 180}, {190, 200}, {200, 210}, {220, 239}}, |
||||||
|
}, |
||||||
|
} |
||||||
|
|
||||||
|
for _, c := range cases { |
||||||
|
blocks := make([]dirMeta, 0, len(c.ranges)) |
||||||
|
for _, r := range c.ranges { |
||||||
|
blocks = append(blocks, dirMeta{ |
||||||
|
meta: &BlockMeta{ |
||||||
|
MinTime: r[0], |
||||||
|
MaxTime: r[1], |
||||||
|
}, |
||||||
|
}) |
||||||
|
} |
||||||
|
|
||||||
|
require.Equal(t, splitterFunc(blocks, c.trange), splitByRange(blocks, c.trange)) |
||||||
|
} |
||||||
|
} |
||||||
Loading…
Reference in new issue