Skip to content

Commit e8b96f2

Browse files
committed
move writeTimeout from mysqlConn to buffer
1 parent 3f89621 commit e8b96f2

File tree

5 files changed

+18
-19
lines changed

5 files changed

+18
-19
lines changed

Diff for: buffer.go

+12-6
Original file line numberDiff line numberDiff line change
@@ -23,10 +23,11 @@ const maxCachedBufSize = 256 * 1024
2323
// The buffer is similar to bufio.Reader / Writer but zero-copy-ish
2424
// Also highly optimized for this particular use case.
2525
type buffer struct {
26-
buf []byte // read buffer.
27-
cachedBuf []byte // buffer that will be reused. len(cachedBuf) <= maxCachedBufSize.
28-
nc net.Conn
29-
timeout time.Duration
26+
buf []byte // read buffer.
27+
cachedBuf []byte // buffer that will be reused. len(cachedBuf) <= maxCachedBufSize.
28+
nc net.Conn
29+
readTimeout time.Duration
30+
writeTimeout time.Duration
3031
}
3132

3233
// newBuffer allocates and returns a new buffer.
@@ -64,8 +65,8 @@ func (b *buffer) fill(need int) error {
6465
copy(dest[:n], b.buf)
6566

6667
for {
67-
if b.timeout > 0 {
68-
if err := b.nc.SetReadDeadline(time.Now().Add(b.timeout)); err != nil {
68+
if b.readTimeout > 0 {
69+
if err := b.nc.SetReadDeadline(time.Now().Add(b.readTimeout)); err != nil {
6970
return err
7071
}
7172
}
@@ -159,5 +160,10 @@ func (b *buffer) store(buf []byte) {
159160
// writePackets is a proxy function to nc.Write.
160161
// This is used to make the buffer type compatible with compressed I/O.
161162
func (b *buffer) writePackets(packets []byte) (int, error) {
163+
if b.writeTimeout > 0 {
164+
if err := b.nc.SetWriteDeadline(time.Now().Add(b.writeTimeout)); err != nil {
165+
return 0, err
166+
}
167+
}
162168
return b.nc.Write(packets)
163169
}

Diff for: compress.go

+4-3
Original file line numberDiff line numberDiff line change
@@ -195,7 +195,7 @@ func (c *compIO) writePackets(packets []byte) (int, error) {
195195
}
196196
}
197197

198-
if err := c.mc.writeCompressedPacket(buf.Bytes(), uncompressedLen); err != nil {
198+
if err := c.writeCompressedPacket(buf.Bytes(), uncompressedLen); err != nil {
199199
return 0, err
200200
}
201201
dataLen -= payloadLen
@@ -207,7 +207,8 @@ func (c *compIO) writePackets(packets []byte) (int, error) {
207207

208208
// writeCompressedPacket writes a compressed packet with header.
209209
// data should start with 7 size space for header followed by payload.
210-
func (mc *mysqlConn) writeCompressedPacket(data []byte, uncompressedLen int) error {
210+
func (c *compIO) writeCompressedPacket(data []byte, uncompressedLen int) error {
211+
mc := c.mc
211212
comprLength := len(data) - 7
212213
if debugTrace {
213214
fmt.Printf(
@@ -220,7 +221,7 @@ func (mc *mysqlConn) writeCompressedPacket(data []byte, uncompressedLen int) err
220221
data[3] = mc.compressSequence
221222
putUint24(data[4:7], uncompressedLen)
222223

223-
if _, err := mc.netConn.Write(data); err != nil {
224+
if _, err := mc.buf.writePackets(data); err != nil {
224225
mc.log("writing compressed packet:", err)
225226
return err
226227
}

Diff for: connection.go

-1
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,6 @@ type mysqlConn struct {
3333
connector *connector
3434
maxAllowedPacket int
3535
maxWriteSize int
36-
writeTimeout time.Duration
3736
flags clientFlag
3837
status statusFlag
3938
sequence uint8

Diff for: connector.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -132,8 +132,8 @@ func (c *connector) Connect(ctx context.Context) (driver.Conn, error) {
132132
mc.packetRW = &mc.buf
133133

134134
// Set I/O timeouts
135-
mc.buf.timeout = mc.cfg.ReadTimeout
136-
mc.writeTimeout = mc.cfg.WriteTimeout
135+
mc.buf.readTimeout = mc.cfg.ReadTimeout
136+
mc.buf.writeTimeout = mc.cfg.WriteTimeout
137137

138138
// Reading Handshake Initialization Packet
139139
authData, plugin, err := mc.readHandshakePacket()

Diff for: packets.go

-7
Original file line numberDiff line numberDiff line change
@@ -125,13 +125,6 @@ func (mc *mysqlConn) writePacket(data []byte) error {
125125
if debugTrace {
126126
fmt.Printf("writePacket: size=%v seq=%v", size, mc.sequence)
127127
}
128-
if mc.writeTimeout > 0 {
129-
if err := mc.netConn.SetWriteDeadline(time.Now().Add(mc.writeTimeout)); err != nil {
130-
mc.cleanup()
131-
mc.log(err)
132-
return err
133-
}
134-
}
135128

136129
n, err := mc.packetRW.writePackets(data[:4+size])
137130
if err != nil {

0 commit comments

Comments
 (0)