Skip to content

Commit c630c5e

Browse files
committed
optimize readPacket
1 parent f7d94ec commit c630c5e

File tree

3 files changed

+28
-19
lines changed

3 files changed

+28
-19
lines changed

buffer.go

+8-10
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,11 @@ func (b *buffer) busy() bool {
4242
return len(b.buf) > 0
4343
}
4444

45+
// len returns how many bytes in the read buffer.
46+
func (b *buffer) len() int {
47+
return len(b.buf)
48+
}
49+
4550
// fill reads into the read buffer until at least _need_ bytes are in it.
4651
func (b *buffer) fill(need int, r readerFunc) 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(need int, r readerFunc) ([]byte, error) {
90-
if len(b.buf) < need {
91-
// refill
92-
if err := b.fill(need, r); err != nil {
93-
return nil, err
94-
}
95-
}
96-
97-
data := b.buf[:need]
94+
func (b *buffer) readNext(need int) []byte {
95+
data := b.buf[:need:need]
9896
b.buf = b.buf[need:]
99-
return data, nil
97+
return data
10098
}
10199

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

compress.go

+6-6
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(need int, r readerFunc) ([]byte, error) {
87+
func (c *compIO) readNext(need int) ([]byte, error) {
8888
for c.buff.Len() < need {
89-
if err := c.readCompressedPacket(r); err != nil {
89+
if err := c.readCompressedPacket(); err != nil {
9090
return nil, err
9191
}
9292
}
9393
data := c.buff.Next(need)
9494
return data[:need:need], nil // prevent caller writes into c.buff
9595
}
9696

97-
func (c *compIO) readCompressedPacket(r readerFunc) 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
if err != nil {
100100
return err
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
if debug {
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
if err != nil {
125125
return err
126126
}

packets.go

+14-3
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(n int) ([]byte, error) {
30+
if mc.buf.len() < n {
31+
err := mc.buf.fill(n, mc.readWithTimeout)
32+
if err != nil {
33+
return nil, err
34+
}
35+
}
36+
return mc.buf.readNext(n), nil
37+
}
38+
2839
// Read packet to buffer 'data'
2940
func (mc *mysqlConn) readPacket() ([]byte, error) {
3041
var prevData []byte
3142
invalidSequence := false
3243

33-
readNext := mc.buf.readNext
44+
readNext := mc.readNext
3445
if mc.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
if err != nil {
4253
mc.close()
4354
if cerr := 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
if err != nil {
90101
mc.close()
91102
if cerr := mc.canceled.Value(); cerr != nil {

0 commit comments

Comments
 (0)