Skip to content

Commit

Permalink
try/catch send in TryPingAsync. fixes #150
Browse files Browse the repository at this point in the history
  • Loading branch information
caleblloyd committed Dec 15, 2016
1 parent 75d0c9c commit 04d6e47
Show file tree
Hide file tree
Showing 2 changed files with 35 additions and 2 deletions.
7 changes: 6 additions & 1 deletion src/MySqlConnector/Serialization/MySqlSession.cs
Expand Up @@ -138,9 +138,14 @@ public async Task ResetConnectionAsync(ConnectionSettings cs, IOBehavior ioBehav

public async Task<bool> TryPingAsync(IOBehavior ioBehavior, CancellationToken cancellationToken)
{
await SendAsync(PingPayload.Create(), ioBehavior, cancellationToken).ConfigureAwait(false);
// check if client socket is still connected
// http://stackoverflow.com/questions/2661764/how-to-check-if-a-socket-is-connected-disconnected-in-c
if (m_socket.Poll(1, SelectMode.SelectRead) && m_socket.Available == 0)
return false;
// client socket is still connected, send ping payload to verify server socket is still connected
try
{
await SendAsync(PingPayload.Create(), ioBehavior, cancellationToken).ConfigureAwait(false);
var payload = await ReceiveReplyAsync(ioBehavior, cancellationToken).ConfigureAwait(false);
OkPayload.Create(payload);
return true;
Expand Down
30 changes: 29 additions & 1 deletion tests/SideBySide.New/ConnectionPool.cs
@@ -1,6 +1,5 @@
using System;
using System.Collections.Generic;
using System.Data.Common;
using System.Diagnostics;
using System.Linq;
using System.Threading;
Expand Down Expand Up @@ -131,6 +130,35 @@ public async Task ExhaustConnectionPoolWithTimeout()
connection.Dispose();
}

[Fact]
public async Task WaitTimeout()
{
var csb = AppConfig.CreateConnectionStringBuilder();
csb.Pooling = true;
csb.MinimumPoolSize = 0;
csb.MaximumPoolSize = 1;
int serverThread;

using (var connection = new MySqlConnection(csb.ConnectionString))
{
await connection.OpenAsync();
using (var cmd = connection.CreateCommand())
{
cmd.CommandText = "SET @@session.wait_timeout=3";
await cmd.ExecuteNonQueryAsync();
}
serverThread = connection.ServerThread;
}

await Task.Delay(TimeSpan.FromSeconds(5));

using (var connection = new MySqlConnection(csb.ConnectionString))
{
await connection.OpenAsync();
Assert.NotEqual(serverThread, connection.ServerThread);
}
}

[Fact]
public async Task CharacterSet()
{
Expand Down

0 comments on commit 04d6e47

Please sign in to comment.