From e837483e393f90206e86f270510a1a4370015432 Mon Sep 17 00:00:00 2001 From: D3Hunter Date: Thu, 21 Oct 2021 17:56:45 +0800 Subject: [PATCH 1/2] reuse byte buffer to avoid allocate/destroy buffers frequently --- replication/parser.go | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/replication/parser.go b/replication/parser.go index 77eb7e9aa..a06a9d054 100644 --- a/replication/parser.go +++ b/replication/parser.go @@ -4,6 +4,7 @@ import ( "bytes" "encoding/binary" "fmt" + "github.com/go-mysql-org/go-mysql/utils" "hash/crc32" "io" "os" @@ -110,8 +111,11 @@ func (p *BinlogParser) parseSingleEvent(r io.Reader, onEvent OnEventFunc) (bool, var err error var n int64 - var buf bytes.Buffer - if n, err = io.CopyN(&buf, r, EventHeaderSize); err == io.EOF { + // Here we use `sync.Pool` to avoid allocate/destroy buffers frequently. + buf := utils.BytesBufferGet() + defer utils.BytesBufferPut(buf) + + if n, err = io.CopyN(buf, r, EventHeaderSize); err == io.EOF { return true, nil } else if err != nil { return false, errors.Errorf("get event header err %v, need %d but got %d", err, EventHeaderSize, n) @@ -126,14 +130,15 @@ func (p *BinlogParser) parseSingleEvent(r io.Reader, onEvent OnEventFunc) (bool, if h.EventSize < uint32(EventHeaderSize) { return false, errors.Errorf("invalid event header, event size is %d, too small", h.EventSize) } - if n, err = io.CopyN(&buf, r, int64(h.EventSize-EventHeaderSize)); err != nil { + if n, err = io.CopyN(buf, r, int64(h.EventSize-EventHeaderSize)); err != nil { return false, errors.Errorf("get event err %v, need %d but got %d", err, h.EventSize, n) } if buf.Len() != int(h.EventSize) { return false, errors.Errorf("invalid raw data size in event %s, need %d but got %d", h.EventType, h.EventSize, buf.Len()) } - rawData := buf.Bytes() + var rawData []byte + rawData = append(rawData, buf.Bytes()...) bodyLen := int(h.EventSize) - EventHeaderSize body := rawData[EventHeaderSize:] if len(body) != bodyLen { From d7f36836d6b7057d43fdf646cbd162148fb2f22f Mon Sep 17 00:00:00 2001 From: D3Hunter Date: Thu, 11 Nov 2021 17:22:45 +0800 Subject: [PATCH 2/2] sort imports --- replication/parser.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/replication/parser.go b/replication/parser.go index a06a9d054..bcbae5fbf 100644 --- a/replication/parser.go +++ b/replication/parser.go @@ -4,7 +4,6 @@ import ( "bytes" "encoding/binary" "fmt" - "github.com/go-mysql-org/go-mysql/utils" "hash/crc32" "io" "os" @@ -12,6 +11,8 @@ import ( "time" "github.com/pingcap/errors" + + "github.com/go-mysql-org/go-mysql/utils" ) var (