From 5e7413be5cfba65369553f48c96d8d0a8bdb0f22 Mon Sep 17 00:00:00 2001 From: Wei-Chiu Chuang Date: Fri, 17 May 2024 11:16:32 -0700 Subject: [PATCH 1/2] HDDS-10874. Freon tool DNRPCLoadGenerator should not cache client objects. Change-Id: Icc1adf11db4d07e970414e7d1cafcd22ad4ba40d --- .../hadoop/hdds/scm/XceiverClientFactory.java | 2 + .../hadoop/hdds/scm/XceiverClientManager.java | 59 +++++++++++-------- .../client/MockXceiverClientFactory.java | 6 ++ .../ozone/freon/DNRPCLoadGenerator.java | 4 +- 4 files changed, 45 insertions(+), 26 deletions(-) diff --git a/hadoop-hdds/client/src/main/java/org/apache/hadoop/hdds/scm/XceiverClientFactory.java b/hadoop-hdds/client/src/main/java/org/apache/hadoop/hdds/scm/XceiverClientFactory.java index 36c134b87a4d..eead60f08b92 100644 --- a/hadoop-hdds/client/src/main/java/org/apache/hadoop/hdds/scm/XceiverClientFactory.java +++ b/hadoop-hdds/client/src/main/java/org/apache/hadoop/hdds/scm/XceiverClientFactory.java @@ -42,4 +42,6 @@ XceiverClientSpi acquireClient(Pipeline pipeline, boolean topologyAware) void releaseClient(XceiverClientSpi xceiverClient, boolean invalidateClient, boolean topologyAware); + XceiverClientSpi acquireClientUncached(Pipeline pipeline, boolean topologyAware) + throws Exception; } diff --git a/hadoop-hdds/client/src/main/java/org/apache/hadoop/hdds/scm/XceiverClientManager.java b/hadoop-hdds/client/src/main/java/org/apache/hadoop/hdds/scm/XceiverClientManager.java index f77670a454aa..2ca0794775ae 100644 --- a/hadoop-hdds/client/src/main/java/org/apache/hadoop/hdds/scm/XceiverClientManager.java +++ b/hadoop-hdds/client/src/main/java/org/apache/hadoop/hdds/scm/XceiverClientManager.java @@ -187,6 +187,39 @@ public XceiverClientSpi acquireClient(Pipeline pipeline, } } + /** + * Similar to acquireClient() but does not use the cache. + * User must close the client explicitly after use. + * @param pipeline pipeline + * @param topologyAware topology aware + * @return XceiverClientSpi object + * @throws IOException + */ + @Override + public XceiverClientSpi acquireClientUncached(Pipeline pipeline, + boolean topologyAware) throws + Exception { + HddsProtos.ReplicationType type = pipeline.getType(); + XceiverClientSpi client = null; + switch (type) { + case RATIS: + client = XceiverClientRatis.newXceiverClientRatis(pipeline, conf, + trustManager); + break; + case STAND_ALONE: + client = new XceiverClientGrpc(pipeline, conf, trustManager); + break; + case EC: + client = new ECXceiverClientGrpc(pipeline, conf, trustManager); + break; + case CHAINED: + default: + throw new IOException("not implemented " + pipeline.getType()); + } + client.connect(); + return client; + } + /** * Releases a XceiverClientSpi after use. * @@ -229,34 +262,12 @@ public void releaseClient(XceiverClientSpi client, boolean invalidateClient, private XceiverClientSpi getClient(Pipeline pipeline, boolean topologyAware) throws IOException { - HddsProtos.ReplicationType type = pipeline.getType(); try { // create different client different pipeline node based on // network topology String key = getPipelineCacheKey(pipeline, topologyAware); - return clientCache.get(key, new Callable() { - @Override - public XceiverClientSpi call() throws Exception { - XceiverClientSpi client = null; - switch (type) { - case RATIS: - client = XceiverClientRatis.newXceiverClientRatis(pipeline, conf, - trustManager); - break; - case STAND_ALONE: - client = new XceiverClientGrpc(pipeline, conf, trustManager); - break; - case EC: - client = new ECXceiverClientGrpc(pipeline, conf, trustManager); - break; - case CHAINED: - default: - throw new IOException("not implemented " + pipeline.getType()); - } - client.connect(); - return client; - } - }); + return clientCache.get(key, + () -> acquireClientUncached(pipeline, topologyAware)); } catch (Exception e) { throw new IOException( "Exception getting XceiverClient: " + e.toString(), e); diff --git a/hadoop-ozone/client/src/test/java/org/apache/hadoop/ozone/client/MockXceiverClientFactory.java b/hadoop-ozone/client/src/test/java/org/apache/hadoop/ozone/client/MockXceiverClientFactory.java index 6edcca65f926..17f1888dd266 100644 --- a/hadoop-ozone/client/src/test/java/org/apache/hadoop/ozone/client/MockXceiverClientFactory.java +++ b/hadoop-ozone/client/src/test/java/org/apache/hadoop/ozone/client/MockXceiverClientFactory.java @@ -121,6 +121,12 @@ public XceiverClientSpi acquireClient(Pipeline pipeline, return mockXceiverClientSpi; } + @Override + public XceiverClientSpi acquireClientUncached(Pipeline pipeline, + boolean topologyAware) throws IOException { + return acquireClient(pipeline, topologyAware); + } + @Override public void releaseClient(XceiverClientSpi xceiverClient, boolean invalidateClient, boolean topologyAware) { diff --git a/hadoop-ozone/tools/src/main/java/org/apache/hadoop/ozone/freon/DNRPCLoadGenerator.java b/hadoop-ozone/tools/src/main/java/org/apache/hadoop/ozone/freon/DNRPCLoadGenerator.java index 5d3d3af9e1c4..39f315daf433 100644 --- a/hadoop-ozone/tools/src/main/java/org/apache/hadoop/ozone/freon/DNRPCLoadGenerator.java +++ b/hadoop-ozone/tools/src/main/java/org/apache/hadoop/ozone/freon/DNRPCLoadGenerator.java @@ -160,7 +160,7 @@ public Void call() throws Exception { } clients = new ArrayList<>(numClients); for (int i = 0; i < numClients; i++) { - clients.add(xceiverClientManager.acquireClient(pipeline)); + clients.add(xceiverClientManager.acquireClientUncached(pipeline, true)); } init(); @@ -171,7 +171,7 @@ public Void call() throws Exception { runTests(this::sendRPCReq); } finally { for (XceiverClientSpi client : clients) { - xceiverClientManager.releaseClient(client, false); + client.close(); } xceiverClientManager.close(); scmClient.close(); From c81ff3e8286f985a0a8c0923a168e1d164a2c74f Mon Sep 17 00:00:00 2001 From: Wei-Chiu Chuang Date: Fri, 17 May 2024 12:32:57 -0700 Subject: [PATCH 2/2] Fix checkstyle. Change-Id: Ia22492a6633c65e00ef5f23d84e38db1a364c61f --- .../java/org/apache/hadoop/hdds/scm/XceiverClientManager.java | 1 - 1 file changed, 1 deletion(-) diff --git a/hadoop-hdds/client/src/main/java/org/apache/hadoop/hdds/scm/XceiverClientManager.java b/hadoop-hdds/client/src/main/java/org/apache/hadoop/hdds/scm/XceiverClientManager.java index 2ca0794775ae..0be839578c39 100644 --- a/hadoop-hdds/client/src/main/java/org/apache/hadoop/hdds/scm/XceiverClientManager.java +++ b/hadoop-hdds/client/src/main/java/org/apache/hadoop/hdds/scm/XceiverClientManager.java @@ -19,7 +19,6 @@ package org.apache.hadoop.hdds.scm; import java.io.IOException; -import java.util.concurrent.Callable; import java.util.concurrent.TimeUnit; import org.apache.hadoop.hdds.conf.Config;