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]


Reply via email to