Skip to content

Commit 043c379

Browse files
sumeerbholaRaduBerinde
authored andcommitted
crl-release-23.1: db: wrap error when creating Reader with backing filenum
Backport of #2633 Informs cockroachlabs/support#2643
1 parent 5e685e4 commit 043c379

File tree

2 files changed

+61
-1
lines changed

2 files changed

+61
-1
lines changed

table_cache.go

+3
Original file line numberDiff line numberDiff line change
@@ -937,6 +937,9 @@ func (v *tableCacheValue) load(meta *fileMetadata, c *tableCacheShard, dbOpts *t
937937
cacheOpts := private.SSTableCacheOpts(dbOpts.cacheID, meta.FileNum).(sstable.ReaderOption)
938938
v.reader, v.err = sstable.NewReader(f, dbOpts.opts, cacheOpts, dbOpts.filterMetrics)
939939
}
940+
if v.err != nil {
941+
v.err = errors.Wrapf(v.err, "pebble: backing file %s error", errors.Safe(meta.FileNum))
942+
}
940943
if v.err == nil {
941944
if meta.SmallestSeqNum == meta.LargestSeqNum {
942945
v.reader.Properties.GlobalSeqNum = meta.LargestSeqNum

table_cache_test.go

+58-1
Original file line numberDiff line numberDiff line change
@@ -794,9 +794,10 @@ func TestTableCacheRetryAfterFailure(t *testing.T) {
794794
require.NoError(t, err)
795795

796796
fs.setOpenError(true /* enabled */)
797-
if _, _, err := c.newIters(context.Background(), &fileMetadata{FileNum: 0}, nil, internalIterOpts{}); err == nil {
797+
if _, _, err = c.newIters(context.Background(), &fileMetadata{FileNum: 0}, nil, internalIterOpts{}); err == nil {
798798
t.Fatalf("expected failure, but found success")
799799
}
800+
require.Equal(t, "pebble: backing file 000000 error: injected error", err.Error())
800801
fs.setOpenError(false /* enabled */)
801802
var iter internalIterator
802803
iter, _, err = c.newIters(context.Background(), &fileMetadata{FileNum: 0}, nil, internalIterOpts{})
@@ -805,6 +806,62 @@ func TestTableCacheRetryAfterFailure(t *testing.T) {
805806
fs.validate(t, c, nil)
806807
}
807808

809+
// memFile is a file-like struct that buffers all data written to it in memory.
810+
// Implements the objstorage.Writable interface.
811+
type memFile struct {
812+
buf bytes.Buffer
813+
}
814+
815+
var _ objstorage.Writable = (*memFile)(nil)
816+
817+
// Finish is part of the objstorage.Writable interface.
818+
func (*memFile) Finish() error {
819+
return nil
820+
}
821+
822+
// Abort is part of the objstorage.Writable interface.
823+
func (*memFile) Abort() {}
824+
825+
// Write is part of the objstorage.Writable interface.
826+
func (f *memFile) Write(p []byte) error {
827+
_, err := f.buf.Write(p)
828+
return err
829+
}
830+
831+
func TestTableCacheErrorBadMagicNumber(t *testing.T) {
832+
var file memFile
833+
tw := sstable.NewWriter(&file, sstable.WriterOptions{TableFormat: sstable.TableFormatPebblev2})
834+
tw.Set([]byte("a"), nil)
835+
require.NoError(t, tw.Close())
836+
buf := file.buf.Bytes()
837+
// Bad magic number.
838+
buf[len(buf)-1] = 0
839+
fs := &tableCacheTestFS{
840+
FS: vfs.NewMem(),
841+
}
842+
const testFileNum = 3
843+
objProvider, err := objstorage.Open(objstorage.DefaultSettings(fs, ""))
844+
require.NoError(t, err)
845+
w, _, err := objProvider.Create(fileTypeTable, base.FileNum(testFileNum), objstorage.CreateOptions{})
846+
w.Write(buf)
847+
require.NoError(t, w.Finish())
848+
opts := &Options{}
849+
opts.EnsureDefaults()
850+
opts.Cache = NewCache(8 << 20) // 8 MB
851+
defer opts.Cache.Unref()
852+
c := newTableCacheContainer(nil, opts.Cache.NewID(), objProvider, opts, tableCacheTestCacheSize)
853+
require.NoError(t, err)
854+
defer c.close()
855+
856+
m := &fileMetadata{FileNum: testFileNum}
857+
if _, _, err = c.newIters(context.Background(), m, nil, internalIterOpts{}); err == nil {
858+
t.Fatalf("expected failure, but found success")
859+
}
860+
require.Equal(t,
861+
"pebble: backing file 000003 error: pebble/table: invalid table (bad magic number: 0xf09faab3f09faa00)",
862+
err.Error())
863+
}
864+
808865
func TestTableCacheEvictClose(t *testing.T) {
809866
errs := make(chan error, 10)
810867
db, err := Open("test",

0 commit comments

Comments
 (0)