Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

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
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

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(need int, rreaderFunc) ([]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(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
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

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(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)

AltStyle によって変換されたページ (->オリジナル) /