Skip to content

Commit 47ae433

Browse files
committed
Reuse lengthFields
1 parent 72033d7 commit 47ae433

File tree

5 files changed

+47
-4
lines changed

5 files changed

+47
-4
lines changed

crc32_field.go

+17
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
"encoding/binary"
55
"fmt"
66
"hash/crc32"
7+
"sync"
78
)
89

910
type crcPolynomial int8
@@ -13,6 +14,22 @@ const (
1314
crcCastagnoli
1415
)
1516

17+
var crc32FieldPool = sync.Pool{}
18+
19+
func acquireCrc32Field(polynomial crcPolynomial) *crc32Field {
20+
val := crc32FieldPool.Get()
21+
if val != nil {
22+
c := val.(*crc32Field)
23+
c.polynomial = polynomial
24+
return c
25+
}
26+
return newCRC32Field(polynomial)
27+
}
28+
29+
func releaseCrc32Field(c *crc32Field) {
30+
crc32FieldPool.Put(c)
31+
}
32+
1633
var castagnoliTable = crc32.MakeTable(crc32.Castagnoli)
1734

1835
// crc32Field implements the pushEncoder and pushDecoder interfaces for calculating CRC32s.

length_field.go

+18-1
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,30 @@
11
package sarama
22

3-
import "encoding/binary"
3+
import (
4+
"encoding/binary"
5+
"sync"
6+
)
47

58
// LengthField implements the PushEncoder and PushDecoder interfaces for calculating 4-byte lengths.
69
type lengthField struct {
710
startOffset int
811
length int32
912
}
1013

14+
var lengthFieldPool = sync.Pool{}
15+
16+
func acquireLengthField() *lengthField {
17+
val := lengthFieldPool.Get()
18+
if val != nil {
19+
return val.(*lengthField)
20+
}
21+
return &lengthField{}
22+
}
23+
24+
func releaseLengthField(m *lengthField) {
25+
lengthFieldPool.Put(m)
26+
}
27+
1128
func (l *lengthField) decode(pd packetDecoder) error {
1229
var err error
1330
l.length, err = pd.getInt32()

message.go

+4-1
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,10 @@ func (m *Message) encode(pe packetEncoder) error {
103103
}
104104

105105
func (m *Message) decode(pd packetDecoder) (err error) {
106-
err = pd.push(newCRC32Field(crcIEEE))
106+
crc32Decoder := acquireCrc32Field(crcIEEE)
107+
defer releaseCrc32Field(crc32Decoder)
108+
109+
err = pd.push(crc32Decoder)
107110
if err != nil {
108111
return err
109112
}

message_set.go

+4-1
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,10 @@ func (msb *MessageBlock) decode(pd packetDecoder) (err error) {
2929
return err
3030
}
3131

32-
if err = pd.push(&lengthField{}); err != nil {
32+
lengthDecoder := acquireLengthField()
33+
defer releaseLengthField(lengthDecoder)
34+
35+
if err = pd.push(lengthDecoder); err != nil {
3336
return err
3437
}
3538

record_batch.go

+4-1
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,10 @@ func (b *RecordBatch) decode(pd packetDecoder) (err error) {
116116
return err
117117
}
118118

119-
if err = pd.push(&crc32Field{polynomial: crcCastagnoli}); err != nil {
119+
crc32Decoder := acquireCrc32Field(crcCastagnoli)
120+
defer releaseCrc32Field(crc32Decoder)
121+
122+
if err = pd.push(crc32Decoder); err != nil {
120123
return err
121124
}
122125

0 commit comments

Comments
 (0)