Fix TestQueryHistogramFromBlocksWithCompaction

The test was assuming that you can tell the sample type in
chunks.Sample interface by looking at the H() and FH() method output.
That turns out to be not true, you need to look at Type() function.

Signed-off-by: György Krajcsovits <gyorgy.krajcsovits@grafana.com>
This commit is contained in:
György Krajcsovits 2024-08-02 09:38:54 +02:00
parent 66119e55fb
commit fe63ba7a9a

View file

@ -8040,8 +8040,8 @@ func TestQueryHistogramFromBlocksWithCompaction(t *testing.T) {
createBlock(t, db.Dir(), series) createBlock(t, db.Dir(), series)
for _, s := range series { for _, s := range series {
key := s.Labels().String() lbls := s.Labels().String()
slice := exp[key] slice := exp[lbls]
it = s.Iterator(it) it = s.Iterator(it)
smpls, err := storage.ExpandSamples(it, nil) smpls, err := storage.ExpandSamples(it, nil)
require.NoError(t, err) require.NoError(t, err)
@ -8049,7 +8049,7 @@ func TestQueryHistogramFromBlocksWithCompaction(t *testing.T) {
sort.Slice(slice, func(i, j int) bool { sort.Slice(slice, func(i, j int) bool {
return slice[i].T() < slice[j].T() return slice[i].T() < slice[j].T()
}) })
exp[key] = slice exp[lbls] = slice
} }
} }
@ -8082,10 +8082,10 @@ func TestQueryHistogramFromBlocksWithCompaction(t *testing.T) {
// due to origin from different overlapping chunks anymore. // due to origin from different overlapping chunks anymore.
for _, ss := range exp { for _, ss := range exp {
for i, s := range ss[1:] { for i, s := range ss[1:] {
if s.H() != nil && ss[i].H() != nil && s.H().CounterResetHint == histogram.UnknownCounterReset { if s.Type() == chunkenc.ValHistogram && ss[i].Type() == chunkenc.ValHistogram && s.H().CounterResetHint == histogram.UnknownCounterReset {
s.H().CounterResetHint = histogram.NotCounterReset s.H().CounterResetHint = histogram.NotCounterReset
} }
if s.FH() != nil && ss[i].FH() != nil && s.FH().CounterResetHint == histogram.UnknownCounterReset { if s.Type() == chunkenc.ValFloatHistogram && ss[i].Type() == chunkenc.ValFloatHistogram && s.FH().CounterResetHint == histogram.UnknownCounterReset {
s.FH().CounterResetHint = histogram.NotCounterReset s.FH().CounterResetHint = histogram.NotCounterReset
} }
} }
@ -8330,29 +8330,47 @@ func compareSeries(t require.TestingT, expected, actual map[string][]chunks.Samp
// package. // package.
require.Equal(t, expected, actual, "number of series differs") require.Equal(t, expected, actual, "number of series differs")
} }
for key, eSamples := range expected { for key, expSamples := range expected {
aSamples, ok := actual[key] actSamples, ok := actual[key]
if !ok { if !ok {
require.Equal(t, expected, actual, "expected series %q not found", key) require.Equal(t, expected, actual, "expected series %q not found", key)
} }
if len(eSamples) != len(aSamples) { if len(expSamples) != len(actSamples) {
require.Equal(t, eSamples, aSamples, "number of samples for series %q differs", key) require.Equal(t, expSamples, actSamples, "number of samples for series %q differs", key)
} }
for i, eS := range eSamples {
aS := aSamples[i] for i, eS := range expSamples {
aH, eH := aS.H(), eS.H() aS := actSamples[i]
aFH, eFH := aS.FH(), eS.FH()
switch { // Must use the interface as Equal does not work when actual types differ
case aH != nil && eH != nil && aH.CounterResetHint == histogram.UnknownCounterReset && eH.CounterResetHint != histogram.GaugeType: // not only does the type differ, but chunk.Sample.FH() interface may auto convert from chunk.Sample.H()!
require.Equal(t, eS.T(), aS.T(), "timestamp of sample %d in series %q differs", i, key)
require.Equal(t, eS.Type(), aS.Type(), "type of sample %d in series %q differs", i, key)
switch eS.Type() {
case chunkenc.ValFloat:
require.Equal(t, eS.F(), aS.F(), "sample %d in series %q differs", i, key)
case chunkenc.ValHistogram:
eH, aH := eS.H(), aS.H()
if aH.CounterResetHint == histogram.UnknownCounterReset && aH.CounterResetHint != histogram.GaugeType {
eH = eH.Copy() eH = eH.Copy()
// It is always safe to set the counter reset hint to UnknownCounterReset
eH.CounterResetHint = histogram.UnknownCounterReset eH.CounterResetHint = histogram.UnknownCounterReset
eS = sample{t: eS.T(), h: eH} eS = sample{t: eS.T(), h: eH}
case aFH != nil && eFH != nil && aFH.CounterResetHint == histogram.UnknownCounterReset && eFH.CounterResetHint != histogram.GaugeType: }
require.Equal(t, eH, aH, "histogram sample %d in series %q differs", i, key)
case chunkenc.ValFloatHistogram:
eFH, aFH := eS.FH(), aS.FH()
if aFH.CounterResetHint == histogram.UnknownCounterReset && aFH.CounterResetHint != histogram.GaugeType {
eFH = eFH.Copy() eFH = eFH.Copy()
// It is always safe to set the counter reset hint to UnknownCounterReset
eFH.CounterResetHint = histogram.UnknownCounterReset eFH.CounterResetHint = histogram.UnknownCounterReset
eS = sample{t: eS.T(), fh: eFH} eS = sample{t: eS.T(), fh: eFH}
} }
require.Equal(t, eS, aS, "sample %d in series %q differs", i, key) require.Equal(t, eFH, aFH, "float histogram sample %d in series %q differs", i, key)
}
} }
} }
} }