From 331be19af6c71e6da476128cf4f3a22df5708dfd Mon Sep 17 00:00:00 2001 From: Julius Volz Date: Thu, 25 Jul 2013 12:10:16 +0200 Subject: [PATCH 1/2] Fix broken retrieval tests. These have been broken since 06b4a406617fe8399babb55959e7f5e534772ceb --- retrieval/interface_test.go | 2 +- retrieval/scheduler_test.go | 39 ++++++++++++++++++++++++++++++--- retrieval/targetmanager_test.go | 2 ++ 3 files changed, 39 insertions(+), 4 deletions(-) diff --git a/retrieval/interface_test.go b/retrieval/interface_test.go index 2ef14db88..05868cfdc 100644 --- a/retrieval/interface_test.go +++ b/retrieval/interface_test.go @@ -21,7 +21,7 @@ func TestInterfaces(t *testing.T) { var ( _ Target = &target{} _ TargetManager = &targetManager{} - _ healthReporter = target{} + _ healthReporter = &target{} _ scheduler = &healthScheduler{} ) } diff --git a/retrieval/scheduler_test.go b/retrieval/scheduler_test.go index 73283b43c..39c19ac8c 100644 --- a/retrieval/scheduler_test.go +++ b/retrieval/scheduler_test.go @@ -58,9 +58,42 @@ func testHealthScheduler(t test.Tester) { expectedSchedule: []time.Time{now, now.Add(time.Second * 2), now.Add(time.Minute * 2)}, }, { - futureHealthState: []TargetState{UNKNOWN, UNREACHABLE, UNREACHABLE, UNREACHABLE, UNREACHABLE, UNREACHABLE, UNREACHABLE, UNREACHABLE, UNREACHABLE, UNREACHABLE, UNREACHABLE, UNREACHABLE, UNREACHABLE}, - preloadedTimes: []time.Time{now, now.Add(time.Minute), now.Add(time.Minute * 2), now.Add(time.Minute * 3), now.Add(time.Minute * 4), now.Add(time.Minute * 5), now.Add(time.Minute * 6), now.Add(time.Minute * 7), now.Add(time.Minute * 8), now.Add(time.Minute * 9), now.Add(time.Minute * 10), now.Add(time.Minute * 11), now.Add(time.Minute * 12)}, - expectedSchedule: []time.Time{now, now.Add(time.Second * 2), now.Add(time.Minute * 1).Add(time.Second * 4), now.Add(time.Minute * 2).Add(time.Second * 8), now.Add(time.Minute * 3).Add(time.Second * 16), now.Add(time.Minute * 4).Add(time.Second * 32), now.Add(time.Minute * 5).Add(time.Second * 64), now.Add(time.Minute * 6).Add(time.Second * 128), now.Add(time.Minute * 7).Add(time.Second * 256), now.Add(time.Minute * 8).Add(time.Second * 512), now.Add(time.Minute * 9).Add(time.Second * 1024), now.Add(time.Minute * 10).Add(time.Minute * 30), now.Add(time.Minute * 11).Add(time.Minute * 30)}, + futureHealthState: []TargetState{ + UNKNOWN, + UNREACHABLE, + UNREACHABLE, + UNREACHABLE, + UNREACHABLE, + UNREACHABLE, + UNREACHABLE, + UNREACHABLE, + UNREACHABLE, + UNREACHABLE, + }, + preloadedTimes: []time.Time{ + now, + now.Add(time.Minute), + now.Add(time.Minute * 2), + now.Add(time.Minute * 3), + now.Add(time.Minute * 4), + now.Add(time.Minute * 5), + now.Add(time.Minute * 6), + now.Add(time.Minute * 7), + now.Add(time.Minute * 8), + now.Add(time.Minute * 9), + }, + expectedSchedule: []time.Time{ + now, + now.Add(time.Second * 2), + now.Add(time.Minute * 1).Add(time.Second * 4), + now.Add(time.Minute * 2).Add(time.Second * 8), + now.Add(time.Minute * 3).Add(time.Second * 16), + now.Add(time.Minute * 4).Add(time.Second * 32), + now.Add(time.Minute * 5).Add(time.Second * 64), + now.Add(time.Minute * 6).Add(time.Minute * 2), + now.Add(time.Minute * 7).Add(time.Minute * 2), + now.Add(time.Minute * 8).Add(time.Minute * 2), + }, }, } diff --git a/retrieval/targetmanager_test.go b/retrieval/targetmanager_test.go index cee692eee..25f44b151 100644 --- a/retrieval/targetmanager_test.go +++ b/retrieval/targetmanager_test.go @@ -75,6 +75,8 @@ func (t *fakeTarget) ScheduledFor() (time time.Time) { func (t *fakeTarget) Merge(newTarget Target) {} +func (t *fakeTarget) EstimatedTimeToExecute() time.Duration { return 0 } + func testTargetManager(t test.Tester) { results := make(chan *extraction.Result, 5) targetManager := NewTargetManager(results, 3) From 81f0b850131c1f60dc4e6cba05a8eb69f89e4fd9 Mon Sep 17 00:00:00 2001 From: Julius Volz Date: Thu, 25 Jul 2013 12:16:32 +0200 Subject: [PATCH 2/2] Return [] instead of null for empty result vectors. --- retrieval/targetmanager_test.go | 2 +- rules/ast/ast.go | 6 +++--- rules/ast/persistence_adapter.go | 17 ++++++++++------- 3 files changed, 14 insertions(+), 11 deletions(-) diff --git a/retrieval/targetmanager_test.go b/retrieval/targetmanager_test.go index 25f44b151..08115a3f1 100644 --- a/retrieval/targetmanager_test.go +++ b/retrieval/targetmanager_test.go @@ -75,7 +75,7 @@ func (t *fakeTarget) ScheduledFor() (time time.Time) { func (t *fakeTarget) Merge(newTarget Target) {} -func (t *fakeTarget) EstimatedTimeToExecute() time.Duration { return 0 } +func (t *fakeTarget) EstimatedTimeToExecute() time.Duration { return 0 } func testTargetManager(t test.Tester) { results := make(chan *extraction.Result, 5) diff --git a/rules/ast/ast.go b/rules/ast/ast.go index 82eaeb867..1ca976010 100644 --- a/rules/ast/ast.go +++ b/rules/ast/ast.go @@ -401,7 +401,7 @@ func (node *VectorAggregation) Eval(timestamp time.Time, view *viewAdapter) Vect func (node *VectorLiteral) Eval(timestamp time.Time, view *viewAdapter) Vector { values, err := view.GetValueAtTime(node.fingerprints, timestamp) if err != nil { - log.Printf("Unable to get vector values") + log.Println("Unable to get vector values:", err) return Vector{} } return values @@ -589,7 +589,7 @@ func (node *MatrixLiteral) Eval(timestamp time.Time, view *viewAdapter) Matrix { } values, err := view.GetRangeValues(node.fingerprints, interval) if err != nil { - log.Printf("Unable to get values for vector interval") + log.Println("Unable to get values for vector interval:", err) return Matrix{} } return values @@ -602,7 +602,7 @@ func (node *MatrixLiteral) EvalBoundaries(timestamp time.Time, view *viewAdapter } values, err := view.GetBoundaryValues(node.fingerprints, interval) if err != nil { - log.Printf("Unable to get boundary values for vector interval") + log.Printf("Unable to get boundary values for vector interval:", err) return Matrix{} } return values diff --git a/rules/ast/persistence_adapter.go b/rules/ast/persistence_adapter.go index fcd37614c..52e3d001f 100644 --- a/rules/ast/persistence_adapter.go +++ b/rules/ast/persistence_adapter.go @@ -109,14 +109,15 @@ func (v *viewAdapter) chooseClosestSample(samples metric.Values, timestamp time. } } -func (v *viewAdapter) GetValueAtTime(fingerprints clientmodel.Fingerprints, timestamp time.Time) (samples Vector, err error) { +func (v *viewAdapter) GetValueAtTime(fingerprints clientmodel.Fingerprints, timestamp time.Time) (Vector, error) { timer := v.stats.GetTimer(stats.GetValueAtTimeTime).Start() + samples := Vector{} for _, fingerprint := range fingerprints { sampleCandidates := v.view.GetValueAtTime(fingerprint, timestamp) samplePair := v.chooseClosestSample(sampleCandidates, timestamp) m, err := v.storage.GetMetricForFingerprint(fingerprint) if err != nil { - continue + return nil, err } if samplePair != nil { samples = append(samples, &clientmodel.Sample{ @@ -127,11 +128,12 @@ func (v *viewAdapter) GetValueAtTime(fingerprints clientmodel.Fingerprints, time } } timer.Stop() - return samples, err + return samples, nil } -func (v *viewAdapter) GetBoundaryValues(fingerprints clientmodel.Fingerprints, interval *metric.Interval) (sampleSets []metric.SampleSet, err error) { +func (v *viewAdapter) GetBoundaryValues(fingerprints clientmodel.Fingerprints, interval *metric.Interval) ([]metric.SampleSet, error) { timer := v.stats.GetTimer(stats.GetBoundaryValuesTime).Start() + sampleSets := []metric.SampleSet{} for _, fingerprint := range fingerprints { samplePairs := v.view.GetBoundaryValues(fingerprint, *interval) if len(samplePairs) == 0 { @@ -141,7 +143,7 @@ func (v *viewAdapter) GetBoundaryValues(fingerprints clientmodel.Fingerprints, i // TODO: memoize/cache this. m, err := v.storage.GetMetricForFingerprint(fingerprint) if err != nil { - continue + return nil, err } sampleSet := metric.SampleSet{ @@ -154,8 +156,9 @@ func (v *viewAdapter) GetBoundaryValues(fingerprints clientmodel.Fingerprints, i return sampleSets, nil } -func (v *viewAdapter) GetRangeValues(fingerprints clientmodel.Fingerprints, interval *metric.Interval) (sampleSets []metric.SampleSet, err error) { +func (v *viewAdapter) GetRangeValues(fingerprints clientmodel.Fingerprints, interval *metric.Interval) ([]metric.SampleSet, error) { timer := v.stats.GetTimer(stats.GetRangeValuesTime).Start() + sampleSets := []metric.SampleSet{} for _, fingerprint := range fingerprints { samplePairs := v.view.GetRangeValues(fingerprint, *interval) if len(samplePairs) == 0 { @@ -165,7 +168,7 @@ func (v *viewAdapter) GetRangeValues(fingerprints clientmodel.Fingerprints, inte // TODO: memoize/cache this. m, err := v.storage.GetMetricForFingerprint(fingerprint) if err != nil { - continue + return nil, err } sampleSet := metric.SampleSet{