Skip to content

Commit 2219281

Browse files
authored
Merge pull request #644 from D3Hunter/reuse-buf
Reuse BytesBuffer in BinlogParser
2 parents 423b04c + 2f69868 commit 2219281

File tree

1 file changed

+10
-4
lines changed

1 file changed

+10
-4
lines changed

replication/parser.go

+10-4
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ import (
1111
"time"
1212

1313
"github.com/pingcap/errors"
14+
15+
"github.com/go-mysql-org/go-mysql/utils"
1416
)
1517

1618
var (
@@ -110,8 +112,11 @@ func (p *BinlogParser) parseSingleEvent(r io.Reader, onEvent OnEventFunc) (bool,
110112
var err error
111113
var n int64
112114

113-
var buf bytes.Buffer
114-
if n, err = io.CopyN(&buf, r, EventHeaderSize); err == io.EOF {
115+
// Here we use `sync.Pool` to avoid allocate/destroy buffers frequently.
116+
buf := utils.BytesBufferGet()
117+
defer utils.BytesBufferPut(buf)
118+
119+
if n, err = io.CopyN(buf, r, EventHeaderSize); err == io.EOF {
115120
return true, nil
116121
} else if err != nil {
117122
return false, errors.Errorf("get event header err %v, need %d but got %d", err, EventHeaderSize, n)
@@ -126,14 +131,15 @@ func (p *BinlogParser) parseSingleEvent(r io.Reader, onEvent OnEventFunc) (bool,
126131
if h.EventSize < uint32(EventHeaderSize) {
127132
return false, errors.Errorf("invalid event header, event size is %d, too small", h.EventSize)
128133
}
129-
if n, err = io.CopyN(&buf, r, int64(h.EventSize-EventHeaderSize)); err != nil {
134+
if n, err = io.CopyN(buf, r, int64(h.EventSize-EventHeaderSize)); err != nil {
130135
return false, errors.Errorf("get event err %v, need %d but got %d", err, h.EventSize, n)
131136
}
132137
if buf.Len() != int(h.EventSize) {
133138
return false, errors.Errorf("invalid raw data size in event %s, need %d but got %d", h.EventType, h.EventSize, buf.Len())
134139
}
135140

136-
rawData := buf.Bytes()
141+
var rawData []byte
142+
rawData = append(rawData, buf.Bytes()...)
137143
bodyLen := int(h.EventSize) - EventHeaderSize
138144
body := rawData[EventHeaderSize:]
139145
if len(body) != bodyLen {

0 commit comments

Comments
 (0)