Skip to content

Commit 8d0b3e3

Browse files
authored
allow packet.Conn buffersize to be adjustable (#892)
1 parent 7ee1864 commit 8d0b3e3

File tree

4 files changed

+39
-5
lines changed

4 files changed

+39
-5
lines changed

client/auth.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -304,7 +304,7 @@ func (c *Conn) writeAuthHandshake() error {
304304
}
305305

306306
currentSequence := c.Sequence
307-
c.Conn = packet.NewConn(tlsConn)
307+
c.Conn = packet.NewBufferedConn(tlsConn, c.BufferSize)
308308
c.Sequence = currentSequence
309309
}
310310

client/conn.go

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@ import (
1818
"github.com/go-mysql-org/go-mysql/utils"
1919
)
2020

21+
const defaultBufferSize = 65536 // 64kb
22+
2123
type Option func(*Conn) error
2224

2325
type Conn struct {
@@ -33,6 +35,9 @@ type Conn struct {
3335
ReadTimeout time.Duration
3436
WriteTimeout time.Duration
3537

38+
// The buffer size to use in the packet connection
39+
BufferSize int
40+
3641
serverVersion string
3742
// server capabilities
3843
capability uint32
@@ -94,6 +99,7 @@ type Dialer func(ctx context.Context, network, address string) (net.Conn, error)
9499
func ConnectWithDialer(ctx context.Context, network, addr, user, password, dbName string, dialer Dialer, options ...Option) (*Conn, error) {
95100
c := new(Conn)
96101

102+
c.BufferSize = defaultBufferSize
97103
c.attributes = map[string]string{
98104
"_client_name": "go-mysql",
99105
// "_client_version": "0.1",
@@ -129,7 +135,7 @@ func ConnectWithDialer(ctx context.Context, network, addr, user, password, dbNam
129135
}
130136
}
131137

132-
c.Conn = packet.NewConnWithTimeout(conn, c.ReadTimeout, c.WriteTimeout)
138+
c.Conn = packet.NewConnWithTimeout(conn, c.ReadTimeout, c.WriteTimeout, c.BufferSize)
133139
if c.tlsConfig != nil {
134140
seq := c.Conn.Sequence
135141
c.Conn = packet.NewTLSConnWithTimeout(conn, c.ReadTimeout, c.WriteTimeout)

driver/driver_options_test.go

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import (
88
"math"
99
"net"
1010
"reflect"
11+
"strconv"
1112
"strings"
1213
"testing"
1314
"time"
@@ -73,6 +74,29 @@ func TestDriverOptions_ConnectTimeout(t *testing.T) {
7374
conn.Close()
7475
}
7576

77+
func TestDriverOptions_BufferSize(t *testing.T) {
78+
log.SetLevel(log.LevelDebug)
79+
srv := CreateMockServer(t)
80+
defer srv.Stop()
81+
82+
SetDSNOptions(map[string]DriverOption{
83+
"bufferSize": func(c *client.Conn, value string) error {
84+
var err error
85+
c.BufferSize, err = strconv.Atoi(value)
86+
return err
87+
},
88+
})
89+
90+
conn, err := sql.Open("mysql", "[email protected]:3307/test?bufferSize=4096")
91+
require.NoError(t, err)
92+
93+
rows, err := conn.QueryContext(context.TODO(), "select * from table;")
94+
require.NotNil(t, rows)
95+
require.NoError(t, err)
96+
97+
conn.Close()
98+
}
99+
76100
func TestDriverOptions_ReadTimeout(t *testing.T) {
77101
log.SetLevel(log.LevelDebug)
78102
srv := CreateMockServer(t)

packet/conn.go

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -53,19 +53,23 @@ type Conn struct {
5353
}
5454

5555
func NewConn(conn net.Conn) *Conn {
56+
return NewBufferedConn(conn, 65536) // 64kb
57+
}
58+
59+
func NewBufferedConn(conn net.Conn, bufferSize int) *Conn {
5660
c := new(Conn)
5761
c.Conn = conn
5862

59-
c.br = bufio.NewReaderSize(c, 65536) // 64kb
63+
c.br = bufio.NewReaderSize(c, bufferSize)
6064
c.reader = c.br
6165

6266
c.copyNBuf = make([]byte, DefaultBufferSize)
6367

6468
return c
6569
}
6670

67-
func NewConnWithTimeout(conn net.Conn, readTimeout, writeTimeout time.Duration) *Conn {
68-
c := NewConn(conn)
71+
func NewConnWithTimeout(conn net.Conn, readTimeout, writeTimeout time.Duration, bufferSize int) *Conn {
72+
c := NewBufferedConn(conn, bufferSize)
6973
c.readTimeout = readTimeout
7074
c.writeTimeout = writeTimeout
7175
return c

0 commit comments

Comments
 (0)