diff --git a/pkg/chunkenc/memchunk.go b/pkg/chunkenc/memchunk.go index 5e47eb3a1856..f6c5f793a684 100644 --- a/pkg/chunkenc/memchunk.go +++ b/pkg/chunkenc/memchunk.go @@ -481,17 +481,30 @@ func (c *MemChunk) Iterator(ctx context.Context, mintT, maxtT time.Time, directi its = append(its, c.head.iterator(ctx, direction, mint, maxt, lbs, pipeline)) } - iterForward := iter.NewTimeRangedIterator( - iter.NewNonOverlappingIterator(its, ""), - time.Unix(0, mint), - time.Unix(0, maxt), - ) - if direction == logproto.FORWARD { - return iterForward, nil + return iter.NewTimeRangedIterator( + iter.NewNonOverlappingIterator(its, ""), + time.Unix(0, mint), + time.Unix(0, maxt), + ), nil + } + for i, it := range its { + r, err := iter.NewEntryReversedIter( + iter.NewTimeRangedIterator(it, + time.Unix(0, mint), + time.Unix(0, maxt), + )) + if err != nil { + return nil, err + } + its[i] = r + } + + for i, j := 0, len(its)-1; i < j; i, j = i+1, j-1 { + its[i], its[j] = its[j], its[i] } - return iter.NewEntryReversedIter(iterForward) + return iter.NewNonOverlappingIterator(its, ""), nil } // Iterator implements Chunk. diff --git a/pkg/storage/lazy_chunk.go b/pkg/storage/lazy_chunk.go index 006574302c4c..f868ed568433 100644 --- a/pkg/storage/lazy_chunk.go +++ b/pkg/storage/lazy_chunk.go @@ -74,18 +74,30 @@ func (c *LazyChunk) Iterator( its = append(its, b.Iterator(ctx, dropLabels(c.Chunk.Metric, labels.MetricName), pipeline)) } - // build the final iterator bound to the requested time range. - iterForward := iter.NewTimeRangedIterator( - iter.NewNonOverlappingIterator(its, ""), - from, - through, - ) - if direction == logproto.FORWARD { - return iterForward, nil + return iter.NewTimeRangedIterator( + iter.NewNonOverlappingIterator(its, ""), + from, + through, + ), nil + } + for i, it := range its { + r, err := iter.NewEntryReversedIter( + iter.NewTimeRangedIterator(it, + from, + through, + )) + if err != nil { + return nil, err + } + its[i] = r + } + + for i, j := 0, len(its)-1; i < j; i, j = i+1, j-1 { + its[i], its[j] = its[j], its[i] } - return iter.NewEntryReversedIter(iterForward) + return iter.NewNonOverlappingIterator(its, ""), nil } // SampleIterator returns an sample iterator.