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)
+}

Reply via email to