From ac9c288c2c281f384fe30931d7efdcd4070b5d35 Mon Sep 17 00:00:00 2001 From: Doug Rohrer Date: Tue, 2 Sep 2025 16:12:34 -0400 Subject: [PATCH 1/2] CASSANDRA-20884 - Move JMX classes to the in-jvm-dtest API project --- .build/parent-pom-template.xml | 2 +- .../utils/RMIClientSocketFactoryImpl.java | 81 ----------------- .../distributed/impl/AbstractCluster.java | 8 +- .../CollectingRMIServerSocketFactoryImpl.java | 88 ------------------- .../distributed/impl/IsolatedJmx.java | 6 +- 5 files changed, 6 insertions(+), 179 deletions(-) delete mode 100644 src/java/org/apache/cassandra/utils/RMIClientSocketFactoryImpl.java delete mode 100644 test/distributed/org/apache/cassandra/distributed/impl/CollectingRMIServerSocketFactoryImpl.java diff --git a/.build/parent-pom-template.xml b/.build/parent-pom-template.xml index f13aaf75cccf..2433fb386c72 100644 --- a/.build/parent-pom-template.xml +++ b/.build/parent-pom-template.xml @@ -524,7 +524,7 @@ org.apache.cassandra dtest-api - 0.0.16 + 0.0.18-SNAPSHOT test diff --git a/src/java/org/apache/cassandra/utils/RMIClientSocketFactoryImpl.java b/src/java/org/apache/cassandra/utils/RMIClientSocketFactoryImpl.java deleted file mode 100644 index 5caa92cce409..000000000000 --- a/src/java/org/apache/cassandra/utils/RMIClientSocketFactoryImpl.java +++ /dev/null @@ -1,81 +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.cassandra.utils; - -import java.io.IOException; -import java.io.Serializable; -import java.net.InetAddress; -import java.net.Socket; -import java.rmi.server.RMIClientSocketFactory; -import java.util.ArrayList; -import java.util.List; -import java.util.Objects; - -/** - * This class is used to override the local address the JMX client calculates when trying to connect, - * which can otherwise be influenced by the system property "java.rmi.server.hostname" in strange and - * unpredictable ways. - */ -public class RMIClientSocketFactoryImpl implements RMIClientSocketFactory, Serializable -{ - List sockets = new ArrayList<>(); - private final InetAddress localAddress; - - public RMIClientSocketFactoryImpl(InetAddress localAddress) - { - this.localAddress = localAddress; - } - - @Override - public Socket createSocket(String host, int port) throws IOException - { - Socket socket = new Socket(localAddress, port); - sockets.add(socket); - return socket; - } - - public void close() throws IOException - { - for (Socket socket: sockets) { - try - { - socket.close(); - } - catch (IOException ignored) - { - // intentionally ignored - } - } - } - - @Override - public boolean equals(Object o) - { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - RMIClientSocketFactoryImpl that = (RMIClientSocketFactoryImpl) o; - return Objects.equals(localAddress, that.localAddress); - } - - @Override - public int hashCode() - { - return Objects.hash(localAddress); - } -} diff --git a/test/distributed/org/apache/cassandra/distributed/impl/AbstractCluster.java b/test/distributed/org/apache/cassandra/distributed/impl/AbstractCluster.java index c7e4c1052113..b670fc868c2d 100644 --- a/test/distributed/org/apache/cassandra/distributed/impl/AbstractCluster.java +++ b/test/distributed/org/apache/cassandra/distributed/impl/AbstractCluster.java @@ -202,12 +202,6 @@ public AbstractBuilder(Factory factory) withSharedClasses(SHARED_PREDICATE); } - @SuppressWarnings("unchecked") - private B self() - { - return (B) this; - } - public B withNodeProvisionStrategy(INodeProvisionStrategy.Strategy nodeProvisionStrategy) { this.nodeProvisionStrategy = nodeProvisionStrategy; @@ -585,7 +579,7 @@ public InstanceConfig newInstanceConfig() } @VisibleForTesting - InstanceConfig createInstanceConfig(int nodeNum) + public InstanceConfig createInstanceConfig(int nodeNum) { INodeProvisionStrategy provisionStrategy = nodeProvisionStrategy.create(subnet, portMap); Collection tokens = tokenSupplier.tokens(nodeNum); diff --git a/test/distributed/org/apache/cassandra/distributed/impl/CollectingRMIServerSocketFactoryImpl.java b/test/distributed/org/apache/cassandra/distributed/impl/CollectingRMIServerSocketFactoryImpl.java deleted file mode 100644 index 0fc742513f6b..000000000000 --- a/test/distributed/org/apache/cassandra/distributed/impl/CollectingRMIServerSocketFactoryImpl.java +++ /dev/null @@ -1,88 +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.cassandra.distributed.impl; - -import java.io.IOException; -import java.net.InetAddress; -import java.net.ServerSocket; -import java.net.SocketException; -import java.rmi.server.RMIServerSocketFactory; -import java.util.ArrayList; -import java.util.List; -import java.util.Objects; - -import javax.net.ServerSocketFactory; - - -/** - * This class is used to keep track of RMI servers created during a cluster creation so we can - * later close the sockets, which would otherwise be left with a thread running waiting for - * connections that would never show up as the server was otherwise closed. - */ -class CollectingRMIServerSocketFactoryImpl implements RMIServerSocketFactory -{ - private final InetAddress bindAddress; - List sockets = new ArrayList<>(); - - public CollectingRMIServerSocketFactoryImpl(InetAddress bindAddress) - { - this.bindAddress = bindAddress; - } - - @Override - public ServerSocket createServerSocket(int pPort) throws IOException - { - ServerSocket result = ServerSocketFactory.getDefault().createServerSocket(pPort, 0, bindAddress); - try - { - result.setReuseAddress(true); - } - catch (SocketException e) - { - result.close(); - throw e; - } - sockets.add(result); - return result; - } - - - public void close() throws IOException - { - for (ServerSocket socket : sockets) - { - socket.close(); - } - } - - @Override - public boolean equals(Object o) - { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - CollectingRMIServerSocketFactoryImpl that = (CollectingRMIServerSocketFactoryImpl) o; - return Objects.equals(bindAddress, that.bindAddress); - } - - @Override - public int hashCode() - { - return Objects.hash(bindAddress); - } -} diff --git a/test/distributed/org/apache/cassandra/distributed/impl/IsolatedJmx.java b/test/distributed/org/apache/cassandra/distributed/impl/IsolatedJmx.java index dd53ba48295a..41a722a3d1a6 100644 --- a/test/distributed/org/apache/cassandra/distributed/impl/IsolatedJmx.java +++ b/test/distributed/org/apache/cassandra/distributed/impl/IsolatedJmx.java @@ -31,15 +31,17 @@ import javax.management.remote.rmi.RMIConnectorServer; import javax.management.remote.rmi.RMIJRMPServerImpl; +import com.google.common.util.concurrent.Uninterruptibles; + +import org.apache.cassandra.distributed.shared.jmx.CollectingRMIServerSocketFactoryImpl; +import org.apache.cassandra.distributed.shared.jmx.RMIClientSocketFactoryImpl; import org.slf4j.Logger; -import com.google.common.util.concurrent.Uninterruptibles; import org.apache.cassandra.distributed.api.IInstance; import org.apache.cassandra.distributed.api.IInstanceConfig; import org.apache.cassandra.distributed.shared.JMXUtil; import org.apache.cassandra.utils.JMXServerUtils; import org.apache.cassandra.utils.MBeanWrapper; -import org.apache.cassandra.utils.RMIClientSocketFactoryImpl; import sun.rmi.transport.tcp.TCPEndpoint; import static org.apache.cassandra.config.CassandraRelevantProperties.JAVA_RMI_DGC_LEASE_VALUE_IN_JVM_DTEST; From 74fc7ae1f5e105123508bdd6c9855b8e4cb89d6a Mon Sep 17 00:00:00 2001 From: Doug Rohrer Date: Wed, 1 Oct 2025 13:00:45 -0400 Subject: [PATCH 2/2] Use published snapshot for testing of dtest-api 0.0.18 --- .build/build-resolver.xml | 3 ++- .build/parent-pom-template.xml | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/.build/build-resolver.xml b/.build/build-resolver.xml index 09263d42aa6e..da9bfba75c9c 100644 --- a/.build/build-resolver.xml +++ b/.build/build-resolver.xml @@ -70,7 +70,8 @@ or ~/.ant/settings.xml (maven ant resolver supersedes) as mirrors will, by default, catch and override all dependency resolution regardless of it being a -SNAPSHOT lib or not. --> - + + diff --git a/.build/parent-pom-template.xml b/.build/parent-pom-template.xml index 2433fb386c72..24141c617b94 100644 --- a/.build/parent-pom-template.xml +++ b/.build/parent-pom-template.xml @@ -524,7 +524,7 @@ org.apache.cassandra dtest-api - 0.0.18-SNAPSHOT + 0.0.18-cd80924-SNAPSHOT test