@@ -794,9 +794,10 @@ func TestTableCacheRetryAfterFailure(t *testing.T) {
794
794
require .NoError (t , err )
795
795
796
796
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 {
798
798
t .Fatalf ("expected failure, but found success" )
799
799
}
800
+ require .Equal (t , "pebble: backing file 000000 error: injected error" , err .Error ())
800
801
fs .setOpenError (false /* enabled */ )
801
802
var iter internalIterator
802
803
iter , _ , err = c .newIters (context .Background (), & fileMetadata {FileNum : 0 }, nil , internalIterOpts {})
@@ -805,6 +806,62 @@ func TestTableCacheRetryAfterFailure(t *testing.T) {
805
806
fs .validate (t , c , nil )
806
807
}
807
808
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
+
808
865
func TestTableCacheEvictClose (t * testing.T ) {
809
866
errs := make (chan error , 10 )
810
867
db , err := Open ("test" ,
0 commit comments