mirror of
https://github.com/prometheus/prometheus.git
synced 2024-12-26 06:04:05 -08:00
Protect exported Querier interface method against negative time ranges
This commit is contained in:
parent
2f6899cbb8
commit
c5bd178b93
|
@ -480,6 +480,10 @@ func (bit *boundedIterator) Close() {
|
|||
|
||||
// QueryRange implements Storage.
|
||||
func (s *MemorySeriesStorage) QueryRange(_ context.Context, from, through model.Time, matchers ...*metric.LabelMatcher) ([]SeriesIterator, error) {
|
||||
if through.Before(from) {
|
||||
// In that case, nothing will match.
|
||||
return nil, nil
|
||||
}
|
||||
fpSeriesPairs, err := s.seriesForLabelMatchers(from, through, matchers...)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
|
@ -494,6 +498,9 @@ func (s *MemorySeriesStorage) QueryRange(_ context.Context, from, through model.
|
|||
|
||||
// QueryInstant implements Storage.
|
||||
func (s *MemorySeriesStorage) QueryInstant(_ context.Context, ts model.Time, stalenessDelta time.Duration, matchers ...*metric.LabelMatcher) ([]SeriesIterator, error) {
|
||||
if stalenessDelta < 0 {
|
||||
panic("negative staleness delta")
|
||||
}
|
||||
from := ts.Add(-stalenessDelta)
|
||||
through := ts
|
||||
|
||||
|
|
|
@ -504,6 +504,39 @@ func BenchmarkQueryRange(b *testing.B) {
|
|||
})
|
||||
}
|
||||
|
||||
func TestQueryRangeThroughBeforeFrom(t *testing.T) {
|
||||
now := model.Now()
|
||||
insertStart := now.Add(-2 * time.Hour)
|
||||
|
||||
s, closer := NewTestStorage(t, 2)
|
||||
defer closer.Close()
|
||||
|
||||
// Stop maintenance loop to prevent actual purging.
|
||||
close(s.loopStopping)
|
||||
<-s.loopStopped
|
||||
<-s.logThrottlingStopped
|
||||
// Recreate channel to avoid panic when we really shut down.
|
||||
s.loopStopping = make(chan struct{})
|
||||
|
||||
for i := 0; i < 8192; i++ {
|
||||
s.Append(&model.Sample{
|
||||
Metric: model.Metric{"__name__": "testmetric", "job": "test"},
|
||||
Timestamp: insertStart.Add(time.Duration(i) * time.Second),
|
||||
Value: model.SampleValue(rand.Float64()),
|
||||
})
|
||||
}
|
||||
s.WaitForIndexing()
|
||||
|
||||
lm, _ := metric.NewLabelMatcher(metric.Equal, "job", "test")
|
||||
iters, err := s.QueryRange(context.Background(), now.Add(-30*time.Minute), now.Add(-90*time.Minute), lm)
|
||||
if err != nil {
|
||||
t.Error(err)
|
||||
}
|
||||
if len(iters) != 0 {
|
||||
t.Errorf("expected no iters to be returned, got %d", len(iters))
|
||||
}
|
||||
}
|
||||
|
||||
func TestRetentionCutoff(t *testing.T) {
|
||||
now := model.Now()
|
||||
insertStart := now.Add(-2 * time.Hour)
|
||||
|
|
Loading…
Reference in a new issue