MCPcopy
hub / github.com/grafana/tempo / Next

Method Next

tempodb/encoding/vparquet4/multiblock_iterator.go:34–91  ·  view source on GitHub ↗
(ctx context.Context)

Source from the content-addressed store, hash-verified

32}
33
34func (m *MultiBlockIterator[T]) Next(ctx context.Context) (common.ID, T, error) {
35 if m.done(ctx) {
36 return nil, nil, io.EOF
37 }
38
39 var (
40 lowestID common.ID
41 lowestBookmarks []*bookmark[T]
42 )
43
44 // find lowest ID of the new object
45 for _, b := range m.bookmarks {
46 id, err := b.peekID(ctx)
47 if err != nil && !errors.Is(err, io.EOF) {
48 return nil, nil, err
49 }
50 if id == nil {
51 continue
52 }
53
54 comparison := bytes.Compare(id, lowestID)
55
56 if comparison == 0 {
57 lowestBookmarks = append(lowestBookmarks, b)
58 } else if len(lowestID) == 0 || comparison == -1 {
59 lowestID = id
60
61 // reset and reuse
62 lowestBookmarks = lowestBookmarks[:0]
63 lowestBookmarks = append(lowestBookmarks, b)
64 }
65 }
66
67 // now get the lowest objects from our bookmarks
68 lowestObjects := make([]T, 0, len(lowestBookmarks))
69 for _, b := range lowestBookmarks {
70 _, obj, err := b.current(ctx)
71 if err != nil && !errors.Is(err, io.EOF) {
72 return nil, nil, err
73 }
74 if obj == nil {
75 // this should never happen. id was non-nil above
76 return nil, nil, errors.New("unexpected nil object from lowest bookmark")
77 }
78 lowestObjects = append(lowestObjects, obj)
79 }
80
81 lowestObject, err := m.combine(lowestObjects)
82 if err != nil {
83 return nil, nil, fmt.Errorf("combining: %w", err)
84 }
85
86 for _, b := range lowestBookmarks {
87 b.clear()
88 }
89
90 return lowestID, lowestObject, nil
91}

Callers

nothing calls this directly

Calls 5

doneMethod · 0.95
peekIDMethod · 0.45
CompareMethod · 0.45
currentMethod · 0.45
clearMethod · 0.45

Tested by

no test coverage detected