From 39e0a711f9e8c340364fe8402b1410a7cbe6b7b1 Mon Sep 17 00:00:00 2001 From: Tsz-Wo Nicholas Sze Date: Mon, 9 Jun 2025 10:57:55 -0700 Subject: [PATCH 1/8] HDDS-13216. Standardize Container[Replica]NotFoundException messages. --- .../scm/container/ContainerException.java | 19 ---------- .../container/ContainerNotFoundException.java | 24 ++++++------- .../ContainerReplicaNotFoundException.java | 17 ++++----- .../ozoneimpl/ContainerController.java | 3 +- .../scm/container/ContainerManagerImpl.java | 35 ++++++++----------- .../scm/container/balancer/MoveManager.java | 2 +- .../container/TestUnknownContainerReport.java | 2 +- ...estContainerBalancerDatanodeNodeLimit.java | 2 +- .../container/balancer/TestMoveManager.java | 2 +- .../TestWritableECContainerProvider.java | 2 +- 10 files changed, 38 insertions(+), 70 deletions(-) diff --git a/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/scm/container/ContainerException.java b/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/scm/container/ContainerException.java index 2d45b155adb1..7ebe0ff8874c 100644 --- a/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/scm/container/ContainerException.java +++ b/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/scm/container/ContainerException.java @@ -25,25 +25,6 @@ */ public class ContainerException extends SCMException { - /** - * Constructs a {@code ContainerException} with {@code null} - * as its result code.

- * Required for Unwrapping {@code RemoteException}. Used by - * {@link org.apache.hadoop.ipc.RemoteException#unwrapRemoteException()} - */ - public ContainerException(String message) { - super(message); - } - - /** - * Constructs an {@code ContainerException} with {@code null} - * as its error detail message. - * @param resultCode ResultCode for the exception - */ - public ContainerException(ResultCodes resultCode) { - super(resultCode); - } - /** * Constructs an {@code ContainerException} with the specified detail message. * diff --git a/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/scm/container/ContainerNotFoundException.java b/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/scm/container/ContainerNotFoundException.java index 3da1025572e5..c63c8ba6b986 100644 --- a/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/scm/container/ContainerNotFoundException.java +++ b/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/scm/container/ContainerNotFoundException.java @@ -22,23 +22,19 @@ */ public class ContainerNotFoundException extends ContainerException { - /** - * Constructs an {@code ContainerNotFoundException} with {@code null} - * as its error detail message. - */ public ContainerNotFoundException() { - super(ResultCodes.CONTAINER_NOT_FOUND); + this("Container not found for unknown id"); } - /** - * Constructs an {@code ContainerNotFoundException} with the specified - * detail message. - * - * @param message - * The detail message (which is saved for later retrieval - * by the {@link #getMessage()} method) - */ - public ContainerNotFoundException(String message) { + private ContainerNotFoundException(String message) { super(message, ResultCodes.CONTAINER_NOT_FOUND); } + + public ContainerNotFoundException(ContainerID containerID) { + this("Container " + containerID + " not found"); + } + + public static ContainerNotFoundException newInstanceForTesting() { + return new ContainerNotFoundException("For testing"); + } } diff --git a/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/scm/container/ContainerReplicaNotFoundException.java b/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/scm/container/ContainerReplicaNotFoundException.java index 1fa36ca9eb24..2d047739da1e 100644 --- a/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/scm/container/ContainerReplicaNotFoundException.java +++ b/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/scm/container/ContainerReplicaNotFoundException.java @@ -17,6 +17,8 @@ package org.apache.hadoop.hdds.scm.container; +import org.apache.hadoop.hdds.protocol.DatanodeDetails; + /** * Signals that a ContainerReplica is missing from the Container in * ContainerManager. @@ -28,18 +30,11 @@ public class ContainerReplicaNotFoundException extends ContainerException { * as its error detail message. */ public ContainerReplicaNotFoundException() { - super(ResultCodes.CONTAINER_REPLICA_NOT_FOUND); + this(null, null); } - /** - * Constructs an {@code ContainerReplicaNotFoundException} with the - * specified detail message. - * - * @param message - * The detail message (which is saved for later retrieval - * by the {@link #getMessage()} method) - */ - public ContainerReplicaNotFoundException(String message) { - super(message, ResultCodes.CONTAINER_REPLICA_NOT_FOUND); + public ContainerReplicaNotFoundException(ContainerID container, DatanodeDetails datanode) { + super("Replica not found for container " + container + " and datanode " + datanode, + ResultCodes.CONTAINER_REPLICA_NOT_FOUND); } } diff --git a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/ozoneimpl/ContainerController.java b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/ozoneimpl/ContainerController.java index 451b369733b2..e315e1bf4aff 100644 --- a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/ozoneimpl/ContainerController.java +++ b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/ozoneimpl/ContainerController.java @@ -29,6 +29,7 @@ import org.apache.hadoop.hdds.protocol.datanode.proto.ContainerProtos.ContainerDataProto.State; import org.apache.hadoop.hdds.protocol.datanode.proto.ContainerProtos.ContainerType; import org.apache.hadoop.hdds.protocol.proto.StorageContainerDatanodeProtocolProtos.ContainerReportsProto; +import org.apache.hadoop.hdds.scm.container.ContainerID; import org.apache.hadoop.hdds.scm.container.ContainerNotFoundException; import org.apache.hadoop.ozone.container.common.impl.ContainerData; import org.apache.hadoop.ozone.container.common.impl.ContainerSet; @@ -93,7 +94,7 @@ public void markContainerForClose(final long containerId) warning = "The Container is not found. ContainerID: " + containerId; } LOG.warn(warning); - throw new ContainerNotFoundException(warning); + throw new ContainerNotFoundException(ContainerID.valueOf(containerId)); } else { if (container.getContainerState() == State.OPEN) { getHandler(container).markContainerForClose(container); diff --git a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/ContainerManagerImpl.java b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/ContainerManagerImpl.java index 2e6bfa6f3dd3..81de8f8b5cab 100644 --- a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/ContainerManagerImpl.java +++ b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/ContainerManagerImpl.java @@ -26,7 +26,6 @@ import java.util.List; import java.util.Map; import java.util.NavigableSet; -import java.util.Optional; import java.util.Random; import java.util.Set; import java.util.concurrent.locks.Lock; @@ -130,10 +129,11 @@ public void reinitialize(Table containerStore) @Override public ContainerInfo getContainer(final ContainerID id) throws ContainerNotFoundException { - return Optional.ofNullable(containerStateManager - .getContainer(id)) - .orElseThrow(() -> new ContainerNotFoundException("Container with id " + - id + " not found.")); + final ContainerInfo info = containerStateManager.getContainer(id); + if (info == null) { + throw new ContainerNotFoundException(id); + } + return info; } @Override @@ -274,7 +274,7 @@ public void updateContainerState(final ContainerID cid, if (containerExist(cid)) { containerStateManager.updateContainerState(protoId, event); } else { - throwContainerNotFoundException(cid); + throw new ContainerNotFoundException(cid); } } finally { lock.unlock(); @@ -289,7 +289,7 @@ public void transitionDeletingOrDeletedToClosedState(ContainerID containerID) th if (containerExist(containerID)) { containerStateManager.transitionDeletingOrDeletedToClosedState(proto); } else { - throwContainerNotFoundException(containerID); + throw new ContainerNotFoundException(containerID); } } finally { lock.unlock(); @@ -299,10 +299,11 @@ public void transitionDeletingOrDeletedToClosedState(ContainerID containerID) th @Override public Set getContainerReplicas(final ContainerID id) throws ContainerNotFoundException { - return Optional.ofNullable(containerStateManager - .getContainerReplicas(id)) - .orElseThrow(() -> new ContainerNotFoundException("Container with id " + - id + " not found.")); + final Set replicas = containerStateManager.getContainerReplicas(id); + if (replicas == null) { + throw new ContainerNotFoundException(id); + } + return replicas; } @Override @@ -312,7 +313,7 @@ public void updateContainerReplica(final ContainerID cid, if (containerExist(cid)) { containerStateManager.updateContainerReplica(replica); } else { - throwContainerNotFoundException(cid); + throw new ContainerNotFoundException(cid); } } @@ -323,7 +324,7 @@ public void removeContainerReplica(final ContainerID cid, if (containerExist(cid)) { containerStateManager.removeContainerReplica(replica); } else { - throwContainerNotFoundException(cid); + throw new ContainerNotFoundException(cid); } } @@ -430,7 +431,7 @@ public void deleteContainer(final ContainerID cid) scmContainerManagerMetrics.incNumSuccessfulDeleteContainers(); } else { scmContainerManagerMetrics.incNumFailureDeleteContainers(); - throwContainerNotFoundException(cid); + throw new ContainerNotFoundException(cid); } } @@ -439,12 +440,6 @@ public boolean containerExist(final ContainerID id) { return containerStateManager.contains(id); } - private void throwContainerNotFoundException(final ContainerID id) - throws ContainerNotFoundException { - throw new ContainerNotFoundException("Container with id " + - id + " not found."); - } - @Override public void close() throws IOException { containerStateManager.close(); diff --git a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/balancer/MoveManager.java b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/balancer/MoveManager.java index 4283f1813182..e04688ab2cc5 100644 --- a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/balancer/MoveManager.java +++ b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/balancer/MoveManager.java @@ -425,7 +425,7 @@ private int getContainerReplicaIndex( //there should not be more than one replica of a container on the same //datanode. handle this if found in the future. .findFirst().orElseThrow(() -> - new ContainerReplicaNotFoundException("ID " + id + ", DN " + dn)) + new ContainerReplicaNotFoundException(id, dn)) .getReplicaIndex(); } diff --git a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/TestUnknownContainerReport.java b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/TestUnknownContainerReport.java index 369d1142ea02..705d2fca8ff1 100644 --- a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/TestUnknownContainerReport.java +++ b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/TestUnknownContainerReport.java @@ -89,7 +89,7 @@ public void setup() throws IOException { this.publisher = mock(EventPublisher.class); when(containerManager.getContainer(any(ContainerID.class))) - .thenThrow(new ContainerNotFoundException()); + .thenThrow(ContainerNotFoundException.newInstanceForTesting()); } @AfterEach diff --git a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/balancer/TestContainerBalancerDatanodeNodeLimit.java b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/balancer/TestContainerBalancerDatanodeNodeLimit.java index 872a7469d6a9..d5ecbb34e62c 100644 --- a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/balancer/TestContainerBalancerDatanodeNodeLimit.java +++ b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/balancer/TestContainerBalancerDatanodeNodeLimit.java @@ -553,7 +553,7 @@ public void checkIterationResultException(@Nonnull MockedSCM mockedSCM) when(mockedSCM.getMoveManager() .move(any(ContainerID.class), any(DatanodeDetails.class), any(DatanodeDetails.class))) .thenReturn(genCompletableFutureWithException(1)) - .thenThrow(new ContainerNotFoundException("Test Container not found")) + .thenThrow(ContainerNotFoundException.newInstanceForTesting()) .thenReturn(future); ContainerBalancerTask task = mockedSCM.startBalancerTask(config); diff --git a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/balancer/TestMoveManager.java b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/balancer/TestMoveManager.java index b141fd82753e..dc645ab0e8d1 100644 --- a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/balancer/TestMoveManager.java +++ b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/balancer/TestMoveManager.java @@ -323,7 +323,7 @@ public void testReplicationCommandFails() throws Exception { public void testDeleteCommandFails() throws Exception { CompletableFuture res = setupSuccessfulMove(); - doThrow(new ContainerNotFoundException("test")) + doThrow(ContainerNotFoundException.newInstanceForTesting()) .when(containerManager).getContainer(any(ContainerID.class)); ContainerReplicaOp op = new ContainerReplicaOp( diff --git a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/pipeline/TestWritableECContainerProvider.java b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/pipeline/TestWritableECContainerProvider.java index 5e9ff0a01008..090fe5f1df08 100644 --- a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/pipeline/TestWritableECContainerProvider.java +++ b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/pipeline/TestWritableECContainerProvider.java @@ -447,7 +447,7 @@ public void testContainerNotFoundWhenAttemptingToUseExisting( // Ensure ContainerManager always throws when a container is requested so // existing pipelines cannot be used doAnswer(call -> { - throw new ContainerNotFoundException(); + throw ContainerNotFoundException.newInstanceForTesting(); }).when(containerManager).getContainer(any(ContainerID.class)); ContainerInfo newContainer = From b5c96264e50a8c354ac866ecae2a524939bc7c8d Mon Sep 17 00:00:00 2001 From: Tsz-Wo Nicholas Sze Date: Wed, 11 Jun 2025 08:33:38 -0700 Subject: [PATCH 2/8] Add back the constructors with a String parameter. --- .../hadoop/hdds/scm/container/ContainerException.java | 10 ++++++++++ .../hdds/scm/container/ContainerNotFoundException.java | 3 ++- .../container/ContainerReplicaNotFoundException.java | 5 +++++ 3 files changed, 17 insertions(+), 1 deletion(-) diff --git a/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/scm/container/ContainerException.java b/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/scm/container/ContainerException.java index 7ebe0ff8874c..91c129fbb459 100644 --- a/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/scm/container/ContainerException.java +++ b/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/scm/container/ContainerException.java @@ -25,6 +25,16 @@ */ public class ContainerException extends SCMException { + /** + * Constructs a {@code ContainerException} with {@code null} + * as its result code.

+ * Required for Unwrapping {@code RemoteException}. Used by + * {@link org.apache.hadoop.ipc.RemoteException#unwrapRemoteException()} + */ + public ContainerException(String message) { + super(message); + } + /** * Constructs an {@code ContainerException} with the specified detail message. * diff --git a/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/scm/container/ContainerNotFoundException.java b/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/scm/container/ContainerNotFoundException.java index c63c8ba6b986..64a50a6c30a7 100644 --- a/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/scm/container/ContainerNotFoundException.java +++ b/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/scm/container/ContainerNotFoundException.java @@ -26,7 +26,8 @@ public ContainerNotFoundException() { this("Container not found for unknown id"); } - private ContainerNotFoundException(String message) { + /** Required by {@link org.apache.hadoop.ipc.RemoteException#unwrapRemoteException()} */ + public ContainerNotFoundException(String message) { super(message, ResultCodes.CONTAINER_NOT_FOUND); } diff --git a/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/scm/container/ContainerReplicaNotFoundException.java b/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/scm/container/ContainerReplicaNotFoundException.java index 2d047739da1e..01fa135afc91 100644 --- a/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/scm/container/ContainerReplicaNotFoundException.java +++ b/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/scm/container/ContainerReplicaNotFoundException.java @@ -33,6 +33,11 @@ public ContainerReplicaNotFoundException() { this(null, null); } + /** Required by {@link org.apache.hadoop.ipc.RemoteException#unwrapRemoteException()} */ + public ContainerReplicaNotFoundException(String message) { + super(message, ResultCodes.CONTAINER_REPLICA_NOT_FOUND); + } + public ContainerReplicaNotFoundException(ContainerID container, DatanodeDetails datanode) { super("Replica not found for container " + container + " and datanode " + datanode, ResultCodes.CONTAINER_REPLICA_NOT_FOUND); From 7dfc486f4f59f5e20144ff337084c47475419516 Mon Sep 17 00:00:00 2001 From: Tsz-Wo Nicholas Sze Date: Wed, 11 Jun 2025 09:13:49 -0700 Subject: [PATCH 3/8] Add a test. --- .../container/ContainerNotFoundException.java | 2 +- .../ContainerReplicaNotFoundException.java | 2 +- .../apache/hadoop/TestRemoteException.java | 53 +++++++++++++++++++ 3 files changed, 55 insertions(+), 2 deletions(-) create mode 100644 hadoop-ozone/recon/src/test/java/org/apache/hadoop/TestRemoteException.java diff --git a/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/scm/container/ContainerNotFoundException.java b/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/scm/container/ContainerNotFoundException.java index 64a50a6c30a7..ab15f4f3f859 100644 --- a/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/scm/container/ContainerNotFoundException.java +++ b/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/scm/container/ContainerNotFoundException.java @@ -26,7 +26,7 @@ public ContainerNotFoundException() { this("Container not found for unknown id"); } - /** Required by {@link org.apache.hadoop.ipc.RemoteException#unwrapRemoteException()} */ + /** Required by {@link org.apache.hadoop.ipc.RemoteException#unwrapRemoteException()}. */ public ContainerNotFoundException(String message) { super(message, ResultCodes.CONTAINER_NOT_FOUND); } diff --git a/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/scm/container/ContainerReplicaNotFoundException.java b/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/scm/container/ContainerReplicaNotFoundException.java index 01fa135afc91..5c1eac42a796 100644 --- a/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/scm/container/ContainerReplicaNotFoundException.java +++ b/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/scm/container/ContainerReplicaNotFoundException.java @@ -33,7 +33,7 @@ public ContainerReplicaNotFoundException() { this(null, null); } - /** Required by {@link org.apache.hadoop.ipc.RemoteException#unwrapRemoteException()} */ + /** Required by {@link org.apache.hadoop.ipc.RemoteException#unwrapRemoteException()}. */ public ContainerReplicaNotFoundException(String message) { super(message, ResultCodes.CONTAINER_REPLICA_NOT_FOUND); } diff --git a/hadoop-ozone/recon/src/test/java/org/apache/hadoop/TestRemoteException.java b/hadoop-ozone/recon/src/test/java/org/apache/hadoop/TestRemoteException.java new file mode 100644 index 000000000000..162600bf9821 --- /dev/null +++ b/hadoop-ozone/recon/src/test/java/org/apache/hadoop/TestRemoteException.java @@ -0,0 +1,53 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.hadoop; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import java.io.IOException; + +import org.apache.hadoop.hdds.scm.exceptions.SCMException; +import org.apache.hadoop.ipc.RemoteException; +import org.junit.jupiter.api.Test; +import org.reflections.Reflections; + +/** Testing {@link RemoteException#unwrapRemoteException()}. */ +public class TestRemoteException { + private static final Reflections REFLECTIONS = new Reflections(TestRemoteException.class.getPackage().getName()); + + /** An exception without a constructor with a single {@link String} parameter. */ + static class SomeException extends SCMException { + SomeException(ResultCodes result) { + super(result); + } + } + + @Test + public void testSCMException() { + REFLECTIONS.getSubTypesOf(SCMException.class) + .forEach(TestRemoteException::runUnwrappingRemoteException); + } + + static void runUnwrappingRemoteException(Class clazz) { + final RemoteException remoteException = new RemoteException(clazz.getName(), "message"); + System.out.println("Test " + remoteException); + final IOException unwrapped = remoteException.unwrapRemoteException(); + final Class expected = clazz == SomeException.class ? RemoteException.class : clazz; + assertEquals(expected, unwrapped.getClass()); + } +} From 01aef9330414367e0bd935f9072e463a9f3e8bbd Mon Sep 17 00:00:00 2001 From: Tsz-Wo Nicholas Sze Date: Wed, 11 Jun 2025 10:21:24 -0700 Subject: [PATCH 4/8] Rename TestRemoteException to TestRemoteEx for findbugs --- .../hadoop/{TestRemoteException.java => TestRemoteEx.java} | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) rename hadoop-ozone/recon/src/test/java/org/apache/hadoop/{TestRemoteException.java => TestRemoteEx.java} (92%) diff --git a/hadoop-ozone/recon/src/test/java/org/apache/hadoop/TestRemoteException.java b/hadoop-ozone/recon/src/test/java/org/apache/hadoop/TestRemoteEx.java similarity index 92% rename from hadoop-ozone/recon/src/test/java/org/apache/hadoop/TestRemoteException.java rename to hadoop-ozone/recon/src/test/java/org/apache/hadoop/TestRemoteEx.java index 162600bf9821..78333f2c01bc 100644 --- a/hadoop-ozone/recon/src/test/java/org/apache/hadoop/TestRemoteException.java +++ b/hadoop-ozone/recon/src/test/java/org/apache/hadoop/TestRemoteEx.java @@ -20,15 +20,14 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import java.io.IOException; - import org.apache.hadoop.hdds.scm.exceptions.SCMException; import org.apache.hadoop.ipc.RemoteException; import org.junit.jupiter.api.Test; import org.reflections.Reflections; /** Testing {@link RemoteException#unwrapRemoteException()}. */ -public class TestRemoteException { - private static final Reflections REFLECTIONS = new Reflections(TestRemoteException.class.getPackage().getName()); +public class TestRemoteEx { + private static final Reflections REFLECTIONS = new Reflections(TestRemoteEx.class.getPackage().getName()); /** An exception without a constructor with a single {@link String} parameter. */ static class SomeException extends SCMException { @@ -40,7 +39,7 @@ static class SomeException extends SCMException { @Test public void testSCMException() { REFLECTIONS.getSubTypesOf(SCMException.class) - .forEach(TestRemoteException::runUnwrappingRemoteException); + .forEach(TestRemoteEx::runUnwrappingRemoteException); } static void runUnwrappingRemoteException(Class clazz) { From 233223e5f4a2a5dc094dd659294ec646e702375c Mon Sep 17 00:00:00 2001 From: Tsz-Wo Nicholas Sze Date: Wed, 11 Jun 2025 10:28:07 -0700 Subject: [PATCH 5/8] Move test to hadoop-ozone/integration-test --- .../src/test/java/org/apache/hadoop/TestRemoteEx.java | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) rename hadoop-ozone/{recon => integration-test}/src/test/java/org/apache/hadoop/TestRemoteEx.java (85%) diff --git a/hadoop-ozone/recon/src/test/java/org/apache/hadoop/TestRemoteEx.java b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/TestRemoteEx.java similarity index 85% rename from hadoop-ozone/recon/src/test/java/org/apache/hadoop/TestRemoteEx.java rename to hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/TestRemoteEx.java index 78333f2c01bc..aab0d8648f64 100644 --- a/hadoop-ozone/recon/src/test/java/org/apache/hadoop/TestRemoteEx.java +++ b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/TestRemoteEx.java @@ -29,7 +29,7 @@ public class TestRemoteEx { private static final Reflections REFLECTIONS = new Reflections(TestRemoteEx.class.getPackage().getName()); - /** An exception without a constructor with a single {@link String} parameter. */ + /** An exception without a single {@link String} parameter constructor. */ static class SomeException extends SCMException { SomeException(ResultCodes result) { super(result); @@ -43,10 +43,13 @@ public void testSCMException() { } static void runUnwrappingRemoteException(Class clazz) { - final RemoteException remoteException = new RemoteException(clazz.getName(), "message"); - System.out.println("Test " + remoteException); + final String message = clazz.getSimpleName() + "-message"; + final RemoteException remoteException = new RemoteException(clazz.getName(), message); + System.out.println("Test " + remoteException); final IOException unwrapped = remoteException.unwrapRemoteException(); + System.out.println("unwrapped " + unwrapped); final Class expected = clazz == SomeException.class ? RemoteException.class : clazz; assertEquals(expected, unwrapped.getClass()); + assertEquals(message, unwrapped.getMessage()); } } From 8f1126b6aadd3913b111865c51ed8ae6a4098c45 Mon Sep 17 00:00:00 2001 From: "Doroszlai, Attila" Date: Wed, 11 Jun 2025 21:18:09 +0200 Subject: [PATCH 6/8] fix build --- hadoop-ozone/integration-test/pom.xml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/hadoop-ozone/integration-test/pom.xml b/hadoop-ozone/integration-test/pom.xml index 198f03f20789..22906c611add 100644 --- a/hadoop-ozone/integration-test/pom.xml +++ b/hadoop-ozone/integration-test/pom.xml @@ -521,6 +521,11 @@ hamcrest test + + org.reflections + reflections + test + org.rocksdb rocksdbjni From 854eecf11ca532c34d04e47b250b6f16ee309439 Mon Sep 17 00:00:00 2001 From: Tsz-Wo Nicholas Sze Date: Thu, 12 Jun 2025 10:24:02 -0700 Subject: [PATCH 7/8] Change package --- .../org/apache/hadoop/hdds/TestRemoteEx.java | 55 +++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/hdds/TestRemoteEx.java diff --git a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/hdds/TestRemoteEx.java b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/hdds/TestRemoteEx.java new file mode 100644 index 000000000000..95a17b8720ce --- /dev/null +++ b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/hdds/TestRemoteEx.java @@ -0,0 +1,55 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.hadoop.hdds; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import java.io.IOException; +import org.apache.hadoop.hdds.scm.exceptions.SCMException; +import org.apache.hadoop.ipc.RemoteException; +import org.junit.jupiter.api.Test; +import org.reflections.Reflections; + +/** Testing {@link RemoteException#unwrapRemoteException()}. */ +public class TestRemoteEx { + private static final Reflections REFLECTIONS = new Reflections(TestRemoteEx.class.getPackage().getName()); + + /** An exception without a single {@link String} parameter constructor. */ + static class SomeException extends SCMException { + SomeException(ResultCodes result) { + super(result); + } + } + + @Test + public void testSCMException() { + REFLECTIONS.getSubTypesOf(SCMException.class) + .forEach(TestRemoteEx::runUnwrappingRemoteException); + } + + static void runUnwrappingRemoteException(Class clazz) { + final String message = clazz.getSimpleName() + "-message"; + final RemoteException remoteException = new RemoteException(clazz.getName(), message); + System.out.println("Test " + remoteException); + final IOException unwrapped = remoteException.unwrapRemoteException(); + System.out.println("unwrapped " + unwrapped); + final Class expected = clazz == SomeException.class ? RemoteException.class : clazz; + assertEquals(expected, unwrapped.getClass()); + assertEquals(message, unwrapped.getMessage()); + } +} From 8d0fdaba987d33190ffe8de12d294f233f98eb6e Mon Sep 17 00:00:00 2001 From: "Doroszlai, Attila" Date: Fri, 13 Jun 2025 05:11:06 +0200 Subject: [PATCH 8/8] remove duplicate TestRemoteEx --- .../java/org/apache/hadoop/TestRemoteEx.java | 55 ------------------- 1 file changed, 55 deletions(-) delete mode 100644 hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/TestRemoteEx.java diff --git a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/TestRemoteEx.java b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/TestRemoteEx.java deleted file mode 100644 index aab0d8648f64..000000000000 --- a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/TestRemoteEx.java +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.apache.hadoop; - -import static org.junit.jupiter.api.Assertions.assertEquals; - -import java.io.IOException; -import org.apache.hadoop.hdds.scm.exceptions.SCMException; -import org.apache.hadoop.ipc.RemoteException; -import org.junit.jupiter.api.Test; -import org.reflections.Reflections; - -/** Testing {@link RemoteException#unwrapRemoteException()}. */ -public class TestRemoteEx { - private static final Reflections REFLECTIONS = new Reflections(TestRemoteEx.class.getPackage().getName()); - - /** An exception without a single {@link String} parameter constructor. */ - static class SomeException extends SCMException { - SomeException(ResultCodes result) { - super(result); - } - } - - @Test - public void testSCMException() { - REFLECTIONS.getSubTypesOf(SCMException.class) - .forEach(TestRemoteEx::runUnwrappingRemoteException); - } - - static void runUnwrappingRemoteException(Class clazz) { - final String message = clazz.getSimpleName() + "-message"; - final RemoteException remoteException = new RemoteException(clazz.getName(), message); - System.out.println("Test " + remoteException); - final IOException unwrapped = remoteException.unwrapRemoteException(); - System.out.println("unwrapped " + unwrapped); - final Class expected = clazz == SomeException.class ? RemoteException.class : clazz; - assertEquals(expected, unwrapped.getClass()); - assertEquals(message, unwrapped.getMessage()); - } -}