Skip to content

Commit 1876645

Browse files
lukasz-antoniakabsurdfarce
authored andcommitted
JAVA-3125: Match broadcast RPC for control connection and Astra events
patch by Lukasz Antoniak; reviewed by Bret McGuire and Andrew Tolbert for JAVA-3125 reference: #1981 Fix to address Scassandra test issues
1 parent a221439 commit 1876645

File tree

3 files changed

+83
-10
lines changed

3 files changed

+83
-10
lines changed

driver-core/src/main/java/com/datastax/driver/core/ControlConnection.java

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -626,7 +626,11 @@ private static void updateInfo(
626626
broadcastRpcAddress = new InetSocketAddress(nativeAddress, nativePort);
627627
} else if (row.getColumnDefinitions().contains("rpc_address")) {
628628
InetAddress rpcAddress = row.getInet("rpc_address");
629-
broadcastRpcAddress = new InetSocketAddress(rpcAddress, cluster.connectionFactory.getPort());
629+
int nativePort = cluster.connectionFactory.getPort();
630+
if (row.getColumnDefinitions().contains("rpc_port")) {
631+
nativePort = row.getInt("rpc_port");
632+
}
633+
broadcastRpcAddress = new InetSocketAddress(rpcAddress, nativePort);
630634
}
631635
// Before CASSANDRA-9436, system.local doesn't have rpc_address, so this might be null. It's not
632636
// a big deal because we only use this for server events, and the control node doesn't receive
@@ -854,8 +858,11 @@ private void refreshNodeListAndTokenMap(
854858
broadcastRpcAddress = new InetSocketAddress(nativeAddress, nativePort);
855859
} else {
856860
InetAddress rpcAddress = row.getInet("rpc_address");
857-
broadcastRpcAddress =
858-
new InetSocketAddress(rpcAddress, cluster.connectionFactory.getPort());
861+
int nativePort = cluster.connectionFactory.getPort();
862+
if (row.getColumnDefinitions().contains("rpc_port")) {
863+
nativePort = row.getInt("rpc_port");
864+
}
865+
broadcastRpcAddress = new InetSocketAddress(rpcAddress, nativePort);
859866
}
860867
broadcastRpcAddresses.add(broadcastRpcAddress);
861868

driver-core/src/test/java/com/datastax/driver/core/ControlConnectionTest.java

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import static com.datastax.driver.core.Assertions.assertThat;
2121
import static com.datastax.driver.core.CreateCCM.TestMode.PER_METHOD;
2222
import static com.datastax.driver.core.ScassandraCluster.SELECT_LOCAL;
23+
import static com.datastax.driver.core.ScassandraCluster.SELECT_LOCAL_RPC_ADDRESS_AND_PORT;
2324
import static com.datastax.driver.core.ScassandraCluster.SELECT_PEERS;
2425
import static com.datastax.driver.core.ScassandraCluster.SELECT_PEERS_DSE68;
2526
import static com.datastax.driver.core.ScassandraCluster.SELECT_PEERS_V2;
@@ -659,6 +660,50 @@ public void should_extract_hosts_using_rpc_address_from_peers() throws UnknownHo
659660
runPeerTest(state);
660661
}
661662

663+
@Test(groups = "short")
664+
@CCMConfig(createCcm = false)
665+
public void should_extract_hosts_port_using_rpc_port_from_local() throws UnknownHostException {
666+
InetAddress expectedAddress = InetAddress.getByName("1.2.3.4");
667+
int expectedPort = 29042;
668+
PeerRowState state =
669+
PeerRowState.builder()
670+
.local("rpc_address", expectedAddress)
671+
.local("rpc_port", expectedPort)
672+
.build();
673+
674+
ScassandraCluster scassandras =
675+
ScassandraCluster.builder().withNodes(2).withPeersV2(state.usePeersV2()).build();
676+
scassandras.init();
677+
678+
Cluster cluster = null;
679+
try {
680+
scassandras.node(1).primingClient().clearAllPrimes();
681+
PrimingClient primingClient = scassandras.node(1).primingClient();
682+
primingClient.prime(
683+
PrimingRequest.queryBuilder()
684+
.withQuery("SELECT * FROM system.local WHERE key='local'")
685+
.withThen(
686+
then()
687+
.withColumnTypes(SELECT_LOCAL_RPC_ADDRESS_AND_PORT)
688+
.withRows(state.getLocalRow())
689+
.build())
690+
.build());
691+
cluster =
692+
Cluster.builder()
693+
.addContactPoints(scassandras.address(1).getAddress())
694+
.withPort(scassandras.getBinaryPort())
695+
.withNettyOptions(nonQuietClusterCloseOptions)
696+
.build();
697+
cluster.connect();
698+
699+
assertThat(cluster.manager.getControlConnection().connectedHost().getBroadcastRpcAddress())
700+
.isEqualTo(new InetSocketAddress(expectedAddress, expectedPort));
701+
} finally {
702+
if (cluster != null) cluster.close();
703+
scassandras.stop();
704+
}
705+
}
706+
662707
private void runPeerTest(PeerRowState state) {
663708

664709
ScassandraCluster scassandras =

driver-core/src/test/java/com/datastax/driver/core/ScassandraCluster.java

Lines changed: 28 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -658,14 +658,14 @@ private Object getPeerInfo(int dc, int node, String property, Object defaultValu
658658
column("cluster_name", TEXT),
659659
column("cql_version", TEXT),
660660
column("data_center", TEXT),
661+
column("graph", BOOLEAN),
662+
column("host_id", UUID),
661663
column("listen_address", INET),
662664
column("partitioner", TEXT),
663665
column("rack", TEXT),
664666
column("release_version", TEXT),
665-
column("tokens", set(TEXT)),
666-
column("graph", BOOLEAN),
667-
column("host_id", UUID),
668-
column("schema_version", UUID)
667+
column("schema_version", UUID),
668+
column("tokens", set(TEXT))
669669
};
670670

671671
public static final org.scassandra.http.client.types.ColumnMetadata[] SELECT_LOCAL_V2 = {
@@ -676,15 +676,36 @@ private Object getPeerInfo(int dc, int node, String property, Object defaultValu
676676
column("cluster_name", TEXT),
677677
column("cql_version", TEXT),
678678
column("data_center", TEXT),
679+
column("graph", BOOLEAN),
680+
column("host_id", UUID),
679681
column("listen_address", INET),
680682
column("listen_port", INT),
681683
column("partitioner", TEXT),
682684
column("rack", TEXT),
683685
column("release_version", TEXT),
684-
column("tokens", set(TEXT)),
685-
column("graph", BOOLEAN),
686+
column("schema_version", UUID),
687+
column("tokens", set(TEXT))
688+
};
689+
690+
public static final org.scassandra.http.client.types.ColumnMetadata[]
691+
SELECT_LOCAL_RPC_ADDRESS_AND_PORT = {
692+
column("key", TEXT),
693+
column("bootstrapped", TEXT),
694+
column("broadcast_address", INET),
695+
column("broadcast_port", INT),
696+
column("cluster_name", TEXT),
697+
column("cql_version", TEXT),
698+
column("data_center", TEXT),
686699
column("host_id", UUID),
687-
column("schema_version", UUID)
700+
column("listen_address", INET),
701+
column("listen_port", INT),
702+
column("partitioner", TEXT),
703+
column("rack", TEXT),
704+
column("release_version", TEXT),
705+
column("rpc_address", INET),
706+
column("rpc_port", INT),
707+
column("schema_version", UUID),
708+
column("tokens", set(TEXT))
688709
};
689710

690711
static final org.scassandra.http.client.types.ColumnMetadata[] SELECT_CLUSTER_NAME = {

0 commit comments

Comments
 (0)