@@ -17,6 +17,7 @@ import (
17
17
"net"
18
18
"strconv"
19
19
"strings"
20
+ "sync/atomic"
20
21
"time"
21
22
)
22
23
@@ -45,7 +46,12 @@ type mysqlConn struct {
45
46
closech chan struct {}
46
47
finished chan <- struct {}
47
48
canceled atomicError // set non-nil if conn is canceled
48
- closed atomicBool // set when conn is closed, before closech is closed
49
+ closed atomic.Bool // set when conn is closed, before closech is closed
50
+ }
51
+
52
+ // Helper function to call per-connection logger.
53
+ func (mc * mysqlConn ) log (v ... any ) {
54
+ mc .cfg .Logger .Print (v ... )
49
55
}
50
56
51
57
type packetReader interface {
@@ -133,6 +139,7 @@ func (mc *mysqlConn) Begin() (driver.Tx, error) {
133
139
134
140
func (mc * mysqlConn ) begin (readOnly bool ) (driver.Tx , error ) {
135
141
if mc .closed .Load () {
142
+ mc .log (ErrInvalidConn )
136
143
return nil , driver .ErrBadConn
137
144
}
138
145
var q string
@@ -155,6 +162,7 @@ func (mc *mysqlConn) Close() (err error) {
155
162
}
156
163
157
164
mc .cleanup ()
165
+ mc .clearResult ()
158
166
return
159
167
}
160
168
@@ -169,13 +177,16 @@ func (mc *mysqlConn) cleanup() {
169
177
170
178
// Makes cleanup idempotent
171
179
close (mc .closech )
172
- if mc .netConn == nil {
180
+ conn := mc .rawConn
181
+ if conn == nil {
173
182
return
174
183
}
175
- if err := mc . netConn .Close (); err != nil {
184
+ if err := conn .Close (); err != nil {
176
185
mc .log ("closing connection:" , err )
177
186
}
178
- mc .clearResult ()
187
+ // This function can be called from multiple goroutines.
188
+ // So we can not mc.clearResult() here.
189
+ // Caller should do it if they are in safe goroutine.
179
190
}
180
191
181
192
func (mc * mysqlConn ) error () error {
@@ -190,14 +201,14 @@ func (mc *mysqlConn) error() error {
190
201
191
202
func (mc * mysqlConn ) Prepare (query string ) (driver.Stmt , error ) {
192
203
if mc .closed .Load () {
193
- mc .cfg . Logger . Print (ErrInvalidConn )
204
+ mc .log (ErrInvalidConn )
194
205
return nil , driver .ErrBadConn
195
206
}
196
207
// Send command
197
208
err := mc .writeCommandPacketStr (comStmtPrepare , query )
198
209
if err != nil {
199
210
// STMT_PREPARE is safe to retry. So we can return ErrBadConn here.
200
- mc .cfg . Logger . Print (err )
211
+ mc .log (err )
201
212
return nil , driver .ErrBadConn
202
213
}
203
214
@@ -231,7 +242,7 @@ func (mc *mysqlConn) interpolateParams(query string, args []driver.Value) (strin
231
242
buf , err := mc .buf .takeCompleteBuffer ()
232
243
if err != nil {
233
244
// can not take the buffer. Something must be wrong with the connection
234
- mc .cfg . Logger . Print (err )
245
+ mc .log (err )
235
246
return "" , ErrInvalidConn
236
247
}
237
248
buf = buf [:0 ]
@@ -323,7 +334,7 @@ func (mc *mysqlConn) interpolateParams(query string, args []driver.Value) (strin
323
334
324
335
func (mc * mysqlConn ) Exec (query string , args []driver.Value ) (driver.Result , error ) {
325
336
if mc .closed .Load () {
326
- mc .cfg . Logger . Print (ErrInvalidConn )
337
+ mc .log (ErrInvalidConn )
327
338
return nil , driver .ErrBadConn
328
339
}
329
340
if len (args ) != 0 {
@@ -383,7 +394,7 @@ func (mc *mysqlConn) query(query string, args []driver.Value) (*textRows, error)
383
394
handleOk := mc .clearResult ()
384
395
385
396
if mc .closed .Load () {
386
- mc .cfg . Logger . Print (ErrInvalidConn )
397
+ mc .log (ErrInvalidConn )
387
398
return nil , driver .ErrBadConn
388
399
}
389
400
if len (args ) != 0 {
@@ -478,7 +489,7 @@ func (mc *mysqlConn) finish() {
478
489
// Ping implements driver.Pinger interface
479
490
func (mc * mysqlConn ) Ping (ctx context.Context ) (err error ) {
480
491
if mc .closed .Load () {
481
- mc .cfg . Logger . Print (ErrInvalidConn )
492
+ mc .log (ErrInvalidConn )
482
493
return driver .ErrBadConn
483
494
}
484
495
@@ -687,7 +698,7 @@ func (mc *mysqlConn) ResetSession(ctx context.Context) error {
687
698
err = connCheck (conn )
688
699
}
689
700
if err != nil {
690
- mc .cfg . Logger . Print ("closing bad idle connection: " , err )
701
+ mc .log ("closing bad idle connection: " , err )
691
702
return driver .ErrBadConn
692
703
}
693
704
}
0 commit comments