This is an automated email from the ASF dual-hosted git repository.

hanahmily pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/skywalking-banyandb.git


The following commit(s) were added to refs/heads/main by this push:
     new 582f4a715 Fix TTL filter bypassed on metadata/listing query paths 
(#1170)
582f4a715 is described below

commit 582f4a7158c81f36576374b39c0a018a994bb6a4
Author: Gao Hongtao <[email protected]>
AuthorDate: Thu Jun 11 17:21:48 2026 +0800

    Fix TTL filter bypassed on metadata/listing query paths (#1170)
    
    The TTL deadline filter in SelectSegments was gated on reopenClosed=true,
    so all metadata and stats listing call sites (which pass reopenClosed=false
    to avoid reopening cold segments) received fully expired segments until the
    next retention cron run.
---
 banyand/internal/storage/tsdb.go      |  2 +-
 banyand/internal/storage/tsdb_test.go | 13 +++++++++++++
 2 files changed, 14 insertions(+), 1 deletion(-)

diff --git a/banyand/internal/storage/tsdb.go b/banyand/internal/storage/tsdb.go
index ae3275d04..4c4dc83ac 100644
--- a/banyand/internal/storage/tsdb.go
+++ b/banyand/internal/storage/tsdb.go
@@ -279,7 +279,7 @@ func (d *database[T, O]) SelectSegments(timeRange 
timestamp.TimeRange, reopenClo
                return nil, nil
        }
        segments, err := d.segmentController.selectSegments(timeRange, 
reopenClosed)
-       if err != nil || !reopenClosed || d.disableRetention {
+       if err != nil || d.disableRetention {
                return segments, err
        }
        // Exclude segments whose whole time range has already passed the 
retention
diff --git a/banyand/internal/storage/tsdb_test.go 
b/banyand/internal/storage/tsdb_test.go
index e2ac247f8..12e551792 100644
--- a/banyand/internal/storage/tsdb_test.go
+++ b/banyand/internal/storage/tsdb_test.go
@@ -283,6 +283,19 @@ func TestSelectSegmentsRetention(t *testing.T) {
                }()
                require.Len(t, segs, 2)
        })
+
+       t.Run("metadata path excludes fully expired segments", func(t 
*testing.T) {
+               tsdb := newDB(t, false)
+               segs, err := tsdb.SelectSegments(wide, false)
+               require.NoError(t, err)
+               defer func() {
+                       for _, s := range segs {
+                               s.DecRef()
+                       }
+               }()
+               require.Len(t, segs, 1, "fully expired segment must be filtered 
out for reopenClosed=false too")
+               require.False(t, segs[0].GetTimeRange().Before(deadline), "the 
kept segment must not be fully expired")
+       })
 }
 
 func TestTakeFileSnapshot(t *testing.T) {

Reply via email to