From c048a0cde874bb6ac037e6d476068b4863739926 Mon Sep 17 00:00:00 2001 From: Maxim Ivanov Date: Sun, 18 Sep 2016 11:03:00 +0100 Subject: [PATCH] Add metrics to result after checking all matchers Should be marginally faster and somewhat more GC friendly --- storage/local/storage.go | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/storage/local/storage.go b/storage/local/storage.go index a00da8b8a..93367fe6d 100644 --- a/storage/local/storage.go +++ b/storage/local/storage.go @@ -631,19 +631,22 @@ func (s *MemorySeriesStorage) metricsForLabelMatchers( } result := map[model.Fingerprint]metric.Metric{} +FP_LOOP: for fp := range remainingFPs { s.fpLocker.Lock(fp) - if met, _, ok := s.metricForRange(fp, from, through); ok { - result[fp] = metric.Metric{Metric: met} - } + met, _, ok := s.metricForRange(fp, from, through) s.fpLocker.Unlock(fp) - } - for _, m := range matchers[matcherIdx:] { - for fp, met := range result { - if !m.Match(met.Metric[m.Name]) { - delete(result, fp) + + if !ok { + continue FP_LOOP + } + + for _, m := range matchers[matcherIdx:] { + if !m.Match(met[m.Name]) { + continue FP_LOOP } } + result[fp] = metric.Metric{Metric: met} } return result, nil }