@@ -11,6 +11,8 @@ import (
11
11
"time"
12
12
13
13
"github.com/pingcap/errors"
14
+
15
+ "github.com/go-mysql-org/go-mysql/utils"
14
16
)
15
17
16
18
var (
@@ -110,8 +112,11 @@ func (p *BinlogParser) parseSingleEvent(r io.Reader, onEvent OnEventFunc) (bool,
110
112
var err error
111
113
var n int64
112
114
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 {
115
120
return true , nil
116
121
} else if err != nil {
117
122
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,
126
131
if h .EventSize < uint32 (EventHeaderSize ) {
127
132
return false , errors .Errorf ("invalid event header, event size is %d, too small" , h .EventSize )
128
133
}
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 {
130
135
return false , errors .Errorf ("get event err %v, need %d but got %d" , err , h .EventSize , n )
131
136
}
132
137
if buf .Len () != int (h .EventSize ) {
133
138
return false , errors .Errorf ("invalid raw data size in event %s, need %d but got %d" , h .EventType , h .EventSize , buf .Len ())
134
139
}
135
140
136
- rawData := buf .Bytes ()
141
+ var rawData []byte
142
+ rawData = append (rawData , buf .Bytes ()... )
137
143
bodyLen := int (h .EventSize ) - EventHeaderSize
138
144
body := rawData [EventHeaderSize :]
139
145
if len (body ) != bodyLen {
0 commit comments