You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@logging.apache.org by pk...@apache.org on 2022/03/14 19:27:14 UTC

[logging-log4j2] branch release-2.x updated: Changes Cassandra's port to an ephemeral one

This is an automated email from the ASF dual-hosted git repository.

pkarwasz pushed a commit to branch release-2.x
in repository https://gitbox.apache.org/repos/asf/logging-log4j2.git


The following commit(s) were added to refs/heads/release-2.x by this push:
     new c73c804  Changes Cassandra's port to an ephemeral one
c73c804 is described below

commit c73c8042af679542ec11f65fffc440ec18ec28c0
Author: Piotr P. Karwasz <pi...@karwasz.org>
AuthorDate: Mon Mar 14 20:26:26 2022 +0100

    Changes Cassandra's port to an ephemeral one
---
 .../logging/log4j/cassandra/CassandraRule.java     | 42 ++++++++++++++++++----
 1 file changed, 36 insertions(+), 6 deletions(-)

diff --git a/log4j-cassandra/src/test/java/org/apache/logging/log4j/cassandra/CassandraRule.java b/log4j-cassandra/src/test/java/org/apache/logging/log4j/cassandra/CassandraRule.java
index ad39dd6..aaaea50 100644
--- a/log4j-cassandra/src/test/java/org/apache/logging/log4j/cassandra/CassandraRule.java
+++ b/log4j-cassandra/src/test/java/org/apache/logging/log4j/cassandra/CassandraRule.java
@@ -16,8 +16,11 @@
  */
 package org.apache.logging.log4j.cassandra;
 
+import static org.junit.Assert.assertNotNull;
+import static org.junit.jupiter.api.Assertions.fail;
+
 import java.io.IOException;
-import java.net.InetAddress;
+import java.lang.reflect.Field;
 import java.net.InetSocketAddress;
 import java.nio.file.Files;
 import java.nio.file.Path;
@@ -26,6 +29,8 @@ import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.ThreadFactory;
 
 import org.apache.cassandra.service.CassandraDaemon;
+import org.apache.cassandra.service.CassandraDaemon.Server;
+import org.apache.cassandra.transport.Server.ConnectionTracker;
 import org.apache.logging.log4j.LoggingException;
 import org.apache.logging.log4j.core.util.Cancellable;
 import org.apache.logging.log4j.core.util.Closer;
@@ -37,6 +42,8 @@ import org.junit.rules.ExternalResource;
 import com.datastax.driver.core.Cluster;
 import com.datastax.driver.core.Session;
 
+import io.netty.channel.socket.ServerSocketChannel;
+
 /**
  * JUnit rule to set up and tear down a Cassandra database instance.
  */
@@ -45,7 +52,7 @@ public class CassandraRule extends ExternalResource {
     private static final ThreadFactory THREAD_FACTORY = Log4jThreadFactory.createThreadFactory("Cassandra");
 
     private final CountDownLatch latch = new CountDownLatch(1);
-    private final Cancellable embeddedCassandra = new EmbeddedCassandra(latch);
+    private final EmbeddedCassandra embeddedCassandra = new EmbeddedCassandra(latch);
     private final String keyspace;
     private final String tableDdl;
     private Cluster cluster;
@@ -69,16 +76,18 @@ public class CassandraRule extends ExternalResource {
         Files.createDirectories(root.resolve("data"));
         final Path config = root.resolve("cassandra.yml");
         Files.copy(getClass().getResourceAsStream("/cassandra.yaml"), config);
-        final int nativePort = AvailablePortFinder.getNextAvailable();
-        System.setProperty("cassandra.native_transport_port", Integer.toString(nativePort));
-        System.setProperty("cassandra.storage_port", Integer.toString(AvailablePortFinder.getNextAvailable()));
+        System.setProperty("cassandra.native_transport_port", "0");
+        System.setProperty("cassandra.storage_port", "0");
         System.setProperty("cassandra.config", "file:" + config.toString());
         System.setProperty("cassandra.storagedir", root.toString());
         System.setProperty("cassandra-foreground", "true"); // prevents Cassandra from closing stdout/stderr
         THREAD_FACTORY.newThread(embeddedCassandra).start();
         latch.await();
+        final InetSocketAddress nativeSocket = embeddedCassandra.getNativeSocket();
+        assertNotNull(nativeSocket);
+        System.setProperty("cassandra.native_transport_port", Integer.toString(nativeSocket.getPort()));
         cluster = Cluster.builder()
-                .addContactPointsWithPorts(new InetSocketAddress(InetAddress.getLoopbackAddress(), nativePort))
+                .addContactPointsWithPorts(nativeSocket)
                 .build();
         
         try (final Session session = cluster.connect()) {
@@ -146,5 +155,26 @@ public class CassandraRule extends ExternalResource {
             daemon.start();
             latch.countDown();
         }
+
+        public InetSocketAddress getNativeSocket() {
+            final Server server = daemon.nativeServer;
+            if (server instanceof org.apache.cassandra.transport.Server) {
+                try {
+                    final Field trackerField = org.apache.cassandra.transport.Server.class.getDeclaredField("connectionTracker");
+                    trackerField.setAccessible(true);
+                    final ConnectionTracker connectionTracker = (ConnectionTracker) trackerField.get(server);
+                    final ServerSocketChannel serverChannel = connectionTracker.allChannels
+                            .stream()
+                            .filter(ServerSocketChannel.class::isInstance)
+                            .map(ServerSocketChannel.class::cast)
+                            .findFirst()
+                            .orElse(null);
+                    return serverChannel.localAddress();
+                } catch (ReflectiveOperationException | ClassCastException e) {
+                    fail(e);
+                }
+            }
+            return null;
+        }
     }
 }