55package keyspanimpl
66
77import (
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.
1920type 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.
8184func 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.
98102func (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.
391405func (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