@@ -129,12 +129,13 @@ func (b BinaryParser) Parse() (common.Request, common.RequestType, uint64, error
129129 // read in the full header before any variable length fields
130130 reqHeader , err := readRequestHeader (b .reader )
131131 start := timer .Now ()
132- defer reqHeadPool .Put (reqHeader )
133132
134133 if err != nil {
135134 return nil , common .RequestUnknown , start , err
136135 }
137136
137+ defer reqHeadPool .Put (reqHeader )
138+
138139 switch reqHeader .Opcode {
139140 case OpcodeSet :
140141 return setRequest (b .reader , reqHeader , common .RequestSet , false , start )
@@ -291,13 +292,15 @@ func (b BinaryParser) Parse() (common.Request, common.RequestType, uint64, error
291292 return nil , common .RequestUnknown , start , common .ErrUnknownCmd
292293}
293294
294- func readBatchGet (r io.Reader , header RequestHeader ) (common.GetRequest , error ) {
295+ func readBatchGet (r io.Reader , header * RequestHeader ) (common.GetRequest , error ) {
295296 var keys [][]byte
296297 var opaques []uint32
297298 var quiet []bool
298299 var noopOpaque uint32
299300 var noopEnd bool
300301
302+ first := true
303+
301304 // while GETQ
302305 // read key, read header
303306 for header .Opcode == OpcodeGetQ {
@@ -312,7 +315,11 @@ func readBatchGet(r io.Reader, header RequestHeader) (common.GetRequest, error)
312315 quiet = append (quiet , true )
313316
314317 // read in the next header
315- reqHeadPool .Put (header )
318+ if ! first {
319+ reqHeadPool .Put (header )
320+ } else {
321+ first = false
322+ }
316323 header , err = readRequestHeader (r )
317324 if err != nil {
318325 return common.GetRequest {}, err
@@ -354,13 +361,15 @@ func readBatchGet(r io.Reader, header RequestHeader) (common.GetRequest, error)
354361 }, nil
355362}
356363
357- func readBatchGetE (r io.Reader , header RequestHeader ) (common.GetRequest , error ) {
364+ func readBatchGetE (r io.Reader , header * RequestHeader ) (common.GetRequest , error ) {
358365 var keys [][]byte
359366 var opaques []uint32
360367 var quiet []bool
361368 var noopOpaque uint32
362369 var noopEnd bool
363370
371+ first := true
372+
364373 // while GETQ
365374 // read key, read header
366375 for header .Opcode == OpcodeGetEQ {
@@ -375,7 +384,11 @@ func readBatchGetE(r io.Reader, header RequestHeader) (common.GetRequest, error)
375384 quiet = append (quiet , true )
376385
377386 // read in the next header
378- reqHeadPool .Put (header )
387+ if ! first {
388+ reqHeadPool .Put (header )
389+ } else {
390+ first = false
391+ }
379392 header , err = readRequestHeader (r )
380393 if err != nil {
381394 return common.GetRequest {}, err
@@ -417,7 +430,7 @@ func readBatchGetE(r io.Reader, header RequestHeader) (common.GetRequest, error)
417430 }, nil
418431}
419432
420- func setRequest (r io.Reader , reqHeader RequestHeader , reqType common.RequestType , quiet bool , start uint64 ) (common.SetRequest , common.RequestType , uint64 , error ) {
433+ func setRequest (r io.Reader , reqHeader * RequestHeader , reqType common.RequestType , quiet bool , start uint64 ) (common.SetRequest , common.RequestType , uint64 , error ) {
421434 // flags, exptime, key, value
422435 flags , err := readUInt32 (r )
423436 if err != nil {
@@ -459,7 +472,7 @@ func setRequest(r io.Reader, reqHeader RequestHeader, reqType common.RequestType
459472 }, reqType , start , nil
460473}
461474
462- func appendPrependRequest (r io.Reader , reqHeader RequestHeader , reqType common.RequestType , quiet bool , start uint64 ) (common.SetRequest , common.RequestType , uint64 , error ) {
475+ func appendPrependRequest (r io.Reader , reqHeader * RequestHeader , reqType common.RequestType , quiet bool , start uint64 ) (common.SetRequest , common.RequestType , uint64 , error ) {
463476 // key, value
464477 key , err := readString (r , reqHeader .KeyLength )
465478 if err != nil {
0 commit comments