Skip to content

Commit 0b8340f

Browse files
authored
fix nil pointer in merge iter Err() (#47)
2 parents 36d6109 + 9dfc2f2 commit 0b8340f

File tree

2 files changed

+22
-6
lines changed

2 files changed

+22
-6
lines changed

pkg/dedup/merge_iter.go

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -92,18 +92,23 @@ func (m *mergedSeriesIterator) At() (t int64, v float64) {
9292
return m.lastIter.At()
9393
}
9494

95-
func (it *mergedSeriesIterator) AtHistogram(h *histogram.Histogram) (int64, *histogram.Histogram) {
96-
return it.lastIter.AtHistogram(h)
95+
func (m *mergedSeriesIterator) AtHistogram(h *histogram.Histogram) (int64, *histogram.Histogram) {
96+
return m.lastIter.AtHistogram(h)
9797
}
9898

99-
func (it *mergedSeriesIterator) AtFloatHistogram(fh *histogram.FloatHistogram) (int64, *histogram.FloatHistogram) {
100-
return it.lastIter.AtFloatHistogram(fh)
99+
func (m *mergedSeriesIterator) AtFloatHistogram(fh *histogram.FloatHistogram) (int64, *histogram.FloatHistogram) {
100+
return m.lastIter.AtFloatHistogram(fh)
101101
}
102102

103-
func (it *mergedSeriesIterator) AtT() int64 {
104-
return it.lastT
103+
func (m *mergedSeriesIterator) AtT() int64 {
104+
return m.lastT
105105
}
106106

107+
// Err All At() funcs should panic if called after Next() or Seek() return ValNone.
108+
// Only Err() should return nil even after Next() or Seek() return ValNone.
107109
func (m *mergedSeriesIterator) Err() error {
110+
if m.lastIter == nil {
111+
return nil
112+
}
108113
return m.lastIter.Err()
109114
}

pkg/dedup/merge_iter_test.go

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,24 @@
44
package dedup
55

66
import (
7+
"math"
78
"testing"
89

910
"github.com/efficientgo/core/testutil"
1011
"github.com/prometheus/prometheus/model/labels"
1112
"github.com/prometheus/prometheus/storage"
13+
"github.com/prometheus/prometheus/tsdb/chunkenc"
1214
)
1315

16+
func TestIteratorEdgeCases(t *testing.T) {
17+
ms := NewMergedSeries(labels.Labels{}, []storage.Series{})
18+
it := ms.Iterator(nil)
19+
testutil.Ok(t, it.Err())
20+
testutil.Equals(t, int64(math.MinInt64), it.AtT())
21+
testutil.Equals(t, chunkenc.ValNone, it.Next())
22+
testutil.Ok(t, it.Err())
23+
}
24+
1425
func TestMergedSeriesIterator(t *testing.T) {
1526
for _, tcase := range []struct {
1627
name string

0 commit comments

Comments
 (0)