Skip to content

Commit 2752abb

Browse files
committed
keyspan: add contexts to keyspan iterators
This change adds a `SetContext()` method to `FragmentIterator` which updates any context stored in an iterator and its children. The iterator context is now plumbed correctly through to the table range key iterators.
1 parent 54e5ba6 commit 2752abb

22 files changed

+170
-26
lines changed

compaction.go

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -807,9 +807,8 @@ func (c *compaction) newInputIters(
807807
}
808808
}
809809
if hasRangeKeys {
810-
li := &keyspanimpl.LevelIter{}
811-
newRangeKeyIterWrapper := func(file *manifest.FileMetadata, iterOptions keyspan.SpanIterOptions) (keyspan.FragmentIterator, error) {
812-
rangeKeyIter, err := newRangeKeyIter(file, iterOptions)
810+
newRangeKeyIterWrapper := func(ctx context.Context, file *manifest.FileMetadata, iterOptions keyspan.SpanIterOptions) (keyspan.FragmentIterator, error) {
811+
rangeKeyIter, err := newRangeKeyIter(ctx, file, iterOptions)
813812
if err != nil {
814813
return nil, err
815814
} else if rangeKeyIter == nil {
@@ -829,7 +828,10 @@ func (c *compaction) newInputIters(
829828
// in this sstable must wholly lie within the file's bounds.
830829
return noCloseIter, err
831830
}
832-
li.Init(keyspan.SpanIterOptions{}, c.cmp, newRangeKeyIterWrapper, level.files.Iter(), l, manifest.KeyTypeRange)
831+
li := keyspanimpl.NewLevelIter(
832+
context.Background(), keyspan.SpanIterOptions{}, c.cmp,
833+
newRangeKeyIterWrapper, level.files.Iter(), l, manifest.KeyTypeRange,
834+
)
833835
rangeKeyIters = append(rangeKeyIters, li)
834836
}
835837
return nil

error_iter.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,7 @@ func (i *errorKeyspanIter) First() (*keyspan.Span, error) { return ni
9090
func (i *errorKeyspanIter) Last() (*keyspan.Span, error) { return nil, i.err }
9191
func (i *errorKeyspanIter) Next() (*keyspan.Span, error) { return nil, i.err }
9292
func (i *errorKeyspanIter) Prev() (*keyspan.Span, error) { return nil, i.err }
93+
func (i *errorKeyspanIter) SetContext(ctx context.Context) {}
9394
func (i *errorKeyspanIter) Close() {}
9495
func (*errorKeyspanIter) String() string { return "error" }
9596
func (*errorKeyspanIter) WrapChildren(wrap keyspan.WrapFn) {}

flushable.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -233,9 +233,9 @@ func (s *ingestedFlushable) newFlushIter(*IterOptions) internalIterator {
233233
}
234234

235235
func (s *ingestedFlushable) constructRangeDelIter(
236-
file *manifest.FileMetadata, _ keyspan.SpanIterOptions,
236+
ctx context.Context, file *manifest.FileMetadata, _ keyspan.SpanIterOptions,
237237
) (keyspan.FragmentIterator, error) {
238-
iters, err := s.newIters(context.Background(), file, nil, internalIterOpts{}, iterRangeDeletions)
238+
iters, err := s.newIters(ctx, file, nil, internalIterOpts{}, iterRangeDeletions)
239239
if err != nil {
240240
return nil, err
241241
}
@@ -250,6 +250,7 @@ func (s *ingestedFlushable) constructRangeDelIter(
250250
// the point iterator in constructRangeDeIter is not tracked.
251251
func (s *ingestedFlushable) newRangeDelIter(_ *IterOptions) keyspan.FragmentIterator {
252252
return keyspanimpl.NewLevelIter(
253+
context.TODO(),
253254
keyspan.SpanIterOptions{}, s.comparer.Compare,
254255
s.constructRangeDelIter, s.slice.Iter(), manifest.Level(0),
255256
manifest.KeyTypePoint,
@@ -263,6 +264,7 @@ func (s *ingestedFlushable) newRangeKeyIter(o *IterOptions) keyspan.FragmentIter
263264
}
264265

265266
return keyspanimpl.NewLevelIter(
267+
context.TODO(),
266268
keyspan.SpanIterOptions{}, s.comparer.Compare, s.newRangeKeyIters,
267269
s.slice.Iter(), manifest.Level(0), manifest.KeyTypeRange,
268270
)

internal/keyspan/assert_iter.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
package keyspan
66

77
import (
8+
"context"
89
"fmt"
910

1011
"github.com/cockroachdb/errors"
@@ -165,6 +166,11 @@ func (i *assertIter) Prev() (*Span, error) {
165166
return span, err
166167
}
167168

169+
// SetContext is part of the FragmentIterator interface.
170+
func (i *assertIter) SetContext(ctx context.Context) {
171+
i.iter.SetContext(ctx)
172+
}
173+
168174
// Close implements FragmentIterator.
169175
func (i *assertIter) Close() {
170176
i.iter.Close()

internal/keyspan/bounded.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55
package keyspan
66

77
import (
8+
"context"
9+
810
"github.com/cockroachdb/pebble/internal/base"
911
"github.com/cockroachdb/pebble/internal/treeprinter"
1012
)
@@ -209,6 +211,11 @@ func (i *BoundedIter) Close() {
209211
i.iter.Close()
210212
}
211213

214+
// SetContext is part of the FragmentIterator interface.
215+
func (i *BoundedIter) SetContext(ctx context.Context) {
216+
i.iter.SetContext(ctx)
217+
}
218+
212219
// SetBounds modifies the FragmentIterator's bounds.
213220
func (i *BoundedIter) SetBounds(lower, upper []byte) {
214221
i.lower, i.upper = lower, upper

internal/keyspan/defragment.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ package keyspan
66

77
import (
88
"bytes"
9+
"context"
910

1011
"github.com/cockroachdb/pebble/internal/base"
1112
"github.com/cockroachdb/pebble/internal/bytealloc"
@@ -196,6 +197,11 @@ func (i *DefragmentingIter) Init(
196197
}
197198
}
198199

200+
// SetContext is part of the FragmentIterator interface.
201+
func (i *DefragmentingIter) SetContext(ctx context.Context) {
202+
i.iter.SetContext(ctx)
203+
}
204+
199205
// Close closes the underlying iterators.
200206
func (i *DefragmentingIter) Close() {
201207
i.iter.Close()

internal/keyspan/filter.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55
package keyspan
66

77
import (
8+
"context"
9+
810
"github.com/cockroachdb/pebble/internal/base"
911
"github.com/cockroachdb/pebble/internal/treeprinter"
1012
)
@@ -93,6 +95,11 @@ func (i *filteringIter) Prev() (*Span, error) {
9395
return i.filter(s, -1)
9496
}
9597

98+
// SetContext is part of the FragmentIterator interface.
99+
func (i *filteringIter) SetContext(ctx context.Context) {
100+
i.iter.SetContext(ctx)
101+
}
102+
96103
// Close implements FragmentIterator.
97104
func (i *filteringIter) Close() {
98105
i.iter.Close()

internal/keyspan/interleaving_iter.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1140,6 +1140,7 @@ func (i *InterleavingIter) SetBounds(lower, upper []byte) {
11401140
// SetContext implements (base.InternalIterator).SetContext.
11411141
func (i *InterleavingIter) SetContext(ctx context.Context) {
11421142
i.pointIter.SetContext(ctx)
1143+
i.keyspanIter.SetContext(ctx)
11431144
}
11441145

11451146
// DebugTree is part of the InternalIterator interface.

internal/keyspan/iter.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55
package keyspan
66

77
import (
8+
"context"
9+
810
"github.com/cockroachdb/pebble/internal/base"
911
"github.com/cockroachdb/pebble/internal/treeprinter"
1012
)
@@ -69,6 +71,10 @@ type FragmentIterator interface {
6971
// stack. Used only for debug logging.
7072
WrapChildren(wrap WrapFn)
7173

74+
// SetContext replaces the context provided at iterator creation, or the last
75+
// one provided by SetContext.
76+
SetContext(ctx context.Context)
77+
7278
base.IteratorDebug
7379
}
7480

@@ -211,6 +217,9 @@ func (i *Iter) Prev() (*Span, error) {
211217
return &i.spans[i.index], nil
212218
}
213219

220+
// SetContext is part of the FragmentIterator interface.
221+
func (i *Iter) SetContext(ctx context.Context) {}
222+
214223
// Close implements FragmentIterator.Close.
215224
func (i *Iter) Close() {}
216225

internal/keyspan/keyspanimpl/level_iter.go

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
package keyspanimpl
66

77
import (
8+
"context"
89
"fmt"
910

1011
"github.com/cockroachdb/pebble/internal/base"
@@ -17,7 +18,7 @@ import (
1718
// TableNewSpanIter creates a new iterator for range key spans for the given
1819
// file.
1920
type TableNewSpanIter func(
20-
file *manifest.FileMetadata, iterOptions keyspan.SpanIterOptions,
21+
ctx context.Context, file *manifest.FileMetadata, iterOptions keyspan.SpanIterOptions,
2122
) (keyspan.FragmentIterator, error)
2223

2324
// LevelIter provides a merged view of spans from sstables in an L1+ level or an
@@ -46,6 +47,8 @@ type LevelIter struct {
4647
// newIter creates a range del iterator if keyType is KeyTypePoint or a range
4748
// key iterator if keyType is KeyTypeRange.
4849
newIter TableNewSpanIter
50+
// ctx is passed to TableNewSpanIter.
51+
ctx context.Context
4952

5053
// The options that were passed in.
5154
tableOpts keyspan.SpanIterOptions
@@ -79,6 +82,7 @@ var _ keyspan.FragmentIterator = (*LevelIter)(nil)
7982
// newIter must create a range del iterator for the given file if keyType is
8083
// KeyTypePoint or a range key iterator if keyType is KeyTypeRange.
8184
func NewLevelIter(
85+
ctx context.Context,
8286
opts keyspan.SpanIterOptions,
8387
cmp base.Compare,
8488
newIter TableNewSpanIter,
@@ -87,7 +91,7 @@ func NewLevelIter(
8791
keyType manifest.KeyType,
8892
) *LevelIter {
8993
l := &LevelIter{}
90-
l.Init(opts, cmp, newIter, files, level, keyType)
94+
l.Init(ctx, opts, cmp, newIter, files, level, keyType)
9195
return l
9296
}
9397

@@ -96,6 +100,7 @@ func NewLevelIter(
96100
// newIter must create a range del iterator for the given file if keyType is
97101
// KeyTypePoint or a range key iterator if keyType is KeyTypeRange.
98102
func (l *LevelIter) Init(
103+
ctx context.Context,
99104
opts keyspan.SpanIterOptions,
100105
cmp base.Compare,
101106
newIter TableNewSpanIter,
@@ -111,6 +116,7 @@ func (l *LevelIter) Init(
111116
keyType: keyType,
112117
level: level,
113118
newIter: newIter,
119+
ctx: ctx,
114120
tableOpts: opts,
115121
files: files.Filter(keyType),
116122
}
@@ -387,6 +393,14 @@ func (l *LevelIter) moveToPrevFile() (*keyspan.Span, error) {
387393
}
388394
}
389395

396+
// SetContext is part of the FragmentIterator interface.
397+
func (l *LevelIter) SetContext(ctx context.Context) {
398+
l.ctx = ctx
399+
if l.lastIter != nil {
400+
l.lastIter.SetContext(ctx)
401+
}
402+
}
403+
390404
// Close implements keyspan.FragmentIterator.
391405
func (l *LevelIter) Close() {
392406
l.file = nil
@@ -442,7 +456,7 @@ func (l *LevelIter) setPosAtFile(f *manifest.FileMetadata) error {
442456
l.lastIter = nil
443457
l.lastIterFile = nil
444458
}
445-
iter, err := l.newIter(l.file, l.tableOpts)
459+
iter, err := l.newIter(l.ctx, l.file, l.tableOpts)
446460
if err != nil {
447461
return err
448462
}

0 commit comments

Comments
 (0)