Skip to content

Commit 0fd55eb

Browse files
authored
optimize readPacket (#1705)
Avoid unnecessary allocation.
1 parent f7d94ec commit 0fd55eb

File tree

3 files changed

+28
-19
lines changed

3 files changed

+28
-19
lines changed

‎buffer.go‎

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,11 @@ func (b *buffer) busy() bool{
4242
returnlen(b.buf) >0
4343
}
4444

45+
// len returns how many bytes in the read buffer.
46+
func (b*buffer) len() int{
47+
returnlen(b.buf)
48+
}
49+
4550
// fill reads into the read buffer until at least _need_ bytes are in it.
4651
func (b*buffer) fill(needint, rreaderFunc) error{
4752
// we'll move the contents of the current buffer to dest before filling it.
@@ -86,17 +91,10 @@ func (b *buffer) fill(need int, r readerFunc) error{
8691

8792
// returns next N bytes from buffer.
8893
// The returned slice is only guaranteed to be valid until the next read
89-
func (b*buffer) readNext(needint, rreaderFunc) ([]byte, error){
90-
iflen(b.buf) <need{
91-
// refill
92-
iferr:=b.fill(need, r); err!=nil{
93-
returnnil, err
94-
}
95-
}
96-
97-
data:=b.buf[:need]
94+
func (b*buffer) readNext(needint) []byte{
95+
data:=b.buf[:need:need]
9896
b.buf=b.buf[need:]
99-
returndata, nil
97+
returndata
10098
}
10199

102100
// takeBuffer returns a buffer with the requested size.

‎compress.go‎

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -84,26 +84,26 @@ func (c *compIO) reset(){
8484
c.buff.Reset()
8585
}
8686

87-
func (c*compIO) readNext(needint, rreaderFunc) ([]byte, error){
87+
func (c*compIO) readNext(needint) ([]byte, error){
8888
forc.buff.Len() <need{
89-
iferr:=c.readCompressedPacket(r); err!=nil{
89+
iferr:=c.readCompressedPacket(); err!=nil{
9090
returnnil, err
9191
}
9292
}
9393
data:=c.buff.Next(need)
9494
returndata[:need:need], nil// prevent caller writes into c.buff
9595
}
9696

97-
func (c*compIO) readCompressedPacket(rreaderFunc) error{
98-
header, err:=c.mc.buf.readNext(7, r) // size of compressed header
97+
func (c*compIO) readCompressedPacket() error{
98+
header, err:=c.mc.readNext(7)
9999
iferr!=nil{
100100
returnerr
101101
}
102102
_=header[6] // bounds check hint to compiler; guaranteed by readNext
103103

104104
// compressed header structure
105105
comprLength:=getUint24(header[0:3])
106-
compressionSequence:=uint8(header[3])
106+
compressionSequence:=header[3]
107107
uncompressedLength:=getUint24(header[4:7])
108108
ifdebug{
109109
fmt.Printf("uncompress cmplen=%v uncomplen=%v pkt_cmp_seq=%v expected_cmp_seq=%v\n",
@@ -120,7 +120,7 @@ func (c *compIO) readCompressedPacket(r readerFunc) error{
120120
c.mc.sequence=compressionSequence+1
121121
c.mc.compressSequence=c.mc.sequence
122122

123-
comprData, err:=c.mc.buf.readNext(comprLength, r)
123+
comprData, err:=c.mc.readNext(comprLength)
124124
iferr!=nil{
125125
returnerr
126126
}

‎packets.go‎

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,19 +25,30 @@ import (
2525
// https://dev.mysql.com/doc/dev/mysql-server/latest/PAGE_PROTOCOL.html
2626
// https://mariadb.com/kb/en/clientserver-protocol/
2727

28+
// read n bytes from mc.buf
29+
func (mc*mysqlConn) readNext(nint) ([]byte, error){
30+
ifmc.buf.len() <n{
31+
err:=mc.buf.fill(n, mc.readWithTimeout)
32+
iferr!=nil{
33+
returnnil, err
34+
}
35+
}
36+
returnmc.buf.readNext(n), nil
37+
}
38+
2839
// Read packet to buffer 'data'
2940
func (mc*mysqlConn) readPacket() ([]byte, error){
3041
varprevData []byte
3142
invalidSequence:=false
3243

33-
readNext:=mc.buf.readNext
44+
readNext:=mc.readNext
3445
ifmc.compress{
3546
readNext=mc.compIO.readNext
3647
}
3748

3849
for{
3950
// read packet header
40-
data, err:=readNext(4, mc.readWithTimeout)
51+
data, err:=readNext(4)
4152
iferr!=nil{
4253
mc.close()
4354
ifcerr:=mc.canceled.Value(); cerr!=nil{
@@ -85,7 +96,7 @@ func (mc *mysqlConn) readPacket() ([]byte, error){
8596
}
8697

8798
// read packet body [pktLen bytes]
88-
data, err=readNext(pktLen, mc.readWithTimeout)
99+
data, err=readNext(pktLen)
89100
iferr!=nil{
90101
mc.close()
91102
ifcerr:=mc.canceled.Value(); cerr!=nil{

0 commit comments

Comments
(0)