This is an automated email from the ASF dual-hosted git repository. hanahmily pushed a commit to branch feat/segmeta in repository https://gitbox.apache.org/repos/asf/skywalking-banyandb.git
commit d94c583a9e990345e812d19878373fd66ede3aad Author: Hongtao Gao <[email protected]> AuthorDate: Tue Apr 7 00:48:36 2026 +0000 feat(storage): add segmentMeta struct and readSegmentMeta helper --- banyand/internal/storage/version.go | 21 +++++++++++ banyand/internal/storage/version_test.go | 63 ++++++++++++++++++++++++++++++++ 2 files changed, 84 insertions(+) diff --git a/banyand/internal/storage/version.go b/banyand/internal/storage/version.go index 55a92f04b..2e4bfac7f 100644 --- a/banyand/internal/storage/version.go +++ b/banyand/internal/storage/version.go @@ -49,6 +49,27 @@ func checkVersion(version string) error { return errors.WithMessagef(errVersionIncompatible, "incompatible version %s, supported versions: %s", version, strings.Join(compatibleVersions, ", ")) } +type segmentMeta struct { + Version string `json:"version"` + EndTime string `json:"endTime,omitempty"` +} + +func readSegmentMeta(data []byte) (segmentMeta, error) { + var meta segmentMeta + trimmed := strings.TrimSpace(string(data)) + if len(trimmed) > 0 && trimmed[0] == '{' { + if unmarshalErr := json.Unmarshal(data, &meta); unmarshalErr != nil { + return segmentMeta{}, unmarshalErr + } + } else { + meta.Version = trimmed + } + if checkErr := checkVersion(meta.Version); checkErr != nil { + return segmentMeta{}, checkErr + } + return meta, nil +} + func readCompatibleVersions() []string { i, err := versionFS.ReadFile(compatibleVersionsFilename) if err != nil { diff --git a/banyand/internal/storage/version_test.go b/banyand/internal/storage/version_test.go new file mode 100644 index 000000000..726e6d8a2 --- /dev/null +++ b/banyand/internal/storage/version_test.go @@ -0,0 +1,63 @@ +// Licensed to Apache Software Foundation (ASF) under one or more contributor +// license agreements. See the NOTICE file distributed with +// this work for additional information regarding copyright +// ownership. Apache Software Foundation (ASF) licenses this file to you under +// the Apache License, Version 2.0 (the "License"); you may +// not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package storage + +import ( + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func TestReadSegmentMeta_NewFormat(t *testing.T) { + data := []byte(`{"version":"1.4.0","endTime":"2026-04-07T00:00:00+08:00"}`) + meta, err := readSegmentMeta(data) + require.NoError(t, err) + assert.Equal(t, "1.4.0", meta.Version) + assert.Equal(t, "2026-04-07T00:00:00+08:00", meta.EndTime) +} + +func TestReadSegmentMeta_OldFormat(t *testing.T) { + data := []byte("1.4.0") + meta, err := readSegmentMeta(data) + require.NoError(t, err) + assert.Equal(t, "1.4.0", meta.Version) + assert.Equal(t, "", meta.EndTime) +} + +func TestReadSegmentMeta_OldFormatWithNewline(t *testing.T) { + data := []byte("1.4.0\n") + meta, err := readSegmentMeta(data) + require.NoError(t, err) + assert.Equal(t, "1.4.0", meta.Version) + assert.Equal(t, "", meta.EndTime) +} + +func TestReadSegmentMeta_IncompatibleVersion(t *testing.T) { + data := []byte(`{"version":"0.1.0","endTime":"2026-04-07T00:00:00+08:00"}`) + _, err := readSegmentMeta(data) + assert.Error(t, err) +} + +func TestReadSegmentMeta_NewFormatNoEndTime(t *testing.T) { + data := []byte(`{"version":"1.4.0"}`) + meta, err := readSegmentMeta(data) + require.NoError(t, err) + assert.Equal(t, "1.4.0", meta.Version) + assert.Equal(t, "", meta.EndTime) +}
