From 22e6ab705684c973345efd07ca5b4741b1f60eb0 Mon Sep 17 00:00:00 2001 From: Bradley Grainger Date: Wed, 15 Feb 2017 17:58:21 -0800 Subject: [PATCH 1/2] Explicitly wait for asynchronous method. The method completes synchronously, so the waiting isn't strictly necessary. However, the new code will rethrow any exception that the returned Task may have captured, which is useful for correctness (not that Dispose should throw an exception). Additionally, a call to `ConfigureAwait` without an `await` is confusing; this new code now uses the "standard" pattern for synchronously calling an async method. --- src/MySqlConnector/MySqlClient/ConnectionPool.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/MySqlConnector/MySqlClient/ConnectionPool.cs b/src/MySqlConnector/MySqlClient/ConnectionPool.cs index 7e5d42e8d..851bdb866 100644 --- a/src/MySqlConnector/MySqlClient/ConnectionPool.cs +++ b/src/MySqlConnector/MySqlClient/ConnectionPool.cs @@ -61,7 +61,7 @@ public void Return(MySqlSession session) if (session.PoolGeneration == m_generation) m_sessions.Enqueue(session); else - session.DisposeAsync(IOBehavior.Synchronous, CancellationToken.None).ConfigureAwait(false); + session.DisposeAsync(IOBehavior.Synchronous, CancellationToken.None).GetAwaiter().GetResult(); } finally { From 56ccf87b5629c6c1c19ba4eb22a63737a79ed378 Mon Sep 17 00:00:00 2001 From: Bradley Grainger Date: Wed, 15 Feb 2017 18:59:14 -0800 Subject: [PATCH 2/2] Reset connection when returned to pool. Fixes #178 --- .../MySqlClient/ConnectionPool.cs | 21 ++++++++++++++----- tests/SideBySide.New/ConnectionPool.cs | 1 + 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/src/MySqlConnector/MySqlClient/ConnectionPool.cs b/src/MySqlConnector/MySqlClient/ConnectionPool.cs index 851bdb866..720d343de 100644 --- a/src/MySqlConnector/MySqlClient/ConnectionPool.cs +++ b/src/MySqlConnector/MySqlClient/ConnectionPool.cs @@ -33,11 +33,6 @@ public async Task GetSessionAsync(IOBehavior ioBehavior, Cancellat } else { - // session is valid, reset if supported - if (m_connectionSettings.ConnectionReset) - { - await session.ResetConnectionAsync(m_connectionSettings, ioBehavior, cancellationToken).ConfigureAwait(false); - } // pooled session is ready to be used; return it return session; } @@ -58,7 +53,23 @@ public void Return(MySqlSession session) { try { + var success = false; + if (session.PoolGeneration == m_generation) + { + try + { + // reset the connection upon returning it to the pool + if (m_connectionSettings.ConnectionReset) + session.ResetConnectionAsync(m_connectionSettings, IOBehavior.Synchronous, CancellationToken.None).GetAwaiter().GetResult(); + success = true; + } + catch (MySqlException) + { + } + } + + if (success) m_sessions.Enqueue(session); else session.DisposeAsync(IOBehavior.Synchronous, CancellationToken.None).GetAwaiter().GetResult(); diff --git a/tests/SideBySide.New/ConnectionPool.cs b/tests/SideBySide.New/ConnectionPool.cs index c61d5b272..5d93c27ff 100644 --- a/tests/SideBySide.New/ConnectionPool.cs +++ b/tests/SideBySide.New/ConnectionPool.cs @@ -137,6 +137,7 @@ public async Task WaitTimeout() csb.Pooling = true; csb.MinimumPoolSize = 0; csb.MaximumPoolSize = 1; + csb.ConnectionReset = false; int serverThread; using (var connection = new MySqlConnection(csb.ConnectionString))