GEODE-8835: Increment connection count if create successfully (#5907)
diff --git a/geode-core/src/integrationTest/java/org/apache/geode/cache/client/internal/pooling/ConnectionManagerImplTest.java b/geode-core/src/integrationTest/java/org/apache/geode/cache/client/internal/pooling/ConnectionManagerImplTest.java
index a72a5b5..6a95516 100644
--- a/geode-core/src/integrationTest/java/org/apache/geode/cache/client/internal/pooling/ConnectionManagerImplTest.java
+++ b/geode-core/src/integrationTest/java/org/apache/geode/cache/client/internal/pooling/ConnectionManagerImplTest.java
@@ -490,4 +490,35 @@
connectionManager.close(false);
}
+
+ @Test
+ public void exchangeNotIncrementConnectionCountWhenUnableToCreateConnection() {
+ Set<ServerLocation> excluded = Collections.emptySet();
+
+ ServerLocation serverLocation1 = mock(ServerLocation.class);
+ Connection connection1 = mock(Connection.class);
+ when(connectionFactory.createClientToServerConnection(serverLocation1, false))
+ .thenReturn(connection1);
+
+ ServerLocation serverLocation2 = mock(ServerLocation.class);
+ Endpoint endpoint2 = mock(Endpoint.class);
+ Connection connection2 = mock(Connection.class);
+ when(connectionFactory.createClientToServerConnection(eq(Collections.EMPTY_SET)))
+ .thenReturn(null);
+ when(connection2.getServer()).thenReturn(serverLocation2);
+ when(connection2.getEndpoint()).thenReturn(endpoint2);
+ when(endpoint2.getLocation()).thenReturn(serverLocation2);
+
+ connectionManager = createDefaultConnectionManager();
+ connectionManager.start(backgroundProcessor);
+
+ Connection heldConnection = connectionManager.borrowConnection(serverLocation1, timeout, false);
+ assertThatThrownBy(() -> connectionManager.exchangeConnection(heldConnection, excluded))
+ .isInstanceOf(NoAvailableServersException.class);
+
+ assertThat(connectionManager.getConnectionCount()).isEqualTo(1);
+ verify(connectionFactory, times(1)).createClientToServerConnection(Collections.EMPTY_SET);
+
+ connectionManager.close(false);
+ }
}
diff --git a/geode-core/src/main/java/org/apache/geode/cache/client/internal/pooling/ConnectionManagerImpl.java b/geode-core/src/main/java/org/apache/geode/cache/client/internal/pooling/ConnectionManagerImpl.java
index 01b826e..d8f82ac 100644
--- a/geode-core/src/main/java/org/apache/geode/cache/client/internal/pooling/ConnectionManagerImpl.java
+++ b/geode-core/src/main/java/org/apache/geode/cache/client/internal/pooling/ConnectionManagerImpl.java
@@ -224,8 +224,11 @@
*/
private PooledConnection forceCreateConnection(Set<ServerLocation> excludedServers)
throws NoAvailableServersException, ServerOperationException {
- connectionAccounting.create();
- return createPooledConnection(excludedServers);
+ PooledConnection pooledConnection = createPooledConnection(excludedServers);
+ if (pooledConnection != null) {
+ connectionAccounting.create();
+ }
+ return pooledConnection;
}
private boolean checkShutdownInterruptedOrTimeout(final long timeout)