@@ -362,14 +362,31 @@ public async Task<bool> TryResetConnectionAsync(ConnectionSettings cs, IOBehavio
362
362
{
363
363
m_logArguments [ 1 ] = ServerVersion . OriginalString ;
364
364
Log . Debug ( "Session{0} ServerVersion={1} supports reset connection; sending reset connection request" , m_logArguments ) ;
365
- await SendAsync ( ResetConnectionPayload . Instance , ioBehavior , cancellationToken ) . ConfigureAwait ( false ) ;
366
- var payload = await ReceiveReplyAsync ( ioBehavior , cancellationToken ) . ConfigureAwait ( false ) ;
367
- OkPayload . Create ( payload ) ;
365
+ if ( m_payloadHandler is StandardPayloadHandler standardPayloadHandler )
366
+ {
367
+ // send both packets at once
368
+ await standardPayloadHandler . ByteHandler . WriteBytesAsync ( s_resetConnectionPackets , ioBehavior ) . ConfigureAwait ( false ) ;
368
369
369
- // the "reset connection" packet also resets the connection charset, so we need to change that back to our default
370
- await SendAsync ( s_setNamesUtf8mb4Payload , ioBehavior , cancellationToken ) . ConfigureAwait ( false ) ;
371
- payload = await ReceiveReplyAsync ( ioBehavior , cancellationToken ) . ConfigureAwait ( false ) ;
372
- OkPayload . Create ( payload ) ;
370
+ // read two OK replies
371
+ standardPayloadHandler . SetNextSequenceNumber ( 1 ) ;
372
+ var payload = await ReceiveReplyAsync ( ioBehavior , cancellationToken ) . ConfigureAwait ( false ) ;
373
+ OkPayload . Create ( payload ) ;
374
+
375
+ standardPayloadHandler . SetNextSequenceNumber ( 1 ) ;
376
+ payload = await ReceiveReplyAsync ( ioBehavior , cancellationToken ) . ConfigureAwait ( false ) ;
377
+ OkPayload . Create ( payload ) ;
378
+ }
379
+ else
380
+ {
381
+ await SendAsync ( ResetConnectionPayload . Instance , ioBehavior , cancellationToken ) . ConfigureAwait ( false ) ;
382
+ var payload = await ReceiveReplyAsync ( ioBehavior , cancellationToken ) . ConfigureAwait ( false ) ;
383
+ OkPayload . Create ( payload ) ;
384
+
385
+ // the "reset connection" packet also resets the connection charset, so we need to change that back to our default
386
+ await SendAsync ( s_setNamesUtf8mb4Payload , ioBehavior , cancellationToken ) . ConfigureAwait ( false ) ;
387
+ payload = await ReceiveReplyAsync ( ioBehavior , cancellationToken ) . ConfigureAwait ( false ) ;
388
+ OkPayload . Create ( payload ) ;
389
+ }
373
390
}
374
391
else
375
392
{
@@ -1202,6 +1219,11 @@ private enum State
1202
1219
static byte [ ] s_connectionAttributes ;
1203
1220
static readonly IMySqlConnectorLogger Log = MySqlConnectorLogManager . CreateLogger ( nameof ( ServerSession ) ) ;
1204
1221
static readonly PayloadData s_setNamesUtf8mb4Payload = QueryPayload . Create ( "SET NAMES utf8mb4 COLLATE utf8mb4_bin;" ) ;
1222
+ static readonly ArraySegment < byte > s_resetConnectionPackets = new ArraySegment < byte > ( new byte [ ]
1223
+ {
1224
+ 1 , 0 , 0 , 0 , ( byte ) CommandKind . ResetConnection ,
1225
+ 39 , 0 , 0 , 0 , ( byte ) CommandKind . Query , 83 , 69 , 84 , 32 , 78 , 65 , 77 , 69 , 83 , 32 , 117 , 116 , 102 , 56 , 109 , 98 , 52 , 32 , 67 , 79 , 76 , 76 , 65 , 84 , 69 , 32 , 117 , 116 , 102 , 56 , 109 , 98 , 52 , 95 , 98 , 105 , 110 , 59 // SET NAMES utf8mb4 COLLATE utf8mb4_bin;
1226
+ } ) ;
1205
1227
1206
1228
readonly object m_lock ;
1207
1229
readonly object [ ] m_logArguments ;
0 commit comments