Merge pull request #2143 from prometheus/beorn7/fix

Protect against negative time ranges.
pull/2144/head
Fabian Reinartz 8 years ago committed by GitHub
commit fc4d9c13e8

@ -1,5 +1,6 @@
## 1.2.2 / 2016-10-30
* [BUGFIX] Correctly handle on() in alerts.
* [BUGFIX] UI: Deal properly with aborted requests.
* [BUGFIX] UI: Decode URL query parameters properly.
* [BUGFIX] Storage: Deal better with data corruption (non-monotonic timestamps).

@ -262,6 +262,10 @@ func parse(args []string) error {
return err
}
if promql.StalenessDelta < 0 {
return fmt.Errorf("negative staleness delta: %s", promql.StalenessDelta)
}
if err := parsePrometheusURL(); err != nil {
return err
}

@ -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…
Cancel
Save