@@ -21,6 +21,8 @@ type messageSetReader struct {
21
21
//
22
22
// This is used to detect truncation of the response.
23
23
lengthRemain int
24
+
25
+ decompressed bytes.Buffer
24
26
}
25
27
26
28
type readerStack struct {
@@ -162,14 +164,15 @@ func (r *messageSetReader) readMessageV1(min int64, key readBytesFunc, val readB
162
164
if err = r .discardN (4 ); err != nil {
163
165
return
164
166
}
167
+
165
168
// read and decompress the contained message set.
166
- var decompressed bytes. Buffer
167
- if err = r .readBytesWith (func (r * bufio.Reader , sz int , n int ) (remain int , err error ) {
169
+ r . decompressed . Reset ()
170
+ if err = r .readBytesWith (func (br * bufio.Reader , sz int , n int ) (remain int , err error ) {
168
171
// x4 as a guess that the average compression ratio is near 75%
169
- decompressed .Grow (4 * n )
170
- limitReader := io.LimitedReader {R : r , N : int64 (n )}
172
+ r . decompressed .Grow (4 * n )
173
+ limitReader := io.LimitedReader {R : br , N : int64 (n )}
171
174
codecReader := codec .NewReader (& limitReader )
172
- _ , err = decompressed .ReadFrom (codecReader )
175
+ _ , err = r . decompressed .ReadFrom (codecReader )
173
176
remain = sz - (n - int (limitReader .N ))
174
177
codecReader .Close ()
175
178
return
@@ -184,7 +187,7 @@ func (r *messageSetReader) readMessageV1(min int64, key readBytesFunc, val readB
184
187
// messages at offsets 10-13, then the container message will have
185
188
// offset 13 and the contained messages will be 0,1,2,3. the base
186
189
// offset for the container, then is 13-3=10.
187
- if offset , err = extractOffset (offset , decompressed .Bytes ()); err != nil {
190
+ if offset , err = extractOffset (offset , r . decompressed .Bytes ()); err != nil {
188
191
return
189
192
}
190
193
@@ -196,8 +199,8 @@ func (r *messageSetReader) readMessageV1(min int64, key readBytesFunc, val readB
196
199
// Allocate a buffer of size 0, which gets capped at 16 bytes
197
200
// by the bufio package. We are already reading buffered data
198
201
// here, no need to reserve another 4KB buffer.
199
- reader : bufio .NewReaderSize (& decompressed , 0 ),
200
- remain : decompressed .Len (),
202
+ reader : bufio .NewReaderSize (& r . decompressed , 0 ),
203
+ remain : r . decompressed .Len (),
201
204
base : offset ,
202
205
parent : r .readerStack ,
203
206
}
@@ -263,19 +266,20 @@ func (r *messageSetReader) readMessageV2(_ int64, key readBytesFunc, val readByt
263
266
err = fmt .Errorf ("batch remain < 0 (%d)" , batchRemain )
264
267
return
265
268
}
266
- var decompressed bytes.Buffer
267
- decompressed .Grow (4 * batchRemain )
269
+ r .decompressed .Reset ()
270
+ // x4 as a guess that the average compression ratio is near 75%
271
+ r .decompressed .Grow (4 * batchRemain )
268
272
limitReader := io.LimitedReader {R : r .reader , N : int64 (batchRemain )}
269
273
codecReader := codec .NewReader (& limitReader )
270
- _ , err = decompressed .ReadFrom (codecReader )
274
+ _ , err = r . decompressed .ReadFrom (codecReader )
271
275
codecReader .Close ()
272
276
if err != nil {
273
277
return
274
278
}
275
279
r .remain -= batchRemain - int (limitReader .N )
276
280
r .readerStack = & readerStack {
277
- reader : bufio .NewReaderSize (& decompressed , 0 ), // the new stack reads from the decompressed buffer
278
- remain : decompressed .Len (),
281
+ reader : bufio .NewReaderSize (& r . decompressed , 0 ), // the new stack reads from the decompressed buffer
282
+ remain : r . decompressed .Len (),
279
283
base : - 1 , // base is unused here
280
284
parent : r .readerStack ,
281
285
header : r .header ,
0 commit comments