From 57eb5ef1942b16d9bf51b7315a37e5f9a641578a Mon Sep 17 00:00:00 2001 From: Roman Khavronenko Date: Thu, 30 Sep 2021 12:08:47 +0300 Subject: [PATCH] app/vmselect: fix `testRowsEqual` func NaN checks (#1666) It appeared, that `testRowsEqual` NaN comparison was incorrect. The fix caused some tests to fail. Please see the change and tests updated. Signed-off-by: hagen1778 --- app/vmselect/promql/exec_test.go | 24 ++++++------- app/vmselect/promql/rollup_test.go | 55 +++++++++++++++++------------- 2 files changed, 43 insertions(+), 36 deletions(-) diff --git a/app/vmselect/promql/exec_test.go b/app/vmselect/promql/exec_test.go index 13e6f71f0b..87ffc2a0cf 100644 --- a/app/vmselect/promql/exec_test.go +++ b/app/vmselect/promql/exec_test.go @@ -5109,7 +5109,7 @@ func TestExecSuccess(t *testing.T) { q := `sort(topk_min(1, label_set(10, "foo", "bar") or label_set(time()/150, "baz", "sss")))` r1 := netstorage.Result{ MetricName: metricNameExpected, - Values: []float64{10, 10, 10, nan, nan, nan}, + Values: []float64{10, 10, 10, 10, 10, 10}, Timestamps: timestampsExpected, } r1.MetricName.Tags = []storage.Tag{{ @@ -5124,7 +5124,7 @@ func TestExecSuccess(t *testing.T) { q := `sort(bottomk_min(1, label_set(10, "foo", "bar") or label_set(time()/150, "baz", "sss")))` r1 := netstorage.Result{ MetricName: metricNameExpected, - Values: []float64{nan, nan, nan, 10.666666666666666, 12, 13.333333333333334}, + Values: []float64{6.666666666666667, 8, 9.333333333333334, 10.666666666666666, 12, 13.333333333333334}, Timestamps: timestampsExpected, } r1.MetricName.Tags = []storage.Tag{{ @@ -5139,7 +5139,7 @@ func TestExecSuccess(t *testing.T) { q := `topk_max(1, label_set(10, "foo", "bar") or label_set(time()/150, "baz", "sss"))` r1 := netstorage.Result{ MetricName: metricNameExpected, - Values: []float64{nan, nan, nan, 10.666666666666666, 12, 13.333333333333334}, + Values: []float64{6.666666666666667, 8, 9.333333333333334, 10.666666666666666, 12, 13.333333333333334}, Timestamps: timestampsExpected, } r1.MetricName.Tags = []storage.Tag{{ @@ -5154,7 +5154,7 @@ func TestExecSuccess(t *testing.T) { q := `sort_desc(topk_max(1, label_set(10, "foo", "bar") or label_set(time()/150, "baz", "sss"), "remaining_sum=foo"))` r1 := netstorage.Result{ MetricName: metricNameExpected, - Values: []float64{nan, nan, nan, 10.666666666666666, 12, 13.333333333333334}, + Values: []float64{6.666666666666667, 8, 9.333333333333334, 10.666666666666666, 12, 13.333333333333334}, Timestamps: timestampsExpected, } r1.MetricName.Tags = []storage.Tag{{ @@ -5180,7 +5180,7 @@ func TestExecSuccess(t *testing.T) { q := `sort_desc(topk_max(2, label_set(10, "foo", "bar") or label_set(time()/150, "baz", "sss"), "remaining_sum"))` r1 := netstorage.Result{ MetricName: metricNameExpected, - Values: []float64{nan, nan, nan, 10.666666666666666, 12, 13.333333333333334}, + Values: []float64{6.666666666666667, 8, 9.333333333333334, 10.666666666666666, 12, 13.333333333333334}, Timestamps: timestampsExpected, } r1.MetricName.Tags = []storage.Tag{{ @@ -5206,7 +5206,7 @@ func TestExecSuccess(t *testing.T) { q := `sort_desc(topk_max(3, label_set(10, "foo", "bar") or label_set(time()/150, "baz", "sss"), "remaining_sum"))` r1 := netstorage.Result{ MetricName: metricNameExpected, - Values: []float64{nan, nan, nan, 10.666666666666666, 12, 13.333333333333334}, + Values: []float64{6.666666666666667, 8, 9.333333333333334, 10.666666666666666, 12, 13.333333333333334}, Timestamps: timestampsExpected, } r1.MetricName.Tags = []storage.Tag{{ @@ -5232,7 +5232,7 @@ func TestExecSuccess(t *testing.T) { q := `sort(bottomk_max(1, label_set(10, "foo", "bar") or label_set(time()/150, "baz", "sss")))` r1 := netstorage.Result{ MetricName: metricNameExpected, - Values: []float64{10, 10, 10, nan, nan, nan}, + Values: []float64{10, 10, 10, 10, 10, 10}, Timestamps: timestampsExpected, } r1.MetricName.Tags = []storage.Tag{{ @@ -5247,7 +5247,7 @@ func TestExecSuccess(t *testing.T) { q := `sort(topk_avg(1, label_set(10, "foo", "bar") or label_set(time()/150, "baz", "sss")))` r1 := netstorage.Result{ MetricName: metricNameExpected, - Values: []float64{nan, nan, nan, 10.666666666666666, 12, 13.333333333333334}, + Values: []float64{6.666666666666667, 8, 9.333333333333334, 10.666666666666666, 12, 13.333333333333334}, Timestamps: timestampsExpected, } r1.MetricName.Tags = []storage.Tag{{ @@ -5277,7 +5277,7 @@ func TestExecSuccess(t *testing.T) { q := `sort(topk_median(1, label_set(10, "foo", "bar") or label_set(time()/150, "baz", "sss")))` r1 := netstorage.Result{ MetricName: metricNameExpected, - Values: []float64{nan, nan, nan, 10.666666666666666, 12, 13.333333333333334}, + Values: []float64{6.666666666666667, 8, 9.333333333333334, 10.666666666666666, 12, 13.333333333333334}, Timestamps: timestampsExpected, } r1.MetricName.Tags = []storage.Tag{{ @@ -5292,7 +5292,7 @@ func TestExecSuccess(t *testing.T) { q := `sort(bottomk_median(1, label_set(10, "foo", "bar") or label_set(time()/15, "baz", "sss")))` r1 := netstorage.Result{ MetricName: metricNameExpected, - Values: []float64{10, 10, 10, nan, nan, nan}, + Values: []float64{10, 10, 10, 10, 10, 10}, Timestamps: timestampsExpected, } r1.MetricName.Tags = []storage.Tag{{ @@ -5470,7 +5470,7 @@ func TestExecSuccess(t *testing.T) { q := `distinct_over_time((time() < 1700)[500s])` r1 := netstorage.Result{ MetricName: metricNameExpected, - Values: []float64{3, 3, 3, 3, nan, nan}, + Values: []float64{3, 3, 3, 3, 2, 1}, Timestamps: timestampsExpected, } resultExpected := []netstorage.Result{r1} @@ -5481,7 +5481,7 @@ func TestExecSuccess(t *testing.T) { q := `distinct_over_time((time() < 1700)[2.5i])` r1 := netstorage.Result{ MetricName: metricNameExpected, - Values: []float64{3, 3, 3, 3, nan, nan}, + Values: []float64{3, 3, 3, 3, 2, 1}, Timestamps: timestampsExpected, } resultExpected := []netstorage.Result{r1} diff --git a/app/vmselect/promql/rollup_test.go b/app/vmselect/promql/rollup_test.go index 1119d72614..93d85dedef 100644 --- a/app/vmselect/promql/rollup_test.go +++ b/app/vmselect/promql/rollup_test.go @@ -626,7 +626,7 @@ func TestRollupNoWindowPartialPoints(t *testing.T) { } rc.Timestamps = getTimestamps(rc.Start, rc.End, rc.Step) values := rc.Do(nil, testValues, testTimestamps) - valuesExpected := []float64{nan, nan, 123, 34, nan} + valuesExpected := []float64{nan, nan, 123, 34, 32} timestampsExpected := []int64{-50, 0, 50, 100, 150} testRowsEqual(t, values, rc.Timestamps, valuesExpected, timestampsExpected) }) @@ -733,7 +733,7 @@ func TestRollupFuncsNoWindow(t *testing.T) { } rc.Timestamps = getTimestamps(rc.Start, rc.End, rc.Step) values := rc.Do(nil, testValues, testTimestamps) - valuesExpected := []float64{nan, 123, 54, 44, nan} + valuesExpected := []float64{nan, 123, 54, 44, 34} timestampsExpected := []int64{0, 40, 80, 120, 160} testRowsEqual(t, values, rc.Timestamps, valuesExpected, timestampsExpected) }) @@ -747,7 +747,7 @@ func TestRollupFuncsNoWindow(t *testing.T) { } rc.Timestamps = getTimestamps(rc.Start, rc.End, rc.Step) values := rc.Do(nil, testValues, testTimestamps) - valuesExpected := []float64{nan, 4, 4, 3, nan} + valuesExpected := []float64{nan, 4, 4, 3, 1} timestampsExpected := []int64{0, 40, 80, 120, 160} testRowsEqual(t, values, rc.Timestamps, valuesExpected, timestampsExpected) }) @@ -761,7 +761,7 @@ func TestRollupFuncsNoWindow(t *testing.T) { } rc.Timestamps = getTimestamps(rc.Start, rc.End, rc.Step) values := rc.Do(nil, testValues, testTimestamps) - valuesExpected := []float64{nan, 21, 12, 32, nan} + valuesExpected := []float64{nan, 21, 12, 32, 34} timestampsExpected := []int64{0, 40, 80, 120, 160} testRowsEqual(t, values, rc.Timestamps, valuesExpected, timestampsExpected) }) @@ -775,7 +775,7 @@ func TestRollupFuncsNoWindow(t *testing.T) { } rc.Timestamps = getTimestamps(rc.Start, rc.End, rc.Step) values := rc.Do(nil, testValues, testTimestamps) - valuesExpected := []float64{nan, 123, 99, 44, nan} + valuesExpected := []float64{nan, 123, 99, 44, 34} timestampsExpected := []int64{0, 40, 80, 120, 160} testRowsEqual(t, values, rc.Timestamps, valuesExpected, timestampsExpected) }) @@ -789,7 +789,7 @@ func TestRollupFuncsNoWindow(t *testing.T) { } rc.Timestamps = getTimestamps(rc.Start, rc.End, rc.Step) values := rc.Do(nil, testValues, testTimestamps) - valuesExpected := []float64{nan, 222, 199, 110, nan} + valuesExpected := []float64{nan, 222, 199, 110, 34} timestampsExpected := []int64{0, 40, 80, 120, 160} testRowsEqual(t, values, rc.Timestamps, valuesExpected, timestampsExpected) }) @@ -803,7 +803,7 @@ func TestRollupFuncsNoWindow(t *testing.T) { } rc.Timestamps = getTimestamps(rc.Start, rc.End, rc.Step) values := rc.Do(nil, testValues, testTimestamps) - valuesExpected := []float64{nan, nan, -9, 22, nan} + valuesExpected := []float64{nan, 21, -9, 22, 0} timestampsExpected := []int64{0, 40, 80, 120, 160} testRowsEqual(t, values, rc.Timestamps, valuesExpected, timestampsExpected) }) @@ -831,7 +831,7 @@ func TestRollupFuncsNoWindow(t *testing.T) { } rc.Timestamps = getTimestamps(rc.Start, rc.End, rc.Step) values := rc.Do(nil, testValues, testTimestamps) - valuesExpected := []float64{nan, 0.004, 0, 0, nan} + valuesExpected := []float64{nan, 0.004, 0, 0, 0.03} timestampsExpected := []int64{0, 40, 80, 120, 160} testRowsEqual(t, values, rc.Timestamps, valuesExpected, timestampsExpected) }) @@ -845,7 +845,7 @@ func TestRollupFuncsNoWindow(t *testing.T) { } rc.Timestamps = getTimestamps(rc.Start, rc.End, rc.Step) values := rc.Do(nil, testValues, testTimestamps) - valuesExpected := []float64{nan, 0.031, 0.044, 0.04, nan} + valuesExpected := []float64{nan, 0.031, 0.044, 0.04, 0.01} timestampsExpected := []int64{0, 40, 80, 120, 160} testRowsEqual(t, values, rc.Timestamps, valuesExpected, timestampsExpected) }) @@ -859,7 +859,7 @@ func TestRollupFuncsNoWindow(t *testing.T) { } rc.Timestamps = getTimestamps(rc.Start, rc.End, rc.Step) values := rc.Do(nil, testValues, testTimestamps) - valuesExpected := []float64{nan, 0.031, 0.075, 0.115, nan} + valuesExpected := []float64{nan, 0.031, 0.075, 0.115, 0.125} timestampsExpected := []int64{0, 40, 80, 120, 160} testRowsEqual(t, values, rc.Timestamps, valuesExpected, timestampsExpected) }) @@ -873,7 +873,7 @@ func TestRollupFuncsNoWindow(t *testing.T) { } rc.Timestamps = getTimestamps(rc.Start, rc.End, rc.Step) values := rc.Do(nil, testValues, testTimestamps) - valuesExpected := []float64{nan, 0.010333333333333333, 0.011, 0.013333333333333334, nan} + valuesExpected := []float64{nan, 0.010333333333333333, 0.011, 0.013333333333333334, 0.01} timestampsExpected := []int64{0, 40, 80, 120, 160} testRowsEqual(t, values, rc.Timestamps, valuesExpected, timestampsExpected) }) @@ -887,7 +887,7 @@ func TestRollupFuncsNoWindow(t *testing.T) { } rc.Timestamps = getTimestamps(rc.Start, rc.End, rc.Step) values := rc.Do(nil, testValues, testTimestamps) - valuesExpected := []float64{nan, 0.010333333333333333, 0.010714285714285714, 0.012, nan} + valuesExpected := []float64{nan, 0.010333333333333333, 0.010714285714285714, 0.012, 0.0125} timestampsExpected := []int64{0, 40, 80, 120, 160} testRowsEqual(t, values, rc.Timestamps, valuesExpected, timestampsExpected) }) @@ -901,7 +901,7 @@ func TestRollupFuncsNoWindow(t *testing.T) { } rc.Timestamps = getTimestamps(rc.Start, rc.End, rc.Step) values := rc.Do(nil, testValues, testTimestamps) - valuesExpected := []float64{nan, 4, 4, 3, nan} + valuesExpected := []float64{nan, 4, 4, 3, 0} timestampsExpected := []int64{0, 40, 80, 120, 160} testRowsEqual(t, values, rc.Timestamps, valuesExpected, timestampsExpected) }) @@ -929,7 +929,7 @@ func TestRollupFuncsNoWindow(t *testing.T) { } rc.Timestamps = getTimestamps(rc.Start, rc.End, rc.Step) values := rc.Do(nil, testValues, testTimestamps) - valuesExpected := []float64{nan, 2, 2, 1, nan} + valuesExpected := []float64{nan, 2, 2, 1, 0} timestampsExpected := []int64{0, 40, 80, 120, 160} testRowsEqual(t, values, rc.Timestamps, valuesExpected, timestampsExpected) }) @@ -943,7 +943,7 @@ func TestRollupFuncsNoWindow(t *testing.T) { } rc.Timestamps = getTimestamps(rc.Start, rc.End, rc.Step) values := rc.Do(nil, testValues, testTimestamps) - valuesExpected := []float64{nan, 55.5, 49.75, 36.666666666666664, nan} + valuesExpected := []float64{nan, 55.5, 49.75, 36.666666666666664, 34} timestampsExpected := []int64{0, 40, 80, 120, 160} testRowsEqual(t, values, rc.Timestamps, valuesExpected, timestampsExpected) }) @@ -957,7 +957,7 @@ func TestRollupFuncsNoWindow(t *testing.T) { } rc.Timestamps = getTimestamps(rc.Start, rc.End, rc.Step) values := rc.Do(nil, testValues, testTimestamps) - valuesExpected := []float64{0, -2879.310344827587, 558.0608793686595, 422.84569138276544, nan} + valuesExpected := []float64{0, -2879.310344827587, 558.0608793686595, 422.84569138276544, 0} timestampsExpected := []int64{0, 40, 80, 120, 160} testRowsEqual(t, values, rc.Timestamps, valuesExpected, timestampsExpected) }) @@ -985,7 +985,7 @@ func TestRollupFuncsNoWindow(t *testing.T) { } rc.Timestamps = getTimestamps(rc.Start, rc.End, rc.Step) values := rc.Do(nil, testValues, testTimestamps) - valuesExpected := []float64{nan, -1916.6666666666665, -43500, 400, nan} + valuesExpected := []float64{nan, -1916.6666666666665, -43500, 400, 0} timestampsExpected := []int64{0, 40, 80, 120, 160} testRowsEqual(t, values, rc.Timestamps, valuesExpected, timestampsExpected) }) @@ -999,7 +999,7 @@ func TestRollupFuncsNoWindow(t *testing.T) { } rc.Timestamps = getTimestamps(rc.Start, rc.End, rc.Step) values := rc.Do(nil, testValues, testTimestamps) - valuesExpected := []float64{nan, 39.81519810323691, 32.080952292598795, 5.2493385826745405, nan} + valuesExpected := []float64{nan, 39.81519810323691, 32.080952292598795, 5.2493385826745405, 0} timestampsExpected := []int64{0, 40, 80, 120, 160} testRowsEqual(t, values, rc.Timestamps, valuesExpected, timestampsExpected) }) @@ -1013,7 +1013,7 @@ func TestRollupFuncsNoWindow(t *testing.T) { } rc.Timestamps = getTimestamps(rc.Start, rc.End, rc.Step) values := rc.Do(nil, testValues, testTimestamps) - valuesExpected := []float64{nan, 2.148, 1.593, 1.156, nan} + valuesExpected := []float64{nan, 2.148, 1.593, 1.156, 1.36} timestampsExpected := []int64{0, 40, 80, 120, 160} testRowsEqual(t, values, rc.Timestamps, valuesExpected, timestampsExpected) }) @@ -1027,7 +1027,7 @@ func TestRollupFuncsNoWindow(t *testing.T) { } rc.Timestamps = getTimestamps(rc.Start, rc.End, rc.Step) values := rc.Do(nil, testValues, testTimestamps) - valuesExpected := []float64{nan, 4, 4, 3, nan} + valuesExpected := []float64{nan, 4, 4, 3, 1} timestampsExpected := []int64{0, 40, 80, 120, 160} testRowsEqual(t, values, rc.Timestamps, valuesExpected, timestampsExpected) }) @@ -1041,7 +1041,7 @@ func TestRollupFuncsNoWindow(t *testing.T) { } rc.Timestamps = getTimestamps(rc.Start, rc.End, rc.Step) values := rc.Do(nil, testValues, testTimestamps) - valuesExpected := []float64{nan, 4, 7, 6, nan} + valuesExpected := []float64{nan, 4, 7, 6, 3} timestampsExpected := []int64{0, 40, 80, 120, 160} testRowsEqual(t, values, rc.Timestamps, valuesExpected, timestampsExpected) }) @@ -1055,7 +1055,7 @@ func TestRollupFuncsNoWindow(t *testing.T) { } rc.Timestamps = getTimestamps(rc.Start, rc.End, rc.Step) values := rc.Do(nil, testValues, testTimestamps) - valuesExpected := []float64{nan, 21, 34, 34, nan} + valuesExpected := []float64{nan, 21, 34, 34, 34} timestampsExpected := []int64{0, 40, 80, 120, 160} testRowsEqual(t, values, rc.Timestamps, valuesExpected, timestampsExpected) }) @@ -1069,7 +1069,7 @@ func TestRollupFuncsNoWindow(t *testing.T) { } rc.Timestamps = getTimestamps(rc.Start, rc.End, rc.Step) values := rc.Do(nil, testValues, testTimestamps) - valuesExpected := []float64{nan, 2775, 5262.5, 3678.5714285714284, nan} + valuesExpected := []float64{nan, 2775, 5262.5, 3678.5714285714284, 2880} timestampsExpected := []int64{0, 40, 80, 120, 160} testRowsEqual(t, values, rc.Timestamps, valuesExpected, timestampsExpected) }) @@ -1105,7 +1105,7 @@ func TestRollupBigNumberOfValues(t *testing.T) { srcTimestamps[i] = int64(i / 2) } values := rc.Do(nil, srcValues, srcTimestamps) - valuesExpected := []float64{1, 4001, 8001, nan, nan, nan} + valuesExpected := []float64{1, 4001, 8001, 9999, nan, nan} timestampsExpected := []int64{0, 2000, 4000, 6000, 8000, 10000} testRowsEqual(t, values, rc.Timestamps, valuesExpected, timestampsExpected) } @@ -1138,6 +1138,13 @@ func testRowsEqual(t *testing.T, values []float64, timestamps []int64, valuesExp } continue } + if math.IsNaN(vExpected) { + if !math.IsNaN(v) { + t.Fatalf("unexpected value at values[%d]; got %f; want nan\nvalues=\n%v\nvaluesExpected=\n%v", + i, v, values, valuesExpected) + } + continue + } if math.Abs(v-vExpected) > 1e-15 { t.Fatalf("unexpected value at values[%d]; got %f; want %f\nvalues=\n%v\nvaluesExpected=\n%v", i, v, vExpected, values, valuesExpected)