From 48ee15ac4240efde3cea9d678d02719e6981a4ad Mon Sep 17 00:00:00 2001 From: oliverpool <3864879+oliverpool@users.noreply.github.com> Date: Thu, 16 Mar 2023 17:01:42 +0100 Subject: [PATCH] app/vmselect/promql: add test to ensure 8-byte alignment (#3948) See 0af9e2b69340b068590f36f41e53261c1046fe11 --- app/vmselect/promql/timeseries_test.go | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/app/vmselect/promql/timeseries_test.go b/app/vmselect/promql/timeseries_test.go index b77433ef0..b0d14edb6 100644 --- a/app/vmselect/promql/timeseries_test.go +++ b/app/vmselect/promql/timeseries_test.go @@ -4,6 +4,7 @@ import ( "os" "reflect" "testing" + "unsafe" "github.com/VictoriaMetrics/VictoriaMetrics/lib/storage" ) @@ -24,6 +25,26 @@ func TestMarshalTimeseriesFast(t *testing.T) { if !reflect.DeepEqual(tss, tss2) { t.Fatalf("unexpected timeseries unmarshaled\ngot\n%#v\nwant\n%#v", tss2[0], tss[0]) } + + // Check 8-byte alignment. + // This prevents from SIGBUS error on arm architectures. + // See https://github.com/VictoriaMetrics/VictoriaMetrics/pull/3927 + for _, ts := range tss2 { + if len(ts.Values) == 0 { + continue + } + + // check float64 alignment + addr := uintptr(unsafe.Pointer(&ts.Values[0])) + if mod := addr % unsafe.Alignof(ts.Values[0]); mod != 0 { + t.Fatalf("mis-aligned; &ts.Values[0]=%p; mod=%d", &ts.Values[0], mod) + } + // check int64 alignment + addr = uintptr(unsafe.Pointer(&ts.Timestamps[0])) + if mod := addr % unsafe.Alignof(ts.Timestamps[0]); mod != 0 { + t.Fatalf("mis-aligned; &ts.Timestamps[0]=%p; mod=%d", &ts.Timestamps[0], mod) + } + } } // Single series