Skip to content

Commit

Permalink
Improve the way we reverse iterator for backward queries. (#2793)
Browse files Browse the repository at this point in the history
Instead of reversing all blocks, we reverse one block at the time.

Signed-off-by: Cyril Tovena <cyril.tovena@gmail.com>
  • Loading branch information
cyriltovena authored Oct 23, 2020
1 parent 7b7b184 commit edc6215
Show file tree
Hide file tree
Showing 2 changed files with 42 additions and 17 deletions.
29 changes: 21 additions & 8 deletions pkg/chunkenc/memchunk.go
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down
30 changes: 21 additions & 9 deletions pkg/storage/lazy_chunk.go
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down

0 comments on commit edc6215

Please sign in to comment.