HDFS-13232. RBF: ConnectionPool should return first usable connection. Contributed by Ekanth S.
Project: http://git-wip-us.apache.org/repos/asf/hadoop/repo Commit: http://git-wip-us.apache.org/repos/asf/hadoop/commit/8133cd53 Tree: http://git-wip-us.apache.org/repos/asf/hadoop/tree/8133cd53 Diff: http://git-wip-us.apache.org/repos/asf/hadoop/diff/8133cd53 Branch: refs/heads/HDFS-12996 Commit: 8133cd5305d7913453abb2d48da12f672c0ce334 Parents: afe1a3c Author: Inigo Goiri <inigo...@apache.org> Authored: Fri Mar 9 18:25:05 2018 -0800 Committer: Inigo Goiri <inigo...@apache.org> Committed: Fri Mar 9 18:25:05 2018 -0800 ---------------------------------------------------------------------- .../federation/router/ConnectionPool.java | 2 +- .../router/TestConnectionManager.java | 43 ++++++++++++++++++++ 2 files changed, 44 insertions(+), 1 deletion(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/hadoop/blob/8133cd53/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/federation/router/ConnectionPool.java ---------------------------------------------------------------------- diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/federation/router/ConnectionPool.java b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/federation/router/ConnectionPool.java index 5c77c59..5af8a86 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/federation/router/ConnectionPool.java +++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/federation/router/ConnectionPool.java @@ -159,7 +159,7 @@ public class ConnectionPool { for (int i=0; i<size; i++) { int index = (threadIndex + i) % size; conn = tmpConnections.get(index); - if (conn != null && !conn.isUsable()) { + if (conn != null && conn.isUsable()) { return conn; } } http://git-wip-us.apache.org/repos/asf/hadoop/blob/8133cd53/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/federation/router/TestConnectionManager.java ---------------------------------------------------------------------- diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/federation/router/TestConnectionManager.java b/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/federation/router/TestConnectionManager.java index fe9f195..741d1f6 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/federation/router/TestConnectionManager.java +++ b/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/federation/router/TestConnectionManager.java @@ -28,6 +28,7 @@ import java.io.IOException; import java.util.Map; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; /** * Test functionalities of {@link ConnectionManager}, which manages a pool @@ -41,6 +42,8 @@ public class TestConnectionManager { UserGroupInformation.createUserForTesting("user1", TEST_GROUP); private static final UserGroupInformation TEST_USER2 = UserGroupInformation.createUserForTesting("user2", TEST_GROUP); + private static final UserGroupInformation TEST_USER3 = + UserGroupInformation.createUserForTesting("user3", TEST_GROUP); private static final String TEST_NN_ADDRESS = "nn1:8080"; @Before @@ -87,6 +90,46 @@ public class TestConnectionManager { connManager.cleanup(pool1); checkPoolConnections(TEST_USER1, 8, 4); checkPoolConnections(TEST_USER2, 10, 10); + + // Make sure the number of connections doesn't go below minSize + ConnectionPool pool3 = new ConnectionPool( + conf, TEST_NN_ADDRESS, TEST_USER3, 2, 10); + addConnectionsToPool(pool3, 10, 0); + poolMap.put(new ConnectionPoolId(TEST_USER2, TEST_NN_ADDRESS), pool3); + connManager.cleanup(pool3); + checkPoolConnections(TEST_USER3, 2, 0); + // With active connections added to pool, make sure it honors the + // MIN_ACTIVE_RATIO again + addConnectionsToPool(pool3, 10, 2); + connManager.cleanup(pool3); + checkPoolConnections(TEST_USER3, 4, 2); + } + + @Test + public void testGetConnection() throws Exception { + Map<ConnectionPoolId, ConnectionPool> poolMap = connManager.getPools(); + final int totalConns = 10; + int activeConns = 5; + + ConnectionPool pool = new ConnectionPool( + conf, TEST_NN_ADDRESS, TEST_USER1, 0, 10); + addConnectionsToPool(pool, totalConns, activeConns); + poolMap.put(new ConnectionPoolId(TEST_USER1, TEST_NN_ADDRESS), pool); + + // All remaining connections should be usable + final int remainingSlots = totalConns - activeConns; + for (int i = 0; i < remainingSlots; i++) { + ConnectionContext cc = pool.getConnection(); + assertTrue(cc.isUsable()); + cc.getClient(); + activeConns++; + } + + checkPoolConnections(TEST_USER1, totalConns, activeConns); + + // Ask for more and this returns an active connection + ConnectionContext cc = pool.getConnection(); + assertTrue(cc.isActive()); } private void addConnectionsToPool(ConnectionPool pool, int numTotalConn, --------------------------------------------------------------------- To unsubscribe, e-mail: common-commits-unsubscr...@hadoop.apache.org For additional commands, e-mail: common-commits-h...@hadoop.apache.org