This is an automated email from the ASF dual-hosted git repository.
ycai pushed a commit to branch trunk
in repository https://gitbox.apache.org/repos/asf/cassandra-sidecar.git
The following commit(s) were added to refs/heads/trunk by this push:
new d8e9e23 CASSANDRASC-81: Improve TokenRangeReplicasResponse payload
d8e9e23 is described below
commit d8e9e2359db1f5561eb872d28ab16098b5a62c1d
Author: Francisco Guerrero <[email protected]>
AuthorDate: Fri Oct 27 10:13:24 2023 -0700
CASSANDRASC-81: Improve TokenRangeReplicasResponse payload
The `TokenRangeReplicasResponse` returns a list with `ReplicaMetadata`.
This information is used by clients to lookup
replica metadata. The lookup is done with the replica information, which
consists of the `ip:port`.
Clients are looping over the `ReplicaMetadata` list and matching IP and
port to retrieve the metadata object. Instead,
we can improve the payload by changing the data structure from a list to a
map, and have clients lookup by the replica
(ip + port), without having to loop.
Patch by Francisco Guerrero; Reviewed by Arjun Ashok, Dinesh Joshi, Yifan
Cai for CASSANDRASC-81
---
CHANGES.txt | 1 +
.../adapters/base/TokenRangeReplicaProvider.java | 32 +++---
.../base/TokenRangeReplicaProviderTest.java | 128 ++++++++-------------
.../sidecar/client/SidecarClientTest.java | 105 ++++++++---------
.../common/data/TokenRangeReplicasResponse.java | 20 ++--
scripts/build-shaded-dtest-jar-local.sh | 1 +
.../tokenrange/BaseTokenRangeIntegrationTest.java | 23 ++--
.../sidecar/routes/tokenrange/JoiningBaseTest.java | 15 ++-
.../sidecar/routes/tokenrange/MovingBaseTest.java | 2 +-
.../sstableuploads/BaseUploadsHandlerTest.java | 2 +
src/test/resources/certs/client_keystore.jks | Bin 3193 -> 3194 bytes
src/test/resources/certs/client_keystore.p12 | Bin 3714 -> 3564 bytes
.../resources/certs/expired_server_keystore.jks | Bin 2321 -> 2258 bytes
.../resources/certs/expired_server_keystore.p12 | Bin 3810 -> 3596 bytes
.../resources/certs/generate-client-keystore.sh | 1 +
.../resources/certs/generate-server-keystore.sh | 1 +
src/test/resources/certs/server_keystore.jks | Bin 2314 -> 2250 bytes
src/test/resources/certs/server_keystore.p12 | Bin 3778 -> 3564 bytes
src/test/resources/certs/truststore.jks | Bin 1006 -> 1006 bytes
src/test/resources/certs/truststore.p12 | Bin 1318 -> 1303 bytes
20 files changed, 152 insertions(+), 179 deletions(-)
diff --git a/CHANGES.txt b/CHANGES.txt
index 256b4bd..6c22d9c 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -1,5 +1,6 @@
1.0.0
-----
+ * Improve TokenRangeReplicasResponse payload (CASSANDRASC-81)
* HealthCheckPeriodicTask execute never completes the promise when instances
are empty (CASSANDRASC-80)
* Fix token-ranges endpoint to handle gossip-info responses without 'status'
(CASSANDRASC-78)
* Upgrade vertx to version 4.4.6 to bring hot reloading and traffic shaping
options (CASSANDRASC-77)
diff --git
a/adapters/base/src/main/java/org/apache/cassandra/sidecar/adapters/base/TokenRangeReplicaProvider.java
b/adapters/base/src/main/java/org/apache/cassandra/sidecar/adapters/base/TokenRangeReplicaProvider.java
index bef8b39..71a70e8 100644
---
a/adapters/base/src/main/java/org/apache/cassandra/sidecar/adapters/base/TokenRangeReplicaProvider.java
+++
b/adapters/base/src/main/java/org/apache/cassandra/sidecar/adapters/base/TokenRangeReplicaProvider.java
@@ -20,6 +20,7 @@ package org.apache.cassandra.sidecar.adapters.base;
import java.math.BigInteger;
import java.net.UnknownHostException;
+import java.util.AbstractMap;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
@@ -79,10 +80,10 @@ public class TokenRangeReplicaProvider
StorageJmxOperations storage = initializeStorageOps();
List<TokenRangeReplicas> naturalTokenRangeReplicas =
- getTokenRangeReplicas("Natural", keyspace, partitioner,
storage::getRangeToEndpointWithPortMap);
+ getTokenRangeReplicas("Natural", keyspace, partitioner,
storage::getRangeToEndpointWithPortMap);
// Pending ranges include bootstrap tokens and leaving endpoints as
represented in the Cassandra TokenMetadata
List<TokenRangeReplicas> pendingTokenRangeReplicas =
- getTokenRangeReplicas("Pending", keyspace, partitioner,
storage::getPendingRangeToEndpointWithPortMap);
+ getTokenRangeReplicas("Pending", keyspace, partitioner,
storage::getPendingRangeToEndpointWithPortMap);
// Merge natural and pending range replicas to generate candidates for
write-replicas
List<TokenRangeReplicas> allTokenRangeReplicas = new
ArrayList<>(naturalTokenRangeReplicas);
@@ -94,7 +95,9 @@ public class TokenRangeReplicaProvider
List<ReplicaInfo> writeReplicas =
writeReplicasFromPendingRanges(allTokenRangeReplicas, hostToDatacenter);
List<ReplicaInfo> readReplicas =
readReplicasFromReplicaMapping(naturalTokenRangeReplicas, hostToDatacenter);
- List<ReplicaMetadata> replicaMetadata =
getReplicaMetadata(allTokenRangeReplicas, storage, hostToDatacenter);
+ Map<String, ReplicaMetadata> replicaMetadata =
replicaMetadata(allTokenRangeReplicas,
+ storage,
+
hostToDatacenter);
return new TokenRangeReplicasResponse(writeReplicas,
readReplicas,
@@ -122,9 +125,9 @@ public class TokenRangeReplicaProvider
.collect(toList());
}
- private List<ReplicaMetadata> getReplicaMetadata(List<TokenRangeReplicas>
replicaSet,
- StorageJmxOperations
storage,
- Map<String, String>
hostToDatacenter)
+ private Map<String, ReplicaMetadata>
replicaMetadata(List<TokenRangeReplicas> replicaSet,
+ StorageJmxOperations
storage,
+ Map<String, String>
hostToDatacenter)
{
List<String> joiningNodes = storage.getJoiningNodesWithPort();
List<String> leavingNodes = storage.getLeavingNodesWithPort();
@@ -148,12 +151,15 @@ public class TokenRangeReplicaProvider
try
{
HostAndPort hap =
HostAndPort.fromString(replica);
- return new ReplicaMetadata(state.of(replica),
- status.of(replica),
-
dnsResolver.reverseResolve(hap.getHost()),
- hap.getHost(),
- hap.getPort(),
-
hostToDatacenter.get(replica));
+ String fqdn =
dnsResolver.reverseResolve(hap.getHost());
+ String datacenter =
hostToDatacenter.get(replica);
+ return new AbstractMap.SimpleEntry<>(replica,
+ new
ReplicaMetadata(state.of(replica),
+
status.of(replica),
+
fqdn,
+
hap.getHost(),
+
hap.getPort(),
+
datacenter));
}
catch (UnknownHostException e)
{
@@ -161,7 +167,7 @@ public class TokenRangeReplicaProvider
String.format("Failed to resolve fqdn for
replica %s ", replica), e);
}
})
- .collect(Collectors.toList());
+
.collect(Collectors.toMap(AbstractMap.SimpleEntry::getKey,
AbstractMap.SimpleEntry::getValue));
}
protected EndpointSnitchJmxOperations initializeEndpointProxy()
diff --git
a/adapters/base/src/test/java/org/apache/cassandra/sidecar/adapters/base/TokenRangeReplicaProviderTest.java
b/adapters/base/src/test/java/org/apache/cassandra/sidecar/adapters/base/TokenRangeReplicaProviderTest.java
index 3f3d6c5..5c1253d 100644
---
a/adapters/base/src/test/java/org/apache/cassandra/sidecar/adapters/base/TokenRangeReplicaProviderTest.java
+++
b/adapters/base/src/test/java/org/apache/cassandra/sidecar/adapters/base/TokenRangeReplicaProviderTest.java
@@ -34,8 +34,11 @@ import org.junit.jupiter.api.Test;
import org.apache.cassandra.sidecar.common.JmxClient;
import org.apache.cassandra.sidecar.common.data.TokenRangeReplicasResponse;
import org.apache.cassandra.sidecar.common.dns.DnsResolver;
+import org.assertj.core.api.InstanceOfAssertFactories;
+import static org.assertj.core.api.Assertions.as;
import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.from;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.ArgumentMatchers.startsWith;
@@ -111,23 +114,12 @@ public class TokenRangeReplicaProviderTest
assertThat(result.readReplicas().get(0).replicasByDatacenter().size()).isEqualTo(1);
assertThat(result.readReplicas().get(0).replicasByDatacenter().get(TEST_DC1)).containsAll(TEST_ENDPOINTS1);
assertThat(result.replicaMetadata().size()).isEqualTo(3);
- TokenRangeReplicasResponse.ReplicaMetadata nodeMetadata =
filterReplicaMetadata(result.replicaMetadata(),
-
"127.0.0.1", 7000);
+ TokenRangeReplicasResponse.ReplicaMetadata nodeMetadata =
result.replicaMetadata().get("127.0.0.1:7000");
assertThat(nodeMetadata.state()).isEqualTo("Normal");
assertThat(nodeMetadata.status()).isEqualTo("Up");
assertThat(nodeMetadata.datacenter()).isEqualTo(TEST_DC1);
- assertThat(filterReplicaMetadata(result.replicaMetadata(),
"127.0.0.2", 7000)
- .state()).isEqualTo("Normal");
- assertThat(filterReplicaMetadata(result.replicaMetadata(),
"127.0.0.3", 7000)
- .state()).isEqualTo("Normal");
- }
-
- private TokenRangeReplicasResponse.ReplicaMetadata filterReplicaMetadata(
- List<TokenRangeReplicasResponse.ReplicaMetadata> replicaMetadata, String
address, int port)
- {
- return replicaMetadata.stream()
- .filter(r -> (r.address().equals(address) &&
r.port() == port))
- .findFirst().get();
+ assertState(result.replicaMetadata(), "127.0.0.2:7000", "Normal");
+ assertState(result.replicaMetadata(), "127.0.0.3:7000", "Normal");
}
@Test
@@ -168,24 +160,19 @@ public class TokenRangeReplicaProviderTest
assertThat(result.readReplicas().get(0).replicasByDatacenter().get(TEST_DC1)).containsAll(TEST_ENDPOINTS1);
assertThat(result.readReplicas().get(1).replicasByDatacenter().get(TEST_DC2)).containsAll(TEST_ENDPOINTS2);
assertThat(result.replicaMetadata().size()).isEqualTo(5);
- TokenRangeReplicasResponse.ReplicaMetadata nodeMetadataDc1 =
filterReplicaMetadata(result.replicaMetadata(),
-
"127.0.0.1", 7000);
+ TokenRangeReplicasResponse.ReplicaMetadata nodeMetadataDc1 =
result.replicaMetadata().get("127.0.0.1:7000");
assertThat(nodeMetadataDc1.state()).isEqualTo("Normal");
assertThat(nodeMetadataDc1.status()).isEqualTo("Up");
assertThat(nodeMetadataDc1.datacenter()).isEqualTo(TEST_DC1);
- assertThat(filterReplicaMetadata(result.replicaMetadata(),
"127.0.0.2", 7000)
- .state()).isEqualTo("Leaving");
- assertThat(filterReplicaMetadata(result.replicaMetadata(),
"127.0.0.3", 7000)
- .state()).isEqualTo("Normal");
+ assertState(result.replicaMetadata(), "127.0.0.2:7000", "Leaving");
+ assertState(result.replicaMetadata(), "127.0.0.3:7000", "Normal");
- TokenRangeReplicasResponse.ReplicaMetadata nodeMetadatDc2 =
filterReplicaMetadata(result.replicaMetadata(),
-
"128.0.0.1", 7000);
+ TokenRangeReplicasResponse.ReplicaMetadata nodeMetadatDc2 =
result.replicaMetadata().get("128.0.0.1:7000");
assertThat(nodeMetadatDc2.state()).isEqualTo("Leaving");
assertThat(nodeMetadatDc2.status()).isEqualTo("Up");
assertThat(nodeMetadatDc2.datacenter()).isEqualTo(TEST_DC2);
- assertThat(filterReplicaMetadata(result.replicaMetadata(),
"128.0.0.2", 7000)
- .state()).isEqualTo("Normal");
+ assertState(result.replicaMetadata(), "128.0.0.2:7000", "Normal");
}
@Test
@@ -228,19 +215,12 @@ public class TokenRangeReplicaProviderTest
assertThat(replicaInfoWithMultipleDCs.replicasByDatacenter().size()).isEqualTo(2);
assertThat(result.readReplicas().get(0).replicasByDatacenter().get(TEST_DC1)).containsAll(TEST_ENDPOINTS1);
assertThat(result.readReplicas().get(1).replicasByDatacenter().get(TEST_DC2)).containsAll(TEST_ENDPOINTS2);
- assertThat(filterReplicaMetadata(result.replicaMetadata(),
"127.0.0.1", 7000)
- .state()).isEqualTo("Leaving");
- assertThat(filterReplicaMetadata(result.replicaMetadata(),
"127.0.0.2", 7000)
- .state()).isEqualTo("Leaving");
- assertThat(filterReplicaMetadata(result.replicaMetadata(),
"127.0.0.3", 7000)
- .state()).isEqualTo("Normal");
- assertThat(filterReplicaMetadata(result.replicaMetadata(),
"127.0.0.4", 7000)
- .state()).isEqualTo("Normal");
- assertThat(filterReplicaMetadata(result.replicaMetadata(),
"128.0.0.1", 7000)
- .state()).isEqualTo("Leaving");
- assertThat(filterReplicaMetadata(result.replicaMetadata(),
"128.0.0.2", 7000)
- .state()).isEqualTo("Normal");
-
+ assertState(result.replicaMetadata(), "127.0.0.1:7000", "Leaving");
+ assertState(result.replicaMetadata(), "127.0.0.2:7000", "Leaving");
+ assertState(result.replicaMetadata(), "127.0.0.3:7000", "Normal");
+ assertState(result.replicaMetadata(), "127.0.0.4:7000", "Normal");
+ assertState(result.replicaMetadata(), "128.0.0.1:7000", "Leaving");
+ assertState(result.replicaMetadata(), "128.0.0.2:7000", "Normal");
}
@Test
@@ -276,17 +256,11 @@ public class TokenRangeReplicaProviderTest
assertThat(result.readReplicas().size()).isEqualTo(1);
assertThat(result.readReplicas().get(0).replicasByDatacenter().size()).isEqualTo(1);
assertThat(result.readReplicas().get(0).replicasByDatacenter().get(TEST_DC1)).containsAll(TEST_ENDPOINTS1);
- assertThat(filterReplicaMetadata(result.replicaMetadata(),
"127.0.0.1", 7000)
- .state()).isEqualTo("Normal");
- assertThat(filterReplicaMetadata(result.replicaMetadata(),
"127.0.0.2", 7000)
- .state()).isEqualTo("Normal");
- assertThat(filterReplicaMetadata(result.replicaMetadata(),
"127.0.0.3", 7000)
- .state()).isEqualTo("Leaving");
- assertThat(filterReplicaMetadata(result.replicaMetadata(),
"128.0.0.1", 7000)
- .state()).isEqualTo("Leaving");
- assertThat(filterReplicaMetadata(result.replicaMetadata(),
"128.0.0.2", 7000)
- .state()).isEqualTo("Normal");
-
+ assertState(result.replicaMetadata(), "127.0.0.1:7000", "Normal");
+ assertState(result.replicaMetadata(), "127.0.0.2:7000", "Normal");
+ assertState(result.replicaMetadata(), "127.0.0.3:7000", "Leaving");
+ assertState(result.replicaMetadata(), "128.0.0.1:7000", "Leaving");
+ assertState(result.replicaMetadata(), "128.0.0.2:7000", "Normal");
}
@Test
@@ -324,12 +298,9 @@ public class TokenRangeReplicaProviderTest
Long.toString(Long.MAX_VALUE))).isTrue();
assertThat(validateRangeExists(result.writeReplicas(),
"3074457345618258602",
Long.toString(Long.MAX_VALUE))).isTrue();
- assertThat(filterReplicaMetadata(result.replicaMetadata(),
"127.0.0.1", 7000)
- .state()).isEqualTo("Normal");
- assertThat(filterReplicaMetadata(result.replicaMetadata(),
"127.0.0.2", 7000)
- .state()).isEqualTo("Normal");
- assertThat(filterReplicaMetadata(result.replicaMetadata(),
"127.0.0.3", 7000)
- .state()).isEqualTo("Normal");
+ assertState(result.replicaMetadata(), "127.0.0.1:7000", "Normal");
+ assertState(result.replicaMetadata(), "127.0.0.2:7000", "Normal");
+ assertState(result.replicaMetadata(), "127.0.0.3:7000", "Normal");
}
@Test
@@ -380,14 +351,10 @@ public class TokenRangeReplicaProviderTest
// Existing read replicas wrap-around range ends at "maxToken"
assertThat(validateRangeExists(result.readReplicas(),
"3074457345618258602",
Long.toString(Long.MAX_VALUE))).isTrue();
- assertThat(filterReplicaMetadata(result.replicaMetadata(),
"127.0.0.1", 7000)
- .state()).isEqualTo("Normal");
- assertThat(filterReplicaMetadata(result.replicaMetadata(),
"127.0.0.2", 7000)
- .state()).isEqualTo("Leaving");
- assertThat(filterReplicaMetadata(result.replicaMetadata(),
"127.0.0.3", 7000)
- .state()).isEqualTo("Normal");
- assertThat(filterReplicaMetadata(result.replicaMetadata(),
"127.0.0.4", 7000)
- .state()).isEqualTo("Leaving");
+ assertState(result.replicaMetadata(), "127.0.0.1:7000", "Normal");
+ assertState(result.replicaMetadata(), "127.0.0.2:7000", "Leaving");
+ assertState(result.replicaMetadata(), "127.0.0.3:7000", "Normal");
+ assertState(result.replicaMetadata(), "127.0.0.4:7000", "Leaving");
}
@Test
@@ -431,15 +398,10 @@ public class TokenRangeReplicaProviderTest
assertThat(validateRangeExists(result.writeReplicas(),
"6148914691236517204",
Long.toString(Long.MAX_VALUE))).isTrue();
- assertThat(filterReplicaMetadata(result.replicaMetadata(),
"127.0.0.1", 7000)
- .state()).isEqualTo("Leaving");
- assertThat(filterReplicaMetadata(result.replicaMetadata(),
"127.0.0.2", 7000)
- .state()).isEqualTo("Normal");
- assertThat(filterReplicaMetadata(result.replicaMetadata(),
"127.0.0.3", 7000)
- .state()).isEqualTo("Normal");
- assertThat(filterReplicaMetadata(result.replicaMetadata(),
"127.0.0.4", 7000)
- .state()).isEqualTo("Replacing");
-
+ assertState(result.replicaMetadata(), "127.0.0.1:7000", "Leaving");
+ assertState(result.replicaMetadata(), "127.0.0.2:7000", "Normal");
+ assertState(result.replicaMetadata(), "127.0.0.3:7000", "Normal");
+ assertState(result.replicaMetadata(), "127.0.0.4:7000", "Replacing");
}
@Test
@@ -484,15 +446,11 @@ public class TokenRangeReplicaProviderTest
assertThat(validateRangeExists(result.writeReplicas(),
"6148914691236517204",
Long.toString(Long.MAX_VALUE))).isTrue();
- assertThat(filterReplicaMetadata(result.replicaMetadata(),
"127.0.0.1", 7000)
- .state()).isEqualTo("Leaving");
- assertThat(filterReplicaMetadata(result.replicaMetadata(),
"127.0.0.2", 7000)
- .state()).isEqualTo("Normal");
- assertThat(filterReplicaMetadata(result.replicaMetadata(),
"127.0.0.3", 7000)
- .state()).isEqualTo("Normal");
- assertThat(filterReplicaMetadata(result.replicaMetadata(),
"127.0.0.4", 7000)
- .state()).isEqualTo("Replacing");
-
+ Map<String, TokenRangeReplicasResponse.ReplicaMetadata> map =
result.replicaMetadata();
+ assertState(map, "127.0.0.1:7000", "Leaving");
+ assertState(map, "127.0.0.2:7000", "Normal");
+ assertState(map, "127.0.0.3:7000", "Normal");
+ assertState(map, "127.0.0.4:7000", "Replacing");
}
private boolean
validateRangeExists(List<TokenRangeReplicasResponse.ReplicaInfo> ranges, String
start, String end)
@@ -557,4 +515,14 @@ public class TokenRangeReplicaProviderTest
{
return exclude ? "" : String.format(status, value);
}
+
+ private static void assertState(Map<String,
TokenRangeReplicasResponse.ReplicaMetadata> map,
+ String ipAndPort,
+ String expectedState)
+ {
+ assertThat(map.get(ipAndPort)).isNotNull()
+
.extracting(from(TokenRangeReplicasResponse.ReplicaMetadata::state),
+
as(InstanceOfAssertFactories.STRING))
+ .isEqualTo(expectedState);
+ }
}
diff --git
a/client/src/testFixtures/java/org/apache/cassandra/sidecar/client/SidecarClientTest.java
b/client/src/testFixtures/java/org/apache/cassandra/sidecar/client/SidecarClientTest.java
index d1e1132..669f9a4 100644
---
a/client/src/testFixtures/java/org/apache/cassandra/sidecar/client/SidecarClientTest.java
+++
b/client/src/testFixtures/java/org/apache/cassandra/sidecar/client/SidecarClientTest.java
@@ -115,9 +115,9 @@ abstract class SidecarClientTest
void testSidecarHealthOk() throws Exception
{
MockResponse response = new MockResponse()
- .setResponseCode(200)
- .setHeader("content-type", "application/json")
- .setBody("{\"status\":\"OK\"}");
+ .setResponseCode(200)
+ .setHeader("content-type", "application/json")
+ .setBody("{\"status\":\"OK\"}");
enqueue(response);
HealthResponse result = client.sidecarHealth().get(30,
TimeUnit.SECONDS);
@@ -132,14 +132,14 @@ abstract class SidecarClientTest
void testSidecarHealthNotOk() throws Exception
{
MockResponse response = new MockResponse()
- .setResponseCode(503)
- .setHeader("content-type", "application/json")
- .setBody("{\"status\":\"NOT_OK\"}");
+ .setResponseCode(503)
+ .setHeader("content-type", "application/json")
+ .setBody("{\"status\":\"NOT_OK\"}");
enqueue(response);
assertThatThrownBy(() -> client.sidecarHealth().get(30,
TimeUnit.SECONDS))
- .isInstanceOf(ExecutionException.class)
- .hasCauseInstanceOf(RetriesExhaustedException.class);
+ .isInstanceOf(ExecutionException.class)
+ .hasCauseInstanceOf(RetriesExhaustedException.class);
validateResponseServed(ApiEndpointsV1.HEALTH_ROUTE);
}
@@ -148,9 +148,9 @@ abstract class SidecarClientTest
void testCassandraHealthOk() throws Exception
{
MockResponse response = new MockResponse()
- .setResponseCode(200)
- .setHeader("content-type", "application/json")
- .setBody("{\"status\":\"OK\"}");
+ .setResponseCode(200)
+ .setHeader("content-type", "application/json")
+ .setBody("{\"status\":\"OK\"}");
enqueue(response);
HealthResponse result = client.cassandraHealth().get(30,
TimeUnit.SECONDS);
@@ -165,14 +165,14 @@ abstract class SidecarClientTest
void testCassandraHealthNotOk() throws Exception
{
MockResponse response = new MockResponse()
- .setResponseCode(503)
- .setHeader("content-type", "application/json")
- .setBody("{\"status\":\"NOT_OK\"}");
+ .setResponseCode(503)
+ .setHeader("content-type", "application/json")
+ .setBody("{\"status\":\"NOT_OK\"}");
enqueue(response);
assertThatThrownBy(() -> client.cassandraHealth().get(30,
TimeUnit.SECONDS))
- .isInstanceOf(ExecutionException.class)
- .hasCauseInstanceOf(RetriesExhaustedException.class);
+ .isInstanceOf(ExecutionException.class)
+ .hasCauseInstanceOf(RetriesExhaustedException.class);
validateResponseServed(ApiEndpointsV1.CASSANDRA_HEALTH_ROUTE);
}
@@ -333,13 +333,13 @@ abstract class SidecarClientTest
String nodeWithPort = nodeAddress + ":" + port;
String expectedRangeStart = "-9223372036854775808";
String expectedRangeEnd = "9223372036854775807";
- String tokenRangeReplicasAsString = "{\"replicaMetadata\":[{" +
+ String tokenRangeReplicasAsString =
"{\"replicaMetadata\":{\"127.0.0.1:7000\":{" +
"\"state\":\"Normal\"," +
"\"status\":\"Up\"," +
"\"fqdn\":\"localhost\"," +
"\"address\":\"127.0.0.1\"," +
"\"port\":7000," +
-
"\"datacenter\":\"datacenter1\"}]," +
+
"\"datacenter\":\"datacenter1\"}}," +
"\"writeReplicas\":[{\"start\":\"-9223372036854775808\"," +
"\"end\":\"9223372036854775807\",\"replicasByDatacenter\":" +
"{\"datacenter1\":[\"127.0.0.1:7000\"]}}],\"readReplicas\":" +
@@ -364,15 +364,9 @@ abstract class SidecarClientTest
assertThat(readReplica.replicasByDatacenter()).containsKey("datacenter1");
assertThat(readReplica.replicasByDatacenter().get("datacenter1")).containsExactly(nodeWithPort);
assertThat(result.replicaMetadata()).hasSize(1);
- TokenRangeReplicasResponse.ReplicaMetadata instanceMetadata =
- result.replicaMetadata().stream()
- .filter(r -> r.address().equals(nodeAddress) && r.port() == port)
- .findFirst()
- .get();
+ TokenRangeReplicasResponse.ReplicaMetadata instanceMetadata =
result.replicaMetadata().get(nodeWithPort);
assertThat(instanceMetadata.state()).isEqualTo("Normal");
assertThat(instanceMetadata.status()).isEqualTo("Up");
- assertThat(instanceMetadata.address()).isEqualTo("127.0.0.1");
- assertThat(instanceMetadata.port()).isEqualTo(7000);
assertThat(instanceMetadata.fqdn()).isEqualTo("localhost");
assertThat(instanceMetadata.datacenter()).isEqualTo("datacenter1");
@@ -1002,36 +996,37 @@ abstract class SidecarClientTest
MockResponse response = new
MockResponse().setResponseCode(ACCEPTED.code()).setBody(nodeSettingsAsString);
enqueue(response);
- RequestContext requestContext = client.requestBuilder()
- .request(new NodeSettingsRequest())
- .retryPolicy(new RetryPolicy()
- {
- @Override
- public void
onResponse(CompletableFuture<HttpResponse> responseFuture,
- Request
request,
- HttpResponse
response,
- Throwable
throwable,
- int attempts,
- boolean
canRetryOnADifferentHost,
- RetryAction
retryAction)
- {
- if (response != null &&
response.statusCode() == ACCEPTED.code())
- {
-
responseFuture.complete(response);
- }
- else
- {
-
client.defaultRetryPolicy().onResponse(responseFuture,
-
request,
-
response,
-
throwable,
-
attempts,
-
canRetryOnADifferentHost,
-
retryAction);
- }
- }
- })
- .build();
+ RequestContext requestContext =
+ client.requestBuilder()
+ .request(new NodeSettingsRequest())
+ .retryPolicy(new RetryPolicy()
+ {
+ @Override
+ public void onResponse(CompletableFuture<HttpResponse>
responseFuture,
+ Request request,
+ HttpResponse response,
+ Throwable throwable,
+ int attempts,
+ boolean canRetryOnADifferentHost,
+ RetryAction retryAction)
+ {
+ if (response != null && response.statusCode() ==
ACCEPTED.code())
+ {
+ responseFuture.complete(response);
+ }
+ else
+ {
+
client.defaultRetryPolicy().onResponse(responseFuture,
+ request,
+ response,
+ throwable,
+ attempts,
+
canRetryOnADifferentHost,
+ retryAction);
+ }
+ }
+ })
+ .build();
NodeSettings result =
client.<NodeSettings>executeRequestAsync(requestContext).get(30,
TimeUnit.SECONDS);
assertThat(result).isNotNull();
assertThat(result.partitioner()).isEqualTo("test-partitioner");
diff --git
a/common/src/main/java/org/apache/cassandra/sidecar/common/data/TokenRangeReplicasResponse.java
b/common/src/main/java/org/apache/cassandra/sidecar/common/data/TokenRangeReplicasResponse.java
index 68911eb..e79e740 100644
---
a/common/src/main/java/org/apache/cassandra/sidecar/common/data/TokenRangeReplicasResponse.java
+++
b/common/src/main/java/org/apache/cassandra/sidecar/common/data/TokenRangeReplicasResponse.java
@@ -32,18 +32,18 @@ public class TokenRangeReplicasResponse
private final List<ReplicaInfo> writeReplicas;
private final List<ReplicaInfo> readReplicas;
- private final List<ReplicaMetadata> replicaMetadata;
+ private final Map<String, ReplicaMetadata> replicaMetadata;
/**
* Constructs token range replicas response object with given params.
*
- * @param writeReplicas list of write replicas {@link ReplicaInfo}
instances breakdown by token range
- * @param readReplicas list of read replica {@link ReplicaInfo} instances
breakdown by token range
- * @param replicaMetadata mapping replica to it's state and status
information
+ * @param writeReplicas list of write replicas {@link ReplicaInfo}
instances breakdown by token range
+ * @param readReplicas list of read replica {@link ReplicaInfo}
instances breakdown by token range
+ * @param replicaMetadata mapping replica to it's state and status
information
*/
public TokenRangeReplicasResponse(@JsonProperty("writeReplicas")
List<ReplicaInfo> writeReplicas,
@JsonProperty("readReplicas")
List<ReplicaInfo> readReplicas,
- @JsonProperty("replicaMetadata")
List<ReplicaMetadata> replicaMetadata)
+ @JsonProperty("replicaMetadata")
Map<String, ReplicaMetadata> replicaMetadata)
{
this.writeReplicas = writeReplicas;
this.readReplicas = readReplicas;
@@ -54,7 +54,7 @@ public class TokenRangeReplicasResponse
* @return metadata associated with each replica
*/
@JsonProperty("replicaMetadata")
- public List<ReplicaMetadata> replicaMetadata()
+ public Map<String, ReplicaMetadata> replicaMetadata()
{
return replicaMetadata;
}
@@ -88,11 +88,11 @@ public class TokenRangeReplicasResponse
public ReplicaInfo(@JsonProperty("start") String start,
@JsonProperty("end") String end,
- @JsonProperty("replicas") Map<String, List<String>>
replicasByDc)
+ @JsonProperty("replicas") Map<String, List<String>>
replicasByDatacenter)
{
this.start = start;
this.end = end;
- this.replicasByDatacenter = replicasByDc;
+ this.replicasByDatacenter = replicasByDatacenter;
}
/**
@@ -125,6 +125,7 @@ public class TokenRangeReplicasResponse
/**
* {@inheritDoc}
*/
+ @Override
public boolean equals(Object o)
{
if (this == o) return true;
@@ -138,6 +139,7 @@ public class TokenRangeReplicasResponse
/**
* {@inheritDoc}
*/
+ @Override
public int hashCode()
{
return Objects.hash(start, end, replicasByDatacenter);
@@ -146,6 +148,7 @@ public class TokenRangeReplicasResponse
/**
* {@inheritDoc}
*/
+ @Override
public String toString()
{
return "ReplicaInfo{" +
@@ -237,7 +240,6 @@ public class TokenRangeReplicasResponse
return datacenter;
}
-
/**
* {@inheritDoc}
*/
diff --git a/scripts/build-shaded-dtest-jar-local.sh
b/scripts/build-shaded-dtest-jar-local.sh
index 66401ba..9026519 100755
--- a/scripts/build-shaded-dtest-jar-local.sh
+++ b/scripts/build-shaded-dtest-jar-local.sh
@@ -30,6 +30,7 @@ DTEST_JAR_DIR="$(dirname "${SCRIPT_DIR}/")/dtest-jars"
echo "${CASSANDRA_VERSION}"
echo "${GIT_HASH}"
echo "${DTEST_ARTIFACT_ID}"
+echo "${JAVA_HOME}"
ant realclean
ant dtest-jar -Dno-checkstyle=true
diff --git
a/src/test/integration/org/apache/cassandra/sidecar/routes/tokenrange/BaseTokenRangeIntegrationTest.java
b/src/test/integration/org/apache/cassandra/sidecar/routes/tokenrange/BaseTokenRangeIntegrationTest.java
index 7ebf902..a3180eb 100644
---
a/src/test/integration/org/apache/cassandra/sidecar/routes/tokenrange/BaseTokenRangeIntegrationTest.java
+++
b/src/test/integration/org/apache/cassandra/sidecar/routes/tokenrange/BaseTokenRangeIntegrationTest.java
@@ -46,10 +46,13 @@ import
org.apache.cassandra.sidecar.common.data.TokenRangeReplicasResponse;
import org.apache.cassandra.testing.AbstractCassandraTestContext;
import org.apache.cassandra.testing.CassandraIntegrationTest;
import org.apache.cassandra.testing.ConfigurableCassandraTestContext;
+import org.assertj.core.api.InstanceOfAssertFactories;
import static
org.apache.cassandra.distributed.shared.NetworkTopology.dcAndRack;
import static
org.apache.cassandra.distributed.shared.NetworkTopology.networkTopology;
+import static org.assertj.core.api.Assertions.as;
import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.from;
/**
* Test the token range replica mapping endpoint with the in-jvm dtest
framework.
@@ -106,9 +109,10 @@ public class BaseTokenRangeIntegrationTest extends
IntegrationTestBase
+ config.broadcastAddress().getPort();
String expectedStatus = stateFunction.apply(i);
-
assertThat(filterReplicaMetadata(mappingResponse.replicaMetadata(),
-
config.broadcastAddress().getAddress().getHostAddress(),
-
config.broadcastAddress().getPort()).state())
+ assertThat(mappingResponse.replicaMetadata().get(ipAndPort))
+ .isNotNull()
+
.extracting(from(TokenRangeReplicasResponse.ReplicaMetadata::state),
+ as(InstanceOfAssertFactories.STRING))
.isEqualTo(expectedStatus);
}
}
@@ -204,7 +208,8 @@ public class BaseTokenRangeIntegrationTest extends
IntegrationTestBase
return expectedRanges;
}
- protected Set<String>
instancesFromReplicaSet(List<TokenRangeReplicasResponse.ReplicaInfo> replicas)
+ protected Set<String>
+ instancesFromReplicaSet(List<TokenRangeReplicasResponse.ReplicaInfo>
replicas)
{
return replicas.stream()
.flatMap(r ->
r.replicasByDatacenter().values().stream())
@@ -254,21 +259,13 @@ public class BaseTokenRangeIntegrationTest extends
IntegrationTestBase
}
}
- private TokenRangeReplicasResponse.ReplicaMetadata filterReplicaMetadata(
- List<TokenRangeReplicasResponse.ReplicaMetadata> replicaMetadata, String
address, int port)
- {
- return replicaMetadata.stream()
- .filter(r -> (r.address().equals(address) &&
r.port() == port))
- .findFirst().get();
- }
-
void retrieveMappingWithKeyspace(VertxTestContext context, String keyspace,
Handler<HttpResponse<Buffer>> verifier)
throws Exception
{
String testRoute = "/api/v1/keyspaces/" + keyspace +
"/token-range-replicas";
testWithClient(context, client -> client.get(server.actualPort(),
"127.0.0.1", testRoute)
-
.send(context.succeeding(verifier)));
+
.send(context.succeeding(verifier)));
}
void assertMappingResponseOK(TokenRangeReplicasResponse mappingResponse,
diff --git
a/src/test/integration/org/apache/cassandra/sidecar/routes/tokenrange/JoiningBaseTest.java
b/src/test/integration/org/apache/cassandra/sidecar/routes/tokenrange/JoiningBaseTest.java
index 924eb71..5b12101 100644
---
a/src/test/integration/org/apache/cassandra/sidecar/routes/tokenrange/JoiningBaseTest.java
+++
b/src/test/integration/org/apache/cassandra/sidecar/routes/tokenrange/JoiningBaseTest.java
@@ -177,14 +177,13 @@ class JoiningBaseTest extends
BaseTokenRangeIntegrationTest
Set<String> writeReplicaInstances =
instancesFromReplicaSet(mappingResponse.writeReplicas());
Set<String> readReplicaInstances =
instancesFromReplicaSet(mappingResponse.readReplicas());
- Set<String> splitRangeReplicas
- = mappingResponse.writeReplicas().stream()
- .filter(w -> matchSplitRanges(w, splitRanges))
- .map(r ->
- r.replicasByDatacenter().values())
- .flatMap(Collection::stream)
- .flatMap(list -> list.stream())
- .collect(Collectors.toSet());
+ Set<String> splitRangeReplicas =
mappingResponse.writeReplicas().stream()
+ .filter(w ->
matchSplitRanges(w, splitRanges))
+ .map(r ->
+
r.replicasByDatacenter().values())
+
.flatMap(Collection::stream)
+
.flatMap(Collection::stream)
+
.collect(Collectors.toSet());
assertThat(readReplicaInstances).doesNotContainAnyElementsOf(transientNodeAddresses);
// Validate that the new nodes are mapped to the split ranges
diff --git
a/src/test/integration/org/apache/cassandra/sidecar/routes/tokenrange/MovingBaseTest.java
b/src/test/integration/org/apache/cassandra/sidecar/routes/tokenrange/MovingBaseTest.java
index 22d3b0e..eb5b3c9 100644
---
a/src/test/integration/org/apache/cassandra/sidecar/routes/tokenrange/MovingBaseTest.java
+++
b/src/test/integration/org/apache/cassandra/sidecar/routes/tokenrange/MovingBaseTest.java
@@ -135,7 +135,7 @@ class MovingBaseTest extends BaseTokenRangeIntegrationTest
.stream()
.filter(r -> r.end().equals(String.valueOf(moveTo)))
.findAny();
- assertThat(moveResultRange.isPresent());
+ assertThat(moveResultRange).isPresent();
List<String> replicasInRange =
moveResultRange.get().replicasByDatacenter().values()
.stream()
.flatMap(Collection::stream)
diff --git
a/src/test/java/org/apache/cassandra/sidecar/routes/sstableuploads/BaseUploadsHandlerTest.java
b/src/test/java/org/apache/cassandra/sidecar/routes/sstableuploads/BaseUploadsHandlerTest.java
index 1cff296..1705c1f 100644
---
a/src/test/java/org/apache/cassandra/sidecar/routes/sstableuploads/BaseUploadsHandlerTest.java
+++
b/src/test/java/org/apache/cassandra/sidecar/routes/sstableuploads/BaseUploadsHandlerTest.java
@@ -68,6 +68,7 @@ import static
org.apache.cassandra.sidecar.config.yaml.TrafficShapingConfigurati
import static
org.apache.cassandra.sidecar.config.yaml.TrafficShapingConfigurationImpl.DEFAULT_PEAK_OUTBOUND_GLOBAL_BANDWIDTH_LIMIT;
import static
org.apache.cassandra.sidecar.snapshots.SnapshotUtils.mockInstancesConfig;
import static org.assertj.core.api.Assertions.assertThat;
+import static org.mockito.Mockito.doNothing;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
@@ -95,6 +96,7 @@ class BaseUploadsHandlerTest
{
canonicalTemporaryPath = temporaryPath.toFile().getCanonicalPath();
mockDelegate = mock(CassandraAdapterDelegate.class);
+ doNothing().when(mockDelegate).healthCheck();
TestModule testModule = new TestModule();
mockSSTableUploadConfiguration =
mock(SSTableUploadConfiguration.class);
when(mockSSTableUploadConfiguration.concurrentUploadsLimit()).thenReturn(3);
diff --git a/src/test/resources/certs/client_keystore.jks
b/src/test/resources/certs/client_keystore.jks
index f08e983..22c090b 100644
Binary files a/src/test/resources/certs/client_keystore.jks and
b/src/test/resources/certs/client_keystore.jks differ
diff --git a/src/test/resources/certs/client_keystore.p12
b/src/test/resources/certs/client_keystore.p12
index 7c504af..59c2610 100644
Binary files a/src/test/resources/certs/client_keystore.p12 and
b/src/test/resources/certs/client_keystore.p12 differ
diff --git a/src/test/resources/certs/expired_server_keystore.jks
b/src/test/resources/certs/expired_server_keystore.jks
index e9bbda1..8e726ce 100644
Binary files a/src/test/resources/certs/expired_server_keystore.jks and
b/src/test/resources/certs/expired_server_keystore.jks differ
diff --git a/src/test/resources/certs/expired_server_keystore.p12
b/src/test/resources/certs/expired_server_keystore.p12
index acfae0a..392b79d 100644
Binary files a/src/test/resources/certs/expired_server_keystore.p12 and
b/src/test/resources/certs/expired_server_keystore.p12 differ
diff --git a/src/test/resources/certs/generate-client-keystore.sh
b/src/test/resources/certs/generate-client-keystore.sh
index b6dcd48..a45b622 100755
--- a/src/test/resources/certs/generate-client-keystore.sh
+++ b/src/test/resources/certs/generate-client-keystore.sh
@@ -19,6 +19,7 @@
# A utility script to re-generate the server keystores used for testing
+SCRIPT_DIR=$( dirname -- "$( readlink -f -- "$0"; )"; )
CERT_VALIDITY_DAYS=${CERT_VALIDITY_DAYS:-1825}
FILE_NAME=${FILE_NAME:-client_keystore}
diff --git a/src/test/resources/certs/generate-server-keystore.sh
b/src/test/resources/certs/generate-server-keystore.sh
index c052083..e316f68 100755
--- a/src/test/resources/certs/generate-server-keystore.sh
+++ b/src/test/resources/certs/generate-server-keystore.sh
@@ -19,6 +19,7 @@
# A utility script to re-generate the server keystores used for testing
+SCRIPT_DIR=$( dirname -- "$( readlink -f -- "$0"; )"; )
CERT_VALIDITY_DAYS=${CERT_VALIDITY_DAYS:-1825}
FILE_NAME=${FILE_NAME:-server_keystore}
diff --git a/src/test/resources/certs/server_keystore.jks
b/src/test/resources/certs/server_keystore.jks
index 5b369dc..1031b3b 100644
Binary files a/src/test/resources/certs/server_keystore.jks and
b/src/test/resources/certs/server_keystore.jks differ
diff --git a/src/test/resources/certs/server_keystore.p12
b/src/test/resources/certs/server_keystore.p12
index 07f58fa..591c7fd 100644
Binary files a/src/test/resources/certs/server_keystore.p12 and
b/src/test/resources/certs/server_keystore.p12 differ
diff --git a/src/test/resources/certs/truststore.jks
b/src/test/resources/certs/truststore.jks
index 40364fa..45a1705 100644
Binary files a/src/test/resources/certs/truststore.jks and
b/src/test/resources/certs/truststore.jks differ
diff --git a/src/test/resources/certs/truststore.p12
b/src/test/resources/certs/truststore.p12
index 820ce34..cb1cea0 100644
Binary files a/src/test/resources/certs/truststore.p12 and
b/src/test/resources/certs/truststore.p12 differ
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]