@@ -321,14 +321,19 @@ func (wb *writeBuffer) writeListOffsetRequestV1(correlationID int32, clientID, t
321
321
}
322
322
323
323
func (wb * writeBuffer ) writeProduceRequestV2 (codec CompressionCodec , correlationID int32 , clientID , topic string , partition int32 , timeout time.Duration , requiredAcks int16 , msgs ... Message ) (err error ) {
324
- attributes := int8 (CompressionNoneCode )
325
- if codec != nil {
326
- if msgs , err = compressMessageSet (codec , msgs ... ); err != nil {
327
- return err
324
+ var size int32
325
+ var attributes int8
326
+ var compressed * bytes.Buffer
327
+
328
+ if codec == nil {
329
+ size = messageSetSize (msgs ... )
330
+ } else {
331
+ compressed , attributes , size , err = compressMessageSet (codec , msgs ... )
332
+ if err != nil {
333
+ return
328
334
}
329
- attributes = codec . Code ()
335
+ msgs = [] Message {{ Value : compressed . Bytes ()}}
330
336
}
331
- size := messageSetSize (msgs ... )
332
337
333
338
h := requestHeader {
334
339
ApiKey : int16 (produceRequest ),
@@ -365,13 +370,14 @@ func (wb *writeBuffer) writeProduceRequestV2(codec CompressionCodec, correlation
365
370
wb .writeMessage (msg .Offset , attributes , msg .Time , msg .Key , msg .Value , cw )
366
371
}
367
372
373
+ releaseBuffer (compressed )
368
374
return wb .Flush ()
369
375
}
370
376
371
377
func (wb * writeBuffer ) writeProduceRequestV3 (codec CompressionCodec , correlationID int32 , clientID , topic string , partition int32 , timeout time.Duration , requiredAcks int16 , transactionalID * string , msgs ... Message ) (err error ) {
372
378
var size int32
373
- var compressed []byte
374
379
var attributes int16
380
+ var compressed * bytes.Buffer
375
381
376
382
if codec == nil {
377
383
size = recordBatchSize (msgs ... )
@@ -417,10 +423,11 @@ func (wb *writeBuffer) writeProduceRequestV3(codec CompressionCodec, correlation
417
423
baseTime := msgs [0 ].Time
418
424
lastTime := msgs [len (msgs )- 1 ].Time
419
425
420
- if codec != nil {
426
+ if compressed != nil {
421
427
wb .writeRecordBatch (attributes , size , len (msgs ), baseTime , lastTime , func (wb * writeBuffer ) {
422
- wb .Write (compressed )
428
+ wb .Write (compressed . Bytes () )
423
429
})
430
+ releaseBuffer (compressed )
424
431
} else {
425
432
wb .writeRecordBatch (attributes , size , len (msgs ), baseTime , lastTime , func (wb * writeBuffer ) {
426
433
for i , msg := range msgs {
@@ -434,8 +441,8 @@ func (wb *writeBuffer) writeProduceRequestV3(codec CompressionCodec, correlation
434
441
435
442
func (wb * writeBuffer ) writeProduceRequestV7 (codec CompressionCodec , correlationID int32 , clientID , topic string , partition int32 , timeout time.Duration , requiredAcks int16 , transactionalID * string , msgs ... Message ) (err error ) {
436
443
var size int32
437
- var compressed []byte
438
444
var attributes int16
445
+ var compressed * bytes.Buffer
439
446
440
447
if codec == nil {
441
448
size = recordBatchSize (msgs ... )
@@ -480,10 +487,11 @@ func (wb *writeBuffer) writeProduceRequestV7(codec CompressionCodec, correlation
480
487
baseTime := msgs [0 ].Time
481
488
lastTime := msgs [len (msgs )- 1 ].Time
482
489
483
- if codec != nil {
490
+ if compressed != nil {
484
491
wb .writeRecordBatch (attributes , size , len (msgs ), baseTime , lastTime , func (wb * writeBuffer ) {
485
- wb .Write (compressed )
492
+ wb .Write (compressed . Bytes () )
486
493
})
494
+ releaseBuffer (compressed )
487
495
} else {
488
496
wb .writeRecordBatch (attributes , size , len (msgs ), baseTime , lastTime , func (wb * writeBuffer ) {
489
497
for i , msg := range msgs {
@@ -539,49 +547,42 @@ func (wb *writeBuffer) writeRecordBatch(attributes int16, size int32, count int,
539
547
write (wb )
540
548
}
541
549
542
- var maxDate = time .Date (5000 , time .January , 0 , 0 , 0 , 0 , 0 , time .UTC )
543
-
544
- func compressMessageSet (codec CompressionCodec , msgs ... Message ) ([]Message , error ) {
545
- estimatedLen := 0
546
-
547
- for _ , msg := range msgs {
548
- estimatedLen += int (messageSize (msg .Key , msg .Value ))
549
- }
550
-
551
- buffer := & bytes.Buffer {}
552
- buffer .Grow (estimatedLen / 2 )
553
- compressor := codec .NewWriter (buffer )
550
+ func compressMessageSet (codec CompressionCodec , msgs ... Message ) (compressed * bytes.Buffer , attributes int8 , size int32 , err error ) {
551
+ compressed = acquireBuffer ()
552
+ compressor := codec .NewWriter (compressed )
554
553
wb := & writeBuffer {w : compressor }
555
554
cw := & crc32Writer {table : crc32 .IEEETable }
556
555
557
556
for offset , msg := range msgs {
558
- wb .writeMessage (int64 (offset ), CompressionNoneCode , msg .Time , msg .Key , msg .Value , cw )
557
+ wb .writeMessage (int64 (offset ), 0 , msg .Time , msg .Key , msg .Value , cw )
559
558
}
560
559
561
- if err := compressor .Close (); err != nil {
562
- return nil , err
560
+ if err = compressor .Close (); err != nil {
561
+ releaseBuffer (compressed )
562
+ return
563
563
}
564
564
565
- return []Message {{Value : buffer .Bytes ()}}, nil
565
+ attributes = codec .Code ()
566
+ size = messageSetSize (Message {Value : compressed .Bytes ()})
567
+ return
566
568
}
567
569
568
- func compressRecordBatch (codec CompressionCodec , msgs ... Message ) (compressed []byte , attributes int16 , size int32 , err error ) {
569
- recordBuf := & bytes.Buffer {}
570
- recordBuf .Grow (int (recordBatchSize (msgs ... )) / 2 )
571
- compressor := codec .NewWriter (recordBuf )
570
+ func compressRecordBatch (codec CompressionCodec , msgs ... Message ) (compressed * bytes.Buffer , attributes int16 , size int32 , err error ) {
571
+ compressed = acquireBuffer ()
572
+ compressor := codec .NewWriter (compressed )
572
573
wb := & writeBuffer {w : compressor }
573
574
574
575
for i , msg := range msgs {
575
576
wb .writeRecord (0 , msgs [0 ].Time , int64 (i ), msg )
576
577
}
577
578
578
579
if err = compressor .Close (); err != nil {
580
+ releaseBuffer (compressed )
579
581
return
580
582
}
581
583
582
- compressed = recordBuf .Bytes ()
583
584
attributes = int16 (codec .Code ())
584
- size = recordBatchHeaderSize + int32 (len ( compressed ))
585
+ size = recordBatchHeaderSize + int32 (compressed . Len ( ))
585
586
return
586
587
}
587
588
0 commit comments