Prevented driver from decrementing open connection count when replacing a connection
Depending on the configuration and if connection replacement was high, this number could sometimes go negative. Project: http://git-wip-us.apache.org/repos/asf/tinkerpop/repo Commit: http://git-wip-us.apache.org/repos/asf/tinkerpop/commit/f198ce1e Tree: http://git-wip-us.apache.org/repos/asf/tinkerpop/tree/f198ce1e Diff: http://git-wip-us.apache.org/repos/asf/tinkerpop/diff/f198ce1e Branch: refs/heads/TINKERPOP-1352 Commit: f198ce1e714c9f2daa140e9832c6f97f29d866a8 Parents: e0b6dc4 Author: Stephen Mallette <[email protected]> Authored: Fri Jul 1 07:40:37 2016 -0400 Committer: Stephen Mallette <[email protected]> Committed: Fri Jul 1 07:40:37 2016 -0400 ---------------------------------------------------------------------- .../tinkerpop/gremlin/driver/ConnectionPool.java | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/f198ce1e/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/ConnectionPool.java ---------------------------------------------------------------------- diff --git a/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/ConnectionPool.java b/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/ConnectionPool.java index 96cb81b..9955e82 100644 --- a/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/ConnectionPool.java +++ b/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/ConnectionPool.java @@ -232,10 +232,6 @@ final class ConnectionPool { return closeFuture.compareAndSet(null, future) ? future : closeFuture.get(); } - public int opened() { - return open.get(); - } - private CompletableFuture[] killAvailableConnections() { final List<CompletableFuture<Void>> futures = new ArrayList<>(connections.size()); for (Connection connection : connections) { @@ -321,15 +317,18 @@ final class ConnectionPool { } private void definitelyDestroyConnection(final Connection connection) { - bin.add(connection); - connections.remove(connection); - open.decrementAndGet(); + // only add to the bin for future removal if its not already there. + if (!bin.contains(connection)) { + bin.add(connection); + connections.remove(connection); + open.decrementAndGet(); + } - if (connection.borrowed.get() == 0 && bin.remove(connection)) + // only close the connection for good once it is done being borrowed + if (connection.borrowed.get() == 0 && bin.remove(connection)) { connection.closeAsync(); - - if (logger.isDebugEnabled()) logger.debug("{} destroyed", connection.getConnectionInfo()); + } } private Connection waitForConnection(final long timeout, final TimeUnit unit) throws TimeoutException, ConnectionException {
