From e0dbc8c5612a4994fc10d16632641e2650a245e8 Mon Sep 17 00:00:00 2001 From: Julius Volz Date: Sat, 16 Mar 2013 01:29:21 -0700 Subject: [PATCH] Fix edge cases in data extraction for point and interval ops. --- storage/metric/operation.go | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/storage/metric/operation.go b/storage/metric/operation.go index 9abb3796a..ef7ea2dbe 100644 --- a/storage/metric/operation.go +++ b/storage/metric/operation.go @@ -104,13 +104,23 @@ func extractValuesAroundTime(t time.Time, in []model.SamplePair) (out []model.Sa i := sort.Search(len(in), func(i int) bool { return !in[i].Timestamp.Before(t) }) - switch i { - case len(in): + if i == len(in) { + // Target time is past the end, return only the last sample. out = in[len(in)-1:] - case 0: - out = append(out, in[0:1]...) - default: - out = append(out, in[i-1:i+1]...) + } else { + if in[i].Timestamp.Equal(t) && len(in) > i+1 { + // We hit exactly the current sample time. Very unlikely in practice. + // Return only the current sample. + out = append(out, in[i]) + } else { + if i == 0 { + // We hit before the first sample time. Return only the first sample. + out = append(out, in[0:1]...) + } else { + // We hit between two samples. Return both surrounding samples. + out = append(out, in[i-1:i+1]...) + } + } } return }