@@ -60,6 +60,7 @@ type compressedReadWriter struct {
6060 logger * zap.Logger
6161 rwStatus rwStatus
6262 zstdLevel zstd.EncoderLevel
63+ header []byte
6364 sequence uint8
6465}
6566
@@ -70,6 +71,7 @@ func newCompressedReadWriter(rw packetReadWriter, algorithm CompressAlgorithm, z
7071 zstdLevel : zstd .EncoderLevelFromZstd (zstdLevel ),
7172 logger : logger ,
7273 rwStatus : rwNone ,
74+ header : make ([]byte , 7 ),
7375 }
7476}
7577
@@ -100,7 +102,7 @@ func (crw *compressedReadWriter) Read(p []byte) (n int, err error) {
100102 }
101103 n , err = crw .readBuffer .Read (p )
102104 // Trade off between memory and efficiency.
103- if n == len (p ) && crw .readBuffer .Len () == 0 && crw .readBuffer .Cap () > defaultReaderSize {
105+ if n == len (p ) && crw .readBuffer .Len () == 0 && crw .readBuffer .Cap () > DefaultConnBufferSize {
104106 crw .readBuffer = bytes.Buffer {}
105107 }
106108 return
@@ -110,18 +112,17 @@ func (crw *compressedReadWriter) Read(p []byte) (n int, err error) {
110112// The format of the protocol: https://dev.mysql.com/doc/dev/mysql-server/latest/page_protocol_basic_compression_packet.html
111113func (crw * compressedReadWriter ) readFromConn () error {
112114 var err error
113- var header [7 ]byte
114- if _ , err = io .ReadFull (crw .packetReadWriter , header [:]); err != nil {
115+ if err = ReadFull (crw .packetReadWriter , crw .header ); err != nil {
115116 return err
116117 }
117- compressedSequence := header [3 ]
118+ compressedSequence := crw . header [3 ]
118119 if compressedSequence != crw .sequence {
119120 return ErrInvalidSequence .GenWithStack (
120121 "invalid compressed sequence, expected %d, actual %d" , crw .sequence , compressedSequence )
121122 }
122123 crw .sequence ++
123- compressedLength := int (uint32 (header [0 ]) | uint32 (header [1 ])<< 8 | uint32 (header [2 ])<< 16 )
124- uncompressedLength := int (uint32 (header [4 ]) | uint32 (header [5 ])<< 8 | uint32 (header [6 ])<< 16 )
124+ compressedLength := int (uint32 (crw . header [0 ]) | uint32 (crw . header [1 ])<< 8 | uint32 (crw . header [2 ])<< 16 )
125+ uncompressedLength := int (uint32 (crw . header [4 ]) | uint32 (crw . header [5 ])<< 8 | uint32 (crw . header [6 ])<< 16 )
125126
126127 if uncompressedLength == 0 {
127128 // If the data is uncompressed, the uncompressed length is 0 and compressed length is the data length
@@ -134,7 +135,7 @@ func (crw *compressedReadWriter) readFromConn() error {
134135 // If the data is compressed, the compressed length is the length of data after the compressed header and
135136 // the uncompressed length is the length of data after decompression.
136137 data := make ([]byte , compressedLength )
137- if _ , err = io . ReadFull (crw .packetReadWriter , data ); err != nil {
138+ if err = ReadFull (crw .packetReadWriter , data ); err != nil {
138139 return err
139140 }
140141 if err = crw .uncompress (data , uncompressedLength ); err != nil {
@@ -173,7 +174,7 @@ func (crw *compressedReadWriter) Flush() error {
173174 return nil
174175 }
175176 // Trade off between memory and efficiency.
176- if crw .writeBuffer .Cap () > defaultWriterSize {
177+ if crw .writeBuffer .Cap () > DefaultConnBufferSize {
177178 crw .writeBuffer = bytes.Buffer {}
178179 } else {
179180 crw .writeBuffer .Reset ()
@@ -193,16 +194,15 @@ func (crw *compressedReadWriter) Flush() error {
193194 compressedLength = len (data )
194195 }
195196
196- var compressedHeader [7 ]byte
197- compressedHeader [0 ] = byte (compressedLength )
198- compressedHeader [1 ] = byte (compressedLength >> 8 )
199- compressedHeader [2 ] = byte (compressedLength >> 16 )
200- compressedHeader [3 ] = crw .sequence
201- compressedHeader [4 ] = byte (uncompressedLength )
202- compressedHeader [5 ] = byte (uncompressedLength >> 8 )
203- compressedHeader [6 ] = byte (uncompressedLength >> 16 )
197+ crw .header [0 ] = byte (compressedLength )
198+ crw .header [1 ] = byte (compressedLength >> 8 )
199+ crw .header [2 ] = byte (compressedLength >> 16 )
200+ crw .header [3 ] = crw .sequence
201+ crw .header [4 ] = byte (uncompressedLength )
202+ crw .header [5 ] = byte (uncompressedLength >> 8 )
203+ crw .header [6 ] = byte (uncompressedLength >> 16 )
204204 crw .sequence ++
205- if _ , err = crw .packetReadWriter .Write (compressedHeader [:]); err != nil {
205+ if _ , err = crw .packetReadWriter .Write (crw . header [:]); err != nil {
206206 return errors .WithStack (err )
207207 }
208208 if _ , err = crw .packetReadWriter .Write (data ); err != nil {
0 commit comments