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;
+ }
}
}