@@ -44,7 +44,7 @@ type KeySchema struct {
44
44
// InitKeySeekerMetadata initializes the provided KeySeekerMetadata. This
45
45
// happens once when a block enters the block cache and can be used to save
46
46
// computation in NewKeySeeker.
47
- InitKeySeekerMetadata func (meta * KeySeekerMetadata , d * DataBlockDecoder )
47
+ InitKeySeekerMetadata func (meta * KeySeekerMetadata , d * DataBlockDecoder , bd * BlockDecoder )
48
48
49
49
// KeySeeker returns a KeySeeker using metadata that was previously
50
50
// initialized with InitKeySeekerMetadata. The returned key seeker can be an
@@ -215,10 +215,10 @@ func DefaultKeySchema(comparer *base.Comparer, prefixBundleSize int) KeySchema {
215
215
kw .suffixes .Init ()
216
216
return kw
217
217
},
218
- InitKeySeekerMetadata : func (meta * KeySeekerMetadata , d * DataBlockDecoder ) {
218
+ InitKeySeekerMetadata : func (meta * KeySeekerMetadata , d * DataBlockDecoder , bd * BlockDecoder ) {
219
219
ks := (* defaultKeySeeker )(unsafe .Pointer (& meta [0 ]))
220
220
ks .comparer = comparer
221
- ks .init (d )
221
+ ks .init (d , bd )
222
222
},
223
223
KeySeeker : func (meta * KeySeekerMetadata ) KeySeeker {
224
224
ks := (* defaultKeySeeker )(unsafe .Pointer (& meta [0 ]))
@@ -358,10 +358,10 @@ type defaultKeySeeker struct {
358
358
sharedPrefix []byte
359
359
}
360
360
361
- func (ks * defaultKeySeeker ) init (d * DataBlockDecoder ) {
361
+ func (ks * defaultKeySeeker ) init (d * DataBlockDecoder , bd * BlockDecoder ) {
362
362
ks .decoder = d
363
- ks .prefixes = d . d .PrefixBytes (defaultKeySchemaColumnPrefix )
364
- ks .suffixes = d . d .RawBytes (defaultKeySchemaColumnSuffix )
363
+ ks .prefixes = bd .PrefixBytes (defaultKeySchemaColumnPrefix )
364
+ ks .suffixes = bd .RawBytes (defaultKeySchemaColumnSuffix )
365
365
ks .sharedPrefix = ks .prefixes .SharedPrefix ()
366
366
}
367
367
@@ -498,7 +498,7 @@ const (
498
498
// grow key buffers while iterating over the block, ensuring that the key buffer
499
499
// is always sufficiently large.
500
500
// This is serialized immediately after the KeySchema specific header.
501
- const dataBlockCustomHeaderSize = 4
501
+ const DataBlockCustomHeaderSize = 4
502
502
503
503
// Init initializes the data block writer.
504
504
func (w * DataBlockEncoder ) Init (schema * KeySchema ) {
@@ -605,7 +605,7 @@ func (w *DataBlockEncoder) Rows() int {
605
605
606
606
// Size returns the size of the current pending data block.
607
607
func (w * DataBlockEncoder ) Size () int {
608
- off := HeaderSize (len (w .Schema .ColumnTypes )+ dataBlockColumnMax , dataBlockCustomHeaderSize + w .Schema .HeaderSize )
608
+ off := HeaderSize (len (w .Schema .ColumnTypes )+ dataBlockColumnMax , DataBlockCustomHeaderSize + w .Schema .HeaderSize )
609
609
off = w .KeyWriter .Size (w .rows , off )
610
610
off = w .trailers .Size (w .rows , off )
611
611
off = w .prefixSame .InvertedSize (w .rows , off )
@@ -646,12 +646,12 @@ func (w *DataBlockEncoder) Finish(rows, size int) (finished []byte, lastKey base
646
646
// to represent when the prefix changes.
647
647
w .prefixSame .Invert (rows )
648
648
649
- w .enc .Init (size , h , dataBlockCustomHeaderSize + w .Schema .HeaderSize )
649
+ w .enc .Init (size , h , DataBlockCustomHeaderSize + w .Schema .HeaderSize )
650
650
651
651
// Write the key schema custom header.
652
652
w .KeyWriter .FinishHeader (w .enc .Data ()[:w .Schema .HeaderSize ])
653
653
// Write the max key length in the data block custom header.
654
- binary .LittleEndian .PutUint32 (w .enc .Data ()[w .Schema .HeaderSize :w .Schema .HeaderSize + dataBlockCustomHeaderSize ], uint32 (w .maximumKeyLength ))
654
+ binary .LittleEndian .PutUint32 (w .enc .Data ()[w .Schema .HeaderSize :w .Schema .HeaderSize + DataBlockCustomHeaderSize ], uint32 (w .maximumKeyLength ))
655
655
w .enc .Encode (rows , w .KeyWriter )
656
656
w .enc .Encode (rows , & w .trailers )
657
657
w .enc .Encode (rows , & w .prefixSame )
@@ -744,12 +744,12 @@ func (rw *DataBlockRewriter) RewriteSuffixes(
744
744
// better spent dropping support for the physical rewriting of data blocks
745
745
// we're performing here and instead use a read-time IterTransform.
746
746
747
- rw .decoder .Init (rw .KeySchema , input )
747
+ bd := rw .decoder .Init (rw .KeySchema , input )
748
748
meta := & KeySeekerMetadata {}
749
- rw .KeySchema .InitKeySeekerMetadata (meta , & rw .decoder )
749
+ rw .KeySchema .InitKeySeekerMetadata (meta , & rw .decoder , bd )
750
750
rw .keySeeker = rw .KeySchema .KeySeeker (meta )
751
751
rw .encoder .Reset ()
752
- if err = rw .iter .Init (& rw .decoder , blockiter.Transforms {}); err != nil {
752
+ if err = rw .iter .Init (& rw .decoder , bd , blockiter.Transforms {}); err != nil {
753
753
return base.InternalKey {}, base.InternalKey {}, nil , err
754
754
}
755
755
@@ -786,7 +786,7 @@ func (rw *DataBlockRewriter) RewriteSuffixes(
786
786
k := base.InternalKey {UserKey : rw .keyBuf , Trailer : kv .K .Trailer }
787
787
rw .encoder .Add (k , value , valuePrefix , kcmp , rw .decoder .isObsolete .At (i ))
788
788
}
789
- rewritten , end = rw .encoder .Finish (int (rw . decoder . d .header .Rows ), rw .encoder .Size ())
789
+ rewritten , end = rw .encoder .Finish (int (bd .header .Rows ), rw .encoder .Size ())
790
790
end .UserKey , rw .keyAlloc = rw .keyAlloc .Copy (end .UserKey )
791
791
return start , end , rewritten , nil
792
792
}
@@ -814,8 +814,8 @@ func InitDataBlockMetadata(schema *KeySchema, md *block.Metadata, data []byte) (
814
814
err = base .CorruptionErrorf ("error initializing data block metadata: %v" , r )
815
815
}
816
816
}()
817
- metadatas .d .Init (schema , data )
818
- schema .InitKeySeekerMetadata (& metadatas .keySchemaMeta , & metadatas .d )
817
+ bd := metadatas .d .Init (schema , data )
818
+ schema .InitKeySeekerMetadata (& metadatas .keySchemaMeta , & metadatas .d , bd )
819
819
return nil
820
820
}
821
821
@@ -885,38 +885,31 @@ type DataBlockDecoder struct {
885
885
maximumKeyLength uint32
886
886
}
887
887
888
- // BlockDecoder returns a pointer to the underlying BlockDecoder.
889
- func (d * DataBlockDecoder ) BlockDecoder () * BlockDecoder {
890
- return & d .d
891
- }
892
-
893
888
// PrefixChanged returns the prefix-changed bitmap.
894
889
func (d * DataBlockDecoder ) PrefixChanged () Bitmap {
895
890
return d .prefixChanged
896
891
}
897
892
898
- // KeySchemaHeader returns the KeySchema-specific header.
899
- func (d * DataBlockDecoder ) KeySchemaHeader () []byte {
900
- return d .d .data [:d .d .customHeaderSize - dataBlockCustomHeaderSize ]
901
- }
902
-
903
893
// Init initializes the data block reader with the given serialized data block.
904
- func (d * DataBlockDecoder ) Init (schema * KeySchema , data []byte ) {
894
+ func (d * DataBlockDecoder ) Init (schema * KeySchema , data []byte ) * BlockDecoder {
905
895
if uintptr (unsafe .Pointer (unsafe .SliceData (data )))& 7 != 0 {
906
896
panic ("data buffer not 8-byte aligned" )
907
897
}
908
- d .d .Init (data , dataBlockCustomHeaderSize + schema .HeaderSize )
909
- d .trailers = d .d .Uints (len (schema .ColumnTypes ) + dataBlockColumnTrailer )
910
- d .prefixChanged = d .d .Bitmap (len (schema .ColumnTypes ) + dataBlockColumnPrefixChanged )
911
- d .values = d .d .RawBytes (len (schema .ColumnTypes ) + dataBlockColumnValue )
912
- d .isValueExternal = d .d .Bitmap (len (schema .ColumnTypes ) + dataBlockColumnIsValueExternal )
913
- d .isObsolete = d .d .Bitmap (len (schema .ColumnTypes ) + dataBlockColumnIsObsolete )
898
+ bd := BlockDecoder {}
899
+ bd .Init (data , DataBlockCustomHeaderSize + schema .HeaderSize )
900
+ d .d = bd
901
+ d .trailers = bd .Uints (len (schema .ColumnTypes ) + dataBlockColumnTrailer )
902
+ d .prefixChanged = bd .Bitmap (len (schema .ColumnTypes ) + dataBlockColumnPrefixChanged )
903
+ d .values = bd .RawBytes (len (schema .ColumnTypes ) + dataBlockColumnValue )
904
+ d .isValueExternal = bd .Bitmap (len (schema .ColumnTypes ) + dataBlockColumnIsValueExternal )
905
+ d .isObsolete = bd .Bitmap (len (schema .ColumnTypes ) + dataBlockColumnIsObsolete )
914
906
d .maximumKeyLength = binary .LittleEndian .Uint32 (data [schema .HeaderSize :])
907
+ return & bd
915
908
}
916
909
917
910
// Describe descirbes the binary format of the data block, assuming f.Offset()
918
911
// is positioned at the beginning of the same data block described by d.
919
- func (d * DataBlockDecoder ) Describe (f * binfmt.Formatter , tp treeprinter.Node ) {
912
+ func (d * DataBlockDecoder ) Describe (f * binfmt.Formatter , tp treeprinter.Node , bd * BlockDecoder ) {
920
913
// Set the relative offset. When loaded into memory, the beginning of blocks
921
914
// are aligned. Padding that ensures alignment is done relative to the
922
915
// current offset. Setting the relative offset ensures that if we're
@@ -926,13 +919,13 @@ func (d *DataBlockDecoder) Describe(f *binfmt.Formatter, tp treeprinter.Node) {
926
919
f .SetAnchorOffset ()
927
920
928
921
n := tp .Child ("data block header" )
929
- if keySchemaHeaderSize := int (d . d . customHeaderSize - 4 ); keySchemaHeaderSize > 0 {
922
+ if keySchemaHeaderSize := int (bd . customHeaderSize - DataBlockCustomHeaderSize ); keySchemaHeaderSize > 0 {
930
923
f .HexBytesln (keySchemaHeaderSize , "key schema header" )
931
924
}
932
925
f .HexBytesln (4 , "maximum key length: %d" , d .maximumKeyLength )
933
- d . d .HeaderToBinFormatter (f , n )
934
- for i := 0 ; i < int (d . d .header .Columns ); i ++ {
935
- d . d . ColumnToBinFormatter (f , n , i , int (d . d .header .Rows ))
926
+ bd .HeaderToBinFormatter (f , n )
927
+ for i := 0 ; i < int (bd .header .Columns ); i ++ {
928
+ bd . ColumnToBinFormatter (f , n , i , int (bd .header .Rows ))
936
929
}
937
930
f .HexBytesln (1 , "block padding byte" )
938
931
f .ToTreePrinter (n )
@@ -953,9 +946,9 @@ type DataBlockValidator struct {
953
946
func (v * DataBlockValidator ) Validate (
954
947
data []byte , comparer * base.Comparer , keySchema * KeySchema ,
955
948
) error {
956
- v .dec .Init (keySchema , data )
957
- n := v . dec . d .header .Rows
958
- keySchema .InitKeySeekerMetadata (& v .keySeekerMeta , & v .dec )
949
+ bd := v .dec .Init (keySchema , data )
950
+ n := bd .header .Rows
951
+ keySchema .InitKeySeekerMetadata (& v .keySeekerMeta , & v .dec , bd )
959
952
keySeeker := keySchema .KeySeeker (& v .keySeekerMeta )
960
953
961
954
if cap (v .prevUserKeyBuf ) < int (v .dec .maximumKeyLength )+ 1 {
@@ -1057,10 +1050,12 @@ func (i *DataBlockIter) InitOnce(
1057
1050
1058
1051
// Init initializes the data block iterator, configuring it to read from the
1059
1052
// provided decoder.
1060
- func (i * DataBlockIter ) Init (d * DataBlockDecoder , transforms blockiter.Transforms ) error {
1053
+ func (i * DataBlockIter ) Init (
1054
+ d * DataBlockDecoder , bd * BlockDecoder , transforms blockiter.Transforms ,
1055
+ ) error {
1061
1056
i .d = d
1062
1057
// Leave i.h unchanged.
1063
- numRows := int (d . d .header .Rows )
1058
+ numRows := int (bd .header .Rows )
1064
1059
i .maxRow = numRows - 1
1065
1060
i .transforms = transforms
1066
1061
if i .transforms .HideObsoletePoints && d .isObsolete .SeekSetBitGE (0 ) == numRows {
@@ -1071,7 +1066,7 @@ func (i *DataBlockIter) Init(d *DataBlockDecoder, transforms blockiter.Transform
1071
1066
1072
1067
// TODO(radu): see if this allocation can be a problem for the suffix rewriter.
1073
1068
meta := & KeySeekerMetadata {}
1074
- i .keySchema .InitKeySeekerMetadata (meta , d )
1069
+ i .keySchema .InitKeySeekerMetadata (meta , d , bd )
1075
1070
i .keySeeker = i .keySchema .KeySeeker (meta )
1076
1071
1077
1072
// The worst case is when the largest key in the block has no suffix.
0 commit comments