diff --git a/app/vmselect/promql/timeseries_test.go b/app/vmselect/promql/timeseries_test.go index b77433ef00..b0d14edb60 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