@@ -770,7 +770,7 @@ type layoutWriter struct {
770
770
771
771
// options copied from WriterOptions
772
772
tableFormat TableFormat
773
- compression block.Compression
773
+ compressor block.Compressor
774
774
checksumType block.ChecksumType
775
775
776
776
// Attribute bitset of the sstable, derived from sstable Properties at the time
@@ -796,7 +796,7 @@ func makeLayoutWriter(w objstorage.Writable, opts WriterOptions) layoutWriter {
796
796
writable : w ,
797
797
cacheOpts : opts .internal .CacheOpts ,
798
798
tableFormat : opts .TableFormat ,
799
- compression : opts .Compression ,
799
+ compressor : block . MakeCompressor ( opts .Compression ) ,
800
800
checksumType : opts .Checksum ,
801
801
buf : blockBuf {
802
802
checksummer : block.Checksummer {Type : opts .Checksum },
@@ -815,13 +815,14 @@ func (w *layoutWriter) Abort() {
815
815
if w .writable != nil {
816
816
w .writable .Abort ()
817
817
w .writable = nil
818
+ w .compressor .Close ()
818
819
}
819
820
}
820
821
821
822
// WriteDataBlock constructs a trailer for the provided data block and writes
822
823
// the block and trailer to the writer. It returns the block's handle.
823
824
func (w * layoutWriter ) WriteDataBlock (b []byte , buf * blockBuf ) (block.Handle , error ) {
824
- return w .writeBlock (b , w . compression , buf )
825
+ return w .writeBlock (b , & w . compressor , buf )
825
826
}
826
827
827
828
// WritePrecompressedDataBlock writes a pre-compressed data block and its
@@ -836,7 +837,7 @@ func (w *layoutWriter) WritePrecompressedDataBlock(blk block.PhysicalBlock) (blo
836
837
// the last-written index block's handle and adds it to the file's meta index
837
838
// when the writer is finished.
838
839
func (w * layoutWriter ) WriteIndexBlock (b []byte ) (block.Handle , error ) {
839
- h , err := w .writeBlock (b , w . compression , & w .buf )
840
+ h , err := w .writeBlock (b , & w . compressor , & w .buf )
840
841
if err == nil {
841
842
w .lastIndexBlockHandle = h
842
843
}
@@ -851,42 +852,43 @@ func (w *layoutWriter) WriteFilterBlock(f filterWriter) (bh block.Handle, err er
851
852
if err != nil {
852
853
return block.Handle {}, err
853
854
}
854
- return w .writeNamedBlock (b , block .NoCompression , f .metaName ())
855
+ return w .writeNamedBlock (b , block .NoopCompressor , f .metaName ())
855
856
}
856
857
857
858
// WritePropertiesBlock constructs a trailer for the provided properties block
858
859
// and writes the block and trailer to the writer. It automatically adds the
859
860
// properties block to the file's meta index when the writer is finished.
860
861
func (w * layoutWriter ) WritePropertiesBlock (b []byte ) (block.Handle , error ) {
862
+ compressor := & w .compressor
861
863
// In v6 and earlier, we use a row oriented block with an infinite restart
862
864
// interval, which provides very good prefix compression. Since v7, we use the
863
865
// columnar format without prefix compression for this block; we enable block
864
866
// compression to compensate.
865
- if w .tableFormat >= TableFormatPebblev7 {
866
- return w . writeNamedBlock ( b , w . compression , metaPropertiesName )
867
+ if w .tableFormat < TableFormatPebblev7 {
868
+ compressor = block . NoopCompressor
867
869
}
868
- return w .writeNamedBlock (b , block . NoCompression , metaPropertiesName )
870
+ return w .writeNamedBlock (b , compressor , metaPropertiesName )
869
871
}
870
872
871
873
// WriteRangeKeyBlock constructs a trailer for the provided range key block and
872
874
// writes the block and trailer to the writer. It automatically adds the range
873
875
// key block to the file's meta index when the writer is finished.
874
876
func (w * layoutWriter ) WriteRangeKeyBlock (b []byte ) (block.Handle , error ) {
875
- return w .writeNamedBlock (b , block .NoCompression , metaRangeKeyName )
877
+ return w .writeNamedBlock (b , block .NoopCompressor , metaRangeKeyName )
876
878
}
877
879
878
880
// WriteRangeDeletionBlock constructs a trailer for the provided range deletion
879
881
// block and writes the block and trailer to the writer. It automatically adds
880
882
// the range deletion block to the file's meta index when the writer is
881
883
// finished.
882
884
func (w * layoutWriter ) WriteRangeDeletionBlock (b []byte ) (block.Handle , error ) {
883
- return w .writeNamedBlock (b , block .NoCompression , metaRangeDelV2Name )
885
+ return w .writeNamedBlock (b , block .NoopCompressor , metaRangeDelV2Name )
884
886
}
885
887
886
888
func (w * layoutWriter ) writeNamedBlock (
887
- b []byte , compression block.Compression , name string ,
889
+ b []byte , compressor * block.Compressor , name string ,
888
890
) (bh block.Handle , err error ) {
889
- bh , err = w .writeBlock (b , compression , & w .buf )
891
+ bh , err = w .writeBlock (b , compressor , & w .buf )
890
892
if err == nil {
891
893
w .recordToMetaindex (name , bh )
892
894
}
@@ -915,12 +917,9 @@ func (w *layoutWriter) WriteValueIndexBlock(
915
917
916
918
// writeBlock checksums, compresses, and writes out a block.
917
919
func (w * layoutWriter ) writeBlock (
918
- b []byte , compression block.Compression , buf * blockBuf ,
920
+ b []byte , compressor * block.Compressor , buf * blockBuf ,
919
921
) (block.Handle , error ) {
920
- // TODO(radu): store a compressor in the layoutWriter.
921
- compressor := block .MakeCompressor (compression )
922
- defer compressor .Close ()
923
- pb := block .CompressAndChecksum (& buf .dataBuf , b , & compressor , & buf .checksummer )
922
+ pb := block .CompressAndChecksum (& buf .dataBuf , b , compressor , & buf .checksummer )
924
923
h , err := w .writePrecompressedBlock (pb )
925
924
return h , err
926
925
}
@@ -1004,7 +1003,7 @@ func (w *layoutWriter) Finish() (size uint64, err error) {
1004
1003
}
1005
1004
b = bw .Finish ()
1006
1005
}
1007
- metaIndexHandle , err := w .writeBlock (b , block .NoCompression , & w .buf )
1006
+ metaIndexHandle , err := w .writeBlock (b , block .NoopCompressor , & w .buf )
1008
1007
if err != nil {
1009
1008
return 0 , err
1010
1009
}
@@ -1025,5 +1024,6 @@ func (w *layoutWriter) Finish() (size uint64, err error) {
1025
1024
1026
1025
err = w .writable .Finish ()
1027
1026
w .writable = nil
1027
+ w .compressor .Close ()
1028
1028
return w .offset , err
1029
1029
}
0 commit comments