Add check for connection state before returning it TINKERPOP-1978
Project: http://git-wip-us.apache.org/repos/asf/tinkerpop/repo Commit: http://git-wip-us.apache.org/repos/asf/tinkerpop/commit/c4a25472 Tree: http://git-wip-us.apache.org/repos/asf/tinkerpop/tree/c4a25472 Diff: http://git-wip-us.apache.org/repos/asf/tinkerpop/diff/c4a25472 Branch: refs/heads/tp33 Commit: c4a254726167d798617331ff3dd00ece97377b2d Parents: 32aebb8 Author: Florian Hockmann <f...@florian-hockmann.de> Authored: Sat Jun 23 12:24:15 2018 +0200 Committer: Florian Hockmann <f...@florian-hockmann.de> Committed: Sat Jun 23 12:24:15 2018 +0200 ---------------------------------------------------------------------- .../src/Gremlin.Net/Driver/ConnectionPool.cs | 26 +++++++++++++------- 1 file changed, 17 insertions(+), 9 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/c4a25472/gremlin-dotnet/src/Gremlin.Net/Driver/ConnectionPool.cs ---------------------------------------------------------------------- diff --git a/gremlin-dotnet/src/Gremlin.Net/Driver/ConnectionPool.cs b/gremlin-dotnet/src/Gremlin.Net/Driver/ConnectionPool.cs index 9501686..d9e53f4 100644 --- a/gremlin-dotnet/src/Gremlin.Net/Driver/ConnectionPool.cs +++ b/gremlin-dotnet/src/Gremlin.Net/Driver/ConnectionPool.cs @@ -23,7 +23,6 @@ using System; using System.Collections.Concurrent; -using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Gremlin.Net.Process; @@ -45,19 +44,28 @@ namespace Gremlin.Net.Driver public async Task<IConnection> GetAvailableConnectionAsync() { - Connection connection = null; - lock (_connectionsLock) - { - if (!_connections.IsEmpty) - _connections.TryTake(out connection); - } - - if (connection == null) + if (!TryGetConnectionFromPool(out var connection)) connection = await CreateNewConnectionAsync().ConfigureAwait(false); return new ProxyConnection(connection, AddConnectionIfOpen); } + private bool TryGetConnectionFromPool(out Connection connection) + { + while (true) + { + connection = null; + lock (_connectionsLock) + { + if (_connections.IsEmpty) return false; + _connections.TryTake(out connection); + } + + if (connection.IsOpen) return true; + connection.Dispose(); + } + } + private async Task<Connection> CreateNewConnectionAsync() { NrConnections++;