Skip to content

Commit 97afd8d

Browse files
author
bLamarche413
authored
Merge pull request go-sql-driver#1 from bLamarche413/cr4
Cr4 -- removing buffer from mysqlConn
2 parents f339392 + 6ceaef6 commit 97afd8d

9 files changed

+72
-53
lines changed

benchmark_test.go

+4-3
Original file line numberDiff line numberDiff line change
@@ -205,7 +205,7 @@ func BenchmarkRoundtripBin(b *testing.B) {
205205
length = max
206206
}
207207
test := sample[0:length]
208-
rows := tb.checkRows(stmt.Query(test))
208+
rows := tb.checkRows(stmt.Query(test)) //run benchmark tests to test that bit of code
209209
if !rows.Next() {
210210
rows.Close()
211211
b.Fatalf("crashed")
@@ -231,9 +231,10 @@ func BenchmarkInterpolation(b *testing.B) {
231231
},
232232
maxAllowedPacket: maxPacketSize,
233233
maxWriteSize: maxPacketSize - 1,
234-
buf: newBuffer(nil),
235234
}
236-
mc.reader = &mc.buf
235+
236+
buf := newBuffer(nil)
237+
mc.reader = &buf
237238

238239
args := []driver.Value{
239240
int64(42424242),

buffer.go

+5-11
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,11 @@ func (b *buffer) readNext(need int) ([]byte, error) {
109109
// If possible, a slice from the existing buffer is returned.
110110
// Otherwise a bigger buffer is made.
111111
// Only one buffer (total) can be used at a time.
112-
func (b *buffer) takeBuffer(length int) []byte {
112+
func (b *buffer) reuseBuffer(length int) []byte {
113+
if length == -1 {
114+
return b.takeCompleteBuffer()
115+
}
116+
113117
if b.length > 0 {
114118
return nil
115119
}
@@ -126,16 +130,6 @@ func (b *buffer) takeBuffer(length int) []byte {
126130
return make([]byte, length)
127131
}
128132

129-
// shortcut which can be used if the requested buffer is guaranteed to be
130-
// smaller than defaultBufSize
131-
// Only one buffer (total) can be used at a time.
132-
func (b *buffer) takeSmallBuffer(length int) []byte {
133-
if b.length == 0 {
134-
return b.buf[:length]
135-
}
136-
return nil
137-
}
138-
139133
// takeCompleteBuffer returns the complete existing buffer.
140134
// This can be used if the necessary buffer size is unknown.
141135
// Only one buffer (total) can be used at a time.

compress.go

+4
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,10 @@ func (cr *compressedReader) readNext(need int) ([]byte, error) {
5252
return data, nil
5353
}
5454

55+
func (cr *compressedReader) reuseBuffer(length int) []byte {
56+
return cr.buf.reuseBuffer(length)
57+
}
58+
5559
func (cr *compressedReader) uncompressPacket() error {
5660
header, err := cr.buf.readNext(7) // size of compressed header
5761

compress_test.go

+4
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,10 @@ func (mb *mockBuf) readNext(need int) ([]byte, error) {
3939
return data, nil
4040
}
4141

42+
func (mb *mockBuf) reuseBuffer(length int) []byte {
43+
return make([]byte, length) //just give them a new buffer
44+
}
45+
4246
// compressHelper compresses uncompressedPacket and checks state variables
4347
func compressHelper(t *testing.T, mc *mysqlConn, uncompressedPacket []byte) []byte {
4448
// get status variables

connection.go

+3-2
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,6 @@ type mysqlContext interface {
2828
}
2929

3030
type mysqlConn struct {
31-
buf buffer
3231
netConn net.Conn
3332
reader packetReader
3433
writer io.Writer
@@ -55,6 +54,7 @@ type mysqlConn struct {
5554

5655
type packetReader interface {
5756
readNext(need int) ([]byte, error)
57+
reuseBuffer(length int) []byte
5858
}
5959

6060
// Handles parameters set in DSN after the connection is established
@@ -197,7 +197,8 @@ func (mc *mysqlConn) interpolateParams(query string, args []driver.Value) (strin
197197
return "", driver.ErrSkip
198198
}
199199

200-
buf := mc.buf.takeCompleteBuffer()
200+
buf := mc.reader.reuseBuffer(-1)
201+
201202
if buf == nil {
202203
// can not take the buffer. Something must be wrong with the connection
203204
errLog.Print(ErrBusyBuffer)

connection_test.go

+6-6
Original file line numberDiff line numberDiff line change
@@ -15,13 +15,13 @@ import (
1515

1616
func TestInterpolateParams(t *testing.T) {
1717
mc := &mysqlConn{
18-
buf: newBuffer(nil),
1918
maxAllowedPacket: maxPacketSize,
2019
cfg: &Config{
2120
InterpolateParams: true,
2221
},
2322
}
24-
mc.reader = &mc.buf
23+
buf := newBuffer(nil)
24+
mc.reader = &buf
2525

2626
q, err := mc.interpolateParams("SELECT ?+?", []driver.Value{int64(42), "gopher"})
2727
if err != nil {
@@ -36,13 +36,13 @@ func TestInterpolateParams(t *testing.T) {
3636

3737
func TestInterpolateParamsTooManyPlaceholders(t *testing.T) {
3838
mc := &mysqlConn{
39-
buf: newBuffer(nil),
4039
maxAllowedPacket: maxPacketSize,
4140
cfg: &Config{
4241
InterpolateParams: true,
4342
},
4443
}
45-
mc.reader = &mc.buf
44+
buf := newBuffer(nil)
45+
mc.reader = &buf
4646

4747
q, err := mc.interpolateParams("SELECT ?+?", []driver.Value{int64(42)})
4848
if err != driver.ErrSkip {
@@ -54,14 +54,14 @@ func TestInterpolateParamsTooManyPlaceholders(t *testing.T) {
5454
// https://github.com/go-sql-driver/mysql/pull/490
5555
func TestInterpolateParamsPlaceholderInString(t *testing.T) {
5656
mc := &mysqlConn{
57-
buf: newBuffer(nil),
5857
maxAllowedPacket: maxPacketSize,
5958
cfg: &Config{
6059
InterpolateParams: true,
6160
},
6261
}
6362

64-
mc.reader = &mc.buf
63+
buf := newBuffer(nil)
64+
mc.reader = &buf
6565

6666
q, err := mc.interpolateParams("SELECT 'abc?xyz',?", []driver.Value{int64(42)})
6767
// When InterpolateParams support string literal, this should return `"SELECT 'abc?xyz', 42`

driver.go

+7-7
Original file line numberDiff line numberDiff line change
@@ -91,16 +91,16 @@ func (d MySQLDriver) Open(dsn string) (driver.Conn, error) {
9191
s.startWatcher()
9292
}
9393

94-
mc.buf = newBuffer(mc.netConn)
95-
96-
// packet reader and writer in handshake are never compressed
97-
mc.reader = &mc.buf
98-
mc.writer = mc.netConn
94+
buf := newBuffer(mc.netConn)
9995

10096
// Set I/O timeouts
101-
mc.buf.timeout = mc.cfg.ReadTimeout
97+
buf.timeout = mc.cfg.ReadTimeout
10298
mc.writeTimeout = mc.cfg.WriteTimeout
10399

100+
// packet reader and writer in handshake are never compressed
101+
mc.reader = &buf
102+
mc.writer = mc.netConn
103+
104104
// Reading Handshake Initialization Packet
105105
cipher, err := mc.readInitPacket()
106106
if err != nil {
@@ -124,7 +124,7 @@ func (d MySQLDriver) Open(dsn string) (driver.Conn, error) {
124124
}
125125

126126
if mc.cfg.Compress {
127-
mc.reader = newCompressedReader(&mc.buf, mc)
127+
mc.reader = newCompressedReader(&buf, mc)
128128
mc.writer = newCompressedWriter(mc.writer, mc)
129129
}
130130

packets.go

+25-11
Original file line numberDiff line numberDiff line change
@@ -283,7 +283,8 @@ func (mc *mysqlConn) writeAuthPacket(cipher []byte) error {
283283
}
284284

285285
// Calculate packet length and get buffer with that size
286-
data := mc.buf.takeSmallBuffer(pktLen + 4)
286+
data := mc.reader.reuseBuffer(pktLen + 4)
287+
287288
if data == nil {
288289
// can not take the buffer. Something must be wrong with the connection
289290
errLog.Print(ErrBusyBuffer)
@@ -326,7 +327,10 @@ func (mc *mysqlConn) writeAuthPacket(cipher []byte) error {
326327
return err
327328
}
328329
mc.netConn = tlsConn
329-
mc.buf.nc = tlsConn
330+
nc := tlsConn
331+
332+
newBuf := newBuffer(nc)
333+
mc.reader = &newBuf
330334

331335
mc.writer = mc.netConn
332336
}
@@ -373,7 +377,8 @@ func (mc *mysqlConn) writeOldAuthPacket(cipher []byte) error {
373377

374378
// Calculate the packet length and add a tailing 0
375379
pktLen := len(scrambleBuff) + 1
376-
data := mc.buf.takeSmallBuffer(4 + pktLen)
380+
data := mc.reader.reuseBuffer(4 + pktLen)
381+
377382
if data == nil {
378383
// can not take the buffer. Something must be wrong with the connection
379384
errLog.Print(ErrBusyBuffer)
@@ -392,7 +397,8 @@ func (mc *mysqlConn) writeOldAuthPacket(cipher []byte) error {
392397
func (mc *mysqlConn) writeClearAuthPacket() error {
393398
// Calculate the packet length and add a tailing 0
394399
pktLen := len(mc.cfg.Passwd) + 1
395-
data := mc.buf.takeSmallBuffer(4 + pktLen)
400+
data := mc.reader.reuseBuffer(4 + pktLen)
401+
396402
if data == nil {
397403
// can not take the buffer. Something must be wrong with the connection
398404
errLog.Print(ErrBusyBuffer)
@@ -415,7 +421,8 @@ func (mc *mysqlConn) writeNativeAuthPacket(cipher []byte) error {
415421

416422
// Calculate the packet length and add a tailing 0
417423
pktLen := len(scrambleBuff)
418-
data := mc.buf.takeSmallBuffer(4 + pktLen)
424+
data := mc.reader.reuseBuffer(4 + pktLen)
425+
419426
if data == nil {
420427
// can not take the buffer. Something must be wrong with the connection
421428
errLog.Print(ErrBusyBuffer)
@@ -437,7 +444,8 @@ func (mc *mysqlConn) writeCommandPacket(command byte) error {
437444
mc.sequence = 0
438445
mc.compressionSequence = 0
439446

440-
data := mc.buf.takeSmallBuffer(4 + 1)
447+
data := mc.reader.reuseBuffer(4 + 1)
448+
441449
if data == nil {
442450
// can not take the buffer. Something must be wrong with the connection
443451
errLog.Print(ErrBusyBuffer)
@@ -457,7 +465,8 @@ func (mc *mysqlConn) writeCommandPacketStr(command byte, arg string) error {
457465
mc.compressionSequence = 0
458466

459467
pktLen := 1 + len(arg)
460-
data := mc.buf.takeBuffer(pktLen + 4)
468+
data := mc.reader.reuseBuffer(pktLen + 4)
469+
461470
if data == nil {
462471
// can not take the buffer. Something must be wrong with the connection
463472
errLog.Print(ErrBusyBuffer)
@@ -479,7 +488,8 @@ func (mc *mysqlConn) writeCommandPacketUint32(command byte, arg uint32) error {
479488
mc.sequence = 0
480489
mc.compressionSequence = 0
481490

482-
data := mc.buf.takeSmallBuffer(4 + 1 + 4)
491+
data := mc.reader.reuseBuffer(4 + 1 + 4)
492+
483493
if data == nil {
484494
// can not take the buffer. Something must be wrong with the connection
485495
errLog.Print(ErrBusyBuffer)
@@ -946,9 +956,10 @@ func (stmt *mysqlStmt) writeExecutePacket(args []driver.Value) error {
946956
var data []byte
947957

948958
if len(args) == 0 {
949-
data = mc.buf.takeBuffer(minPktLen)
959+
data = mc.reader.reuseBuffer(minPktLen)
960+
950961
} else {
951-
data = mc.buf.takeCompleteBuffer()
962+
data = mc.reader.reuseBuffer(-1)
952963
}
953964
if data == nil {
954965
// can not take the buffer. Something must be wrong with the connection
@@ -1127,7 +1138,10 @@ func (stmt *mysqlStmt) writeExecutePacket(args []driver.Value) error {
11271138
// In that case we must build the data packet with the new values buffer
11281139
if valuesCap != cap(paramValues) {
11291140
data = append(data[:pos], paramValues...)
1130-
mc.buf.buf = data
1141+
1142+
bufBuf := mc.reader.reuseBuffer(-1)
1143+
bufBuf = data
1144+
fmt.Println(bufBuf) //dont know how to make it compile w/o some op here on bufBuf
11311145
}
11321146

11331147
pos += len(paramValues)

packets_test.go

+14-13
Original file line numberDiff line numberDiff line change
@@ -89,12 +89,11 @@ var _ net.Conn = new(mockConn)
8989

9090
func TestReadPacketSingleByte(t *testing.T) {
9191
conn := new(mockConn)
92+
buf := newBuffer(conn)
9293
mc := &mysqlConn{
93-
buf: newBuffer(conn),
94+
reader: &buf,
9495
}
9596

96-
mc.reader = &mc.buf
97-
9897
conn.data = []byte{0x01, 0x00, 0x00, 0x00, 0xff}
9998
conn.maxReads = 1
10099
packet, err := mc.readPacket()
@@ -111,10 +110,10 @@ func TestReadPacketSingleByte(t *testing.T) {
111110

112111
func TestReadPacketWrongSequenceID(t *testing.T) {
113112
conn := new(mockConn)
113+
buf := newBuffer(conn)
114114
mc := &mysqlConn{
115-
buf: newBuffer(conn),
115+
reader: &buf,
116116
}
117-
mc.reader = &mc.buf
118117

119118
// too low sequence id
120119
conn.data = []byte{0x01, 0x00, 0x00, 0x00, 0xff}
@@ -128,7 +127,8 @@ func TestReadPacketWrongSequenceID(t *testing.T) {
128127
// reset
129128
conn.reads = 0
130129
mc.sequence = 0
131-
mc.buf = newBuffer(conn)
130+
newBuf := newBuffer(conn)
131+
mc.reader = &newBuf
132132

133133
// too high sequence id
134134
conn.data = []byte{0x01, 0x00, 0x00, 0x42, 0xff}
@@ -140,12 +140,11 @@ func TestReadPacketWrongSequenceID(t *testing.T) {
140140

141141
func TestReadPacketSplit(t *testing.T) {
142142
conn := new(mockConn)
143+
buf := newBuffer(conn)
143144
mc := &mysqlConn{
144-
buf: newBuffer(conn),
145+
reader: &buf,
145146
}
146147

147-
mc.reader = &mc.buf
148-
149148
data := make([]byte, maxPacketSize*2+4*3)
150149
const pkt2ofs = maxPacketSize + 4
151150
const pkt3ofs = 2 * (maxPacketSize + 4)
@@ -247,11 +246,11 @@ func TestReadPacketSplit(t *testing.T) {
247246

248247
func TestReadPacketFail(t *testing.T) {
249248
conn := new(mockConn)
249+
buf := newBuffer(conn)
250250
mc := &mysqlConn{
251-
buf: newBuffer(conn),
251+
reader: &buf,
252252
closech: make(chan struct{}),
253253
}
254-
mc.reader = &mc.buf
255254

256255
// illegal empty (stand-alone) packet
257256
conn.data = []byte{0x00, 0x00, 0x00, 0x00}
@@ -264,7 +263,8 @@ func TestReadPacketFail(t *testing.T) {
264263
// reset
265264
conn.reads = 0
266265
mc.sequence = 0
267-
mc.buf = newBuffer(conn)
266+
newBuf := newBuffer(conn)
267+
mc.reader = &newBuf
268268

269269
// fail to read header
270270
conn.closed = true
@@ -277,7 +277,8 @@ func TestReadPacketFail(t *testing.T) {
277277
conn.closed = false
278278
conn.reads = 0
279279
mc.sequence = 0
280-
mc.buf = newBuffer(conn)
280+
newBuf = newBuffer(conn)
281+
mc.reader = &newBuf
281282

282283
// fail to read body
283284
conn.maxReads = 1

0 commit comments

Comments
 (0)