@@ -44,12 +44,24 @@ func (mc *mysqlConn) readPacket() ([]byte, error) {
4444
4545 // check packet sync [8 bit]
4646 if data [3 ] != mc .sequence {
47+ var syncErr error
4748 if data [3 ] > mc .sequence {
48- return nil , ErrPktSyncMul
49+ syncErr = ErrPktSyncMul
50+ } else {
51+ syncErr = ErrPktSync
4952 }
50- return nil , ErrPktSync
53+
54+ if prevData != nil {
55+ return nil , syncErr
56+ } else {
57+ // log and ignore seqno mismatch error.
58+ // MySQL sometimes sends wrong sequence no.
59+ mc .cfg .Logger .Print (syncErr )
60+ mc .sequence = data [3 ] + 1
61+ }
62+ } else {
63+ mc .sequence ++
5164 }
52- mc .sequence ++
5365
5466 // packets with length 0 terminate a previous packet which is a
5567 // multiple of (2^24)-1 bytes long
@@ -111,18 +123,29 @@ func (mc *mysqlConn) writePacket(data []byte) error {
111123 }
112124 var err error
113125 if mc .cfg .CheckConnLiveness {
114- if mc .cfg .ReadTimeout != 0 {
115- err = conn .SetReadDeadline (time .Now ().Add (mc .cfg .ReadTimeout ))
116- }
117- if err == nil {
118- err = connCheck (conn )
126+ err = connCheck (conn )
127+ if err != nil {
128+ if err == errUnexpectedEvent {
129+ _ = conn .SetReadDeadline (time .Now ().Add (time .Second ))
130+ var data []byte
131+ data , err = mc .readPacket ()
132+
133+ if err == nil {
134+ if data [0 ] == iERR {
135+ err = mc .handleErrorPacket (data )
136+ } else {
137+ err = fmt .Errorf ("unexpected packet: % x" , data [:128 ])
138+ }
139+ } else {
140+ err = fmt .Errorf ("readPacket(): %w" , err )
141+ }
142+ }
143+
144+ mc .cfg .Logger .Print ("checkConn() failed: " , err )
145+ mc .Close ()
146+ return driver .ErrBadConn
119147 }
120148 }
121- if err != nil {
122- mc .cfg .Logger .Print ("closing bad idle connection: " , err )
123- mc .Close ()
124- return driver .ErrBadConn
125- }
126149 }
127150
128151 for {
0 commit comments