Skip to content

Commit fb50dd2

Browse files
committed
db: propagate errors from scanInternalIterator close
Fix scanInternalIterator to no longer swallow errors on Close.
1 parent 8026c97 commit fb50dd2

File tree

3 files changed

+20
-18
lines changed

3 files changed

+20
-18
lines changed

db.go

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2696,8 +2696,7 @@ type ScanStatisticsOptions struct {
26962696
// key span [lower, upper) as well as the number of snapshot keys.
26972697
func (d *DB) ScanStatistics(
26982698
ctx context.Context, lower, upper []byte, opts ScanStatisticsOptions,
2699-
) (LSMKeyStatistics, error) {
2700-
stats := LSMKeyStatistics{}
2699+
) (stats LSMKeyStatistics, err error) {
27012700
var prevKey InternalKey
27022701
var rateLimitFunc func(key *InternalKey, val LazyValue) error
27032702
tb := tokenbucket.TokenBucket{}
@@ -2767,14 +2766,12 @@ func (d *DB) ScanStatistics(
27672766
if err != nil {
27682767
return LSMKeyStatistics{}, err
27692768
}
2770-
defer iter.close()
2769+
defer func() { err = errors.CombineErrors(err, iter.Close()) }()
27712770

27722771
err = scanInternalImpl(ctx, iter, scanInternalOpts)
2773-
27742772
if err != nil {
27752773
return LSMKeyStatistics{}, err
27762774
}
2777-
27782775
return stats, nil
27792776
}
27802777

scan_internal.go

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -130,12 +130,13 @@ func (s *SharedSSTMeta) cloneFromFileMeta(f *manifest.TableMetadata) {
130130
// creator ID was set (as creator IDs are necessary to enable shared storage)
131131
// resulting in some lower level SSTs being on non-shared storage. Skip-shared
132132
// iteration is invalid in those cases.
133-
func (d *DB) ScanInternal(ctx context.Context, opts ScanInternalOptions) error {
134-
iter, err := d.newInternalIter(ctx, snapshotIterOpts{} /* snapshot */, &opts)
133+
func (d *DB) ScanInternal(ctx context.Context, opts ScanInternalOptions) (err error) {
134+
var iter *scanInternalIterator
135+
iter, err = d.newInternalIter(ctx, snapshotIterOpts{} /* snapshot */, &opts)
135136
if err != nil {
136137
return err
137138
}
138-
defer iter.close()
139+
defer func() { err = errors.CombineErrors(err, iter.Close()) }()
139140
return scanInternalImpl(ctx, iter, &opts)
140141
}
141142

@@ -1277,10 +1278,10 @@ func (i *scanInternalIterator) error() error {
12771278
return i.iter.Error()
12781279
}
12791280

1280-
// close closes this iterator, and releases any pooled objects.
1281-
func (i *scanInternalIterator) close() {
1282-
_ = i.iter.Close()
1283-
_ = i.blobValueFetcher.Close()
1281+
// Close closes this iterator, and releases any pooled objects.
1282+
func (i *scanInternalIterator) Close() error {
1283+
err := i.iter.Close()
1284+
err = errors.CombineErrors(err, i.blobValueFetcher.Close())
12841285
if i.readState != nil {
12851286
i.readState.unref()
12861287
}
@@ -1311,6 +1312,7 @@ func (i *scanInternalIterator) close() {
13111312
iterAllocPool.Put(alloc)
13121313
i.alloc = nil
13131314
}
1315+
return err
13141316
}
13151317

13161318
func (i *scanInternalIterator) initializeBoundBufs(lower, upper []byte) {

snapshot.go

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import (
1111
"sync"
1212
"time"
1313

14+
"github.com/cockroachdb/errors"
1415
"github.com/cockroachdb/pebble/internal/base"
1516
"github.com/cockroachdb/pebble/internal/invariants"
1617
"github.com/cockroachdb/pebble/internal/manifest"
@@ -72,15 +73,16 @@ func (s *Snapshot) NewIterWithContext(ctx context.Context, o *IterOptions) (*Ite
7273
//
7374
// See comment on db.ScanInternal for the behaviour that can be expected of
7475
// point keys deleted by range dels and keys masked by range keys.
75-
func (s *Snapshot) ScanInternal(ctx context.Context, opts ScanInternalOptions) error {
76+
func (s *Snapshot) ScanInternal(ctx context.Context, opts ScanInternalOptions) (err error) {
7677
if s.db == nil {
7778
panic(ErrClosed)
7879
}
79-
iter, err := s.db.newInternalIter(ctx, snapshotIterOpts{seqNum: s.seqNum}, &opts)
80+
var iter *scanInternalIterator
81+
iter, err = s.db.newInternalIter(ctx, snapshotIterOpts{seqNum: s.seqNum}, &opts)
8082
if err != nil {
8183
return err
8284
}
83-
defer iter.close()
85+
defer func() { err = errors.CombineErrors(err, iter.Close()) }()
8486
return scanInternalImpl(ctx, iter, &opts)
8587
}
8688

@@ -449,7 +451,7 @@ func (es *EventuallyFileOnlySnapshot) NewIterWithContext(
449451
// point keys deleted by range dels and keys masked by range keys.
450452
func (es *EventuallyFileOnlySnapshot) ScanInternal(
451453
ctx context.Context, opts ScanInternalOptions,
452-
) error {
454+
) (err error) {
453455
if es.db == nil {
454456
panic(ErrClosed)
455457
}
@@ -467,10 +469,11 @@ func (es *EventuallyFileOnlySnapshot) ScanInternal(
467469
}
468470
}
469471
es.mu.Unlock()
470-
iter, err := es.db.newInternalIter(ctx, sOpts, &opts)
472+
var iter *scanInternalIterator
473+
iter, err = es.db.newInternalIter(ctx, sOpts, &opts)
471474
if err != nil {
472475
return err
473476
}
474-
defer iter.close()
477+
defer func() { err = errors.CombineErrors(err, iter.Close()) }()
475478
return scanInternalImpl(ctx, iter, &opts)
476479
}

0 commit comments

Comments
 (0)