Skip to content

Commit

Permalink
Merge pull request #549 from grafana/charleskorn/concatenatingchunkit…
Browse files Browse the repository at this point in the history
…erator

Fix issue where `concatenatingChunkIterator` can obscure errors.
  • Loading branch information
charleskorn authored Oct 24, 2023
2 parents debd4b1 + 4a1fb3b commit b01b1b7
Show file tree
Hide file tree
Showing 2 changed files with 62 additions and 0 deletions.
3 changes: 3 additions & 0 deletions storage/merge.go
Original file line number Diff line number Diff line change
Expand Up @@ -893,6 +893,9 @@ func (c *concatenatingChunkIterator) Next() bool {
c.curr = c.iterators[c.idx].At()
return true
}
if c.iterators[c.idx].Err() != nil {
return false
}
c.idx++
return c.Next()
}
Expand Down
59 changes: 59 additions & 0 deletions storage/merge_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -868,6 +868,65 @@ func TestConcatenatingChunkSeriesMerger(t *testing.T) {
}
}

func TestConcatenatingChunkIterator(t *testing.T) {
chunk1, err := chunks.ChunkFromSamples([]chunks.Sample{fSample{t: 1, f: 10}})
require.NoError(t, err)
chunk2, err := chunks.ChunkFromSamples([]chunks.Sample{fSample{t: 2, f: 20}})
require.NoError(t, err)
chunk3, err := chunks.ChunkFromSamples([]chunks.Sample{fSample{t: 3, f: 30}})
require.NoError(t, err)

testError := errors.New("something went wrong")

testCases := map[string]struct {
iterators []chunks.Iterator
expectedChunks []chunks.Meta
expectedError error
}{
"many successful iterators": {
iterators: []chunks.Iterator{
NewListChunkSeriesIterator(chunk1, chunk2),
NewListChunkSeriesIterator(chunk3),
},
expectedChunks: []chunks.Meta{chunk1, chunk2, chunk3},
},
"single failing iterator": {
iterators: []chunks.Iterator{
errChunksIterator{err: testError},
},
expectedError: testError,
},
"some failing and some successful iterators": {
iterators: []chunks.Iterator{
NewListChunkSeriesIterator(chunk1, chunk2),
errChunksIterator{err: testError},
NewListChunkSeriesIterator(chunk3),
},
expectedChunks: []chunks.Meta{chunk1, chunk2}, // Should stop before advancing to last iterator.
expectedError: testError,
},
}

for name, testCase := range testCases {
t.Run(name, func(t *testing.T) {
it := concatenatingChunkIterator{iterators: testCase.iterators}
var chks []chunks.Meta

for it.Next() {
chks = append(chks, it.At())
}

require.Equal(t, testCase.expectedChunks, chks)

if testCase.expectedError == nil {
require.NoError(t, it.Err())
} else {
require.EqualError(t, it.Err(), testCase.expectedError.Error())
}
})
}
}

type mockQuerier struct {
LabelQuerier

Expand Down

0 comments on commit b01b1b7

Please sign in to comment.