This is an automated email from the ASF dual-hosted git repository.
adoroszlai pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/ozone.git
The following commit(s) were added to refs/heads/master by this push:
new 82d2759595 HDDS-9893. Client in clientCache is not properly
invalidated with security enabled (#5780)
82d2759595 is described below
commit 82d27595958f70a7468a38899bf48b2208bebe64
Author: Sammi Chen <[email protected]>
AuthorDate: Thu Dec 14 17:29:12 2023 +0800
HDDS-9893. Client in clientCache is not properly invalidated with security
enabled (#5780)
---
.../hadoop/hdds/scm/XceiverClientManager.java | 15 +++++++++++----
.../hadoop/ozone/scm/TestXceiverClientManager.java | 22 ++++++++++++++++------
2 files changed, 27 insertions(+), 10 deletions(-)
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 46bd7e5345..62156c7e40 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
@@ -235,10 +235,6 @@ public class XceiverClientManager implements Closeable,
XceiverClientFactory {
// create different client different pipeline node based on
// network topology
String key = getPipelineCacheKey(pipeline, topologyAware);
- // Append user short name to key to prevent a different user
- // from using same instance of xceiverClient.
- key = isSecurityEnabled ?
- key + UserGroupInformation.getCurrentUser().getShortUserName() : key;
return clientCache.get(key, new Callable<XceiverClientSpi>() {
@Override
public XceiverClientSpi call() throws Exception {
@@ -297,6 +293,17 @@ public class XceiverClientManager implements Closeable,
XceiverClientFactory {
e.getMessage());
}
}
+
+ if (isSecurityEnabled) {
+ // Append user short name to key to prevent a different user
+ // from using same instance of xceiverClient.
+ try {
+ key += UserGroupInformation.getCurrentUser().getShortUserName();
+ } catch (IOException e) {
+ LOG.error("Failed to get current user to create pipeline cache key:" +
+ e.getMessage());
+ }
+ }
return key;
}
diff --git
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/scm/TestXceiverClientManager.java
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/scm/TestXceiverClientManager.java
index 69a08603b3..9130a87b1a 100644
---
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/scm/TestXceiverClientManager.java
+++
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/scm/TestXceiverClientManager.java
@@ -19,6 +19,7 @@ package org.apache.hadoop.ozone.scm;
import com.google.common.cache.Cache;
import org.apache.hadoop.hdds.scm.XceiverClientManager.ScmClientConfig;
+import org.apache.hadoop.hdds.scm.client.ClientTrustManager;
import
org.apache.hadoop.hdds.scm.container.common.helpers.ContainerWithPipeline;
import org.apache.hadoop.io.IOUtils;
import org.apache.hadoop.ozone.MiniOzoneCluster;
@@ -37,11 +38,15 @@ import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.Timeout;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.ValueSource;
import java.io.IOException;
import java.util.UUID;
import static org.apache.hadoop.hdds.HddsConfigKeys.HDDS_METADATA_DIR_NAME;
+import static
org.apache.hadoop.ozone.OzoneConfigKeys.OZONE_SECURITY_ENABLED_KEY;
+import static org.mockito.Mockito.mock;
/**
* Test for XceiverClientManager caching and eviction.
@@ -73,14 +78,18 @@ public class TestXceiverClientManager {
IOUtils.cleanupWithLogger(null, storageContainerLocationClient);
}
- @Test
- public void testCaching() throws IOException {
+ @ParameterizedTest(name = "Ozone security enabled: {0}")
+ @ValueSource(booleans = {false, true})
+ public void testCaching(boolean securityEnabled) throws IOException {
OzoneConfiguration conf = new OzoneConfiguration();
+ conf.setBoolean(OZONE_SECURITY_ENABLED_KEY, securityEnabled);
String metaDir = GenericTestUtils.getTempPath(
TestXceiverClientManager.class.getName() + UUID.randomUUID());
conf.set(HDDS_METADATA_DIR_NAME, metaDir);
- try (XceiverClientManager clientManager = new XceiverClientManager(conf)) {
+ ClientTrustManager trustManager = mock(ClientTrustManager.class);
+ try (XceiverClientManager clientManager = new XceiverClientManager(conf,
+ conf.getObject(ScmClientConfig.class), trustManager)) {
ContainerWithPipeline container1 = storageContainerLocationClient
.allocateContainer(
@@ -105,9 +114,10 @@ public class TestXceiverClientManager {
Assertions.assertEquals(2, client3.getRefcount());
Assertions.assertEquals(2, client1.getRefcount());
Assertions.assertEquals(client1, client3);
- clientManager.releaseClient(client1, false);
- clientManager.releaseClient(client2, false);
- clientManager.releaseClient(client3, false);
+ clientManager.releaseClient(client1, true);
+ clientManager.releaseClient(client2, true);
+ clientManager.releaseClient(client3, true);
+ Assertions.assertTrue(clientManager.getClientCache().size() == 0);
}
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]