diff --git a/CHANGES.txt b/CHANGES.txt index b5400d6ab..a6e870089 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,5 +1,6 @@ 0.3.0 ----- + * RangeManager should be singleton in CDCModule (CASSSIDECAR-411) * CDC: Add end-to-end CDC integration tests (CASSSIDECAR-308) * SchemaStorePublisherFactory should be Injectable in CachingSchemaStore (CASSSIDECAR-408) * Fix StorageClientTest Docker API compatibility and improve CI test reporting (CASSSIDECAR-410) diff --git a/integration-tests/src/integrationTest/org/apache/cassandra/sidecar/testing/SharedClusterCdcSidecarIntegrationTestBase.java b/integration-tests/src/integrationTest/org/apache/cassandra/sidecar/testing/SharedClusterCdcSidecarIntegrationTestBase.java index 6f4110001..56b68df28 100644 --- a/integration-tests/src/integrationTest/org/apache/cassandra/sidecar/testing/SharedClusterCdcSidecarIntegrationTestBase.java +++ b/integration-tests/src/integrationTest/org/apache/cassandra/sidecar/testing/SharedClusterCdcSidecarIntegrationTestBase.java @@ -45,6 +45,7 @@ import org.apache.cassandra.sidecar.config.yaml.ServiceConfigurationImpl; import org.apache.cassandra.sidecar.config.yaml.SidecarConfigurationImpl; import org.apache.cassandra.sidecar.coordination.ContentionFreeRangeManager; +import org.apache.cassandra.sidecar.coordination.RangeManager; import org.apache.cassandra.sidecar.coordination.TokenRingProvider; import org.apache.cassandra.sidecar.db.CdcDatabaseAccessor; import org.apache.cassandra.sidecar.db.VirtualTablesDatabaseAccessor; @@ -168,6 +169,7 @@ CdcPublisher cdcPublisher(Vertx vertx, Serializer avroSerializer, TokenRingProvider tokenRingProvider) { + RangeManager rangeManager = new ContentionFreeRangeManager(vertx, tokenRingProvider); return new TestCdcPublisher(vertx, sidecarConfiguration, executorPools, @@ -182,7 +184,7 @@ CdcPublisher cdcPublisher(Vertx vertx, virtualTables, sidecarCdcStats, avroSerializer, - () -> new ContentionFreeRangeManager(vertx, tokenRingProvider)); + () -> rangeManager); } @Provides diff --git a/server/src/main/java/org/apache/cassandra/sidecar/modules/CdcModule.java b/server/src/main/java/org/apache/cassandra/sidecar/modules/CdcModule.java index b6fc14e4f..ddf094f9c 100644 --- a/server/src/main/java/org/apache/cassandra/sidecar/modules/CdcModule.java +++ b/server/src/main/java/org/apache/cassandra/sidecar/modules/CdcModule.java @@ -53,6 +53,7 @@ import org.apache.cassandra.sidecar.common.ApiEndpointsV1; import org.apache.cassandra.sidecar.common.request.data.AllServicesConfigPayload; import org.apache.cassandra.sidecar.common.response.ListCdcSegmentsResponse; +import org.apache.cassandra.sidecar.common.server.dns.DnsResolver; import org.apache.cassandra.sidecar.concurrent.ExecutorPools; import org.apache.cassandra.sidecar.config.ServiceConfiguration; import org.apache.cassandra.sidecar.config.SidecarClientConfiguration; @@ -61,6 +62,7 @@ import org.apache.cassandra.sidecar.coordination.ContentionFreeRangeManager; import org.apache.cassandra.sidecar.coordination.DynamicSidecarInstancesProvider; import org.apache.cassandra.sidecar.coordination.InnerDcTokenAdjacentPeerProvider; +import org.apache.cassandra.sidecar.coordination.RangeManager; import org.apache.cassandra.sidecar.coordination.SidecarHttpHealthProvider; import org.apache.cassandra.sidecar.coordination.SidecarPeerHealthMonitorTask; import org.apache.cassandra.sidecar.coordination.SidecarPeerHealthProvider; @@ -360,9 +362,9 @@ public ICdcStats cdcStats() @Provides @Singleton - public TokenRingProvider tokenRingProvider(InstancesMetadata instancesMetadata, InstanceMetadataFetcher instanceMetadataFetcher, ServiceConfiguration configuration) + public TokenRingProvider tokenRingProvider(InstancesMetadata instancesMetadata, InstanceMetadataFetcher instanceMetadataFetcher, DnsResolver dnsResolver) { - return new CassandraClientTokenRingProvider(instancesMetadata, instanceMetadataFetcher, configuration.dnsResolver()); + return new CassandraClientTokenRingProvider(instancesMetadata, instanceMetadataFetcher, dnsResolver); } @Provides @@ -375,6 +377,13 @@ public SidecarCdcClient.ClientConfig clientConfig(SidecarConfiguration sidecarCo sidecarClientConfiguration.retryDelay().toIntMillis()); } + @Provides + @Singleton + RangeManager rangeManager(Vertx vertx, TokenRingProvider tokenRingProvider) + { + return new ContentionFreeRangeManager(vertx, tokenRingProvider); + } + @Provides @Singleton CdcPublisher cdcPublisher(Vertx vertx, @@ -387,11 +396,11 @@ CdcPublisher cdcPublisher(Vertx vertx, InstanceMetadataFetcher instanceMetadataFetcher, CdcConfig conf, CdcDatabaseAccessor databaseAccessor, - TokenRingProvider tokenRingProvider, ICdcStats cdcStats, VirtualTablesDatabaseAccessor virtualTables, SidecarCdcStats sidecarCdcStats, - Serializer avroSerializer) + Serializer avroSerializer, + RangeManager rangeManager) { return new CdcPublisher(vertx, sidecarConfiguration, @@ -407,7 +416,7 @@ CdcPublisher cdcPublisher(Vertx vertx, virtualTables, sidecarCdcStats, avroSerializer, - () -> new ContentionFreeRangeManager(vertx, tokenRingProvider)); + () -> rangeManager); } @Provides diff --git a/server/src/test/java/org/apache/cassandra/sidecar/TestModule.java b/server/src/test/java/org/apache/cassandra/sidecar/TestModule.java index 9fdf5c155..87c33d606 100644 --- a/server/src/test/java/org/apache/cassandra/sidecar/TestModule.java +++ b/server/src/test/java/org/apache/cassandra/sidecar/TestModule.java @@ -36,6 +36,7 @@ import com.google.inject.name.Named; import io.vertx.core.Vertx; import org.apache.cassandra.sidecar.cluster.CassandraAdapterDelegate; +import org.apache.cassandra.sidecar.cluster.CassandraClientTokenRingProviderTest; import org.apache.cassandra.sidecar.cluster.InstancesMetadata; import org.apache.cassandra.sidecar.cluster.InstancesMetadataImpl; import org.apache.cassandra.sidecar.cluster.instance.InstanceMetadata; @@ -199,7 +200,7 @@ private InstanceMetadata mockInstance(TestCassandraAdapterDelegate delegate, { StorageOperations mockStorageOperations = mock(StorageOperations.class); when(mockStorageOperations.dataFileLocations()).thenReturn(List.of(dataDir)); - Metadata metadata = mock(Metadata.class); + Metadata metadata = CassandraClientTokenRingProviderTest.getMetadata(); KeyspaceMetadata keyspaceMetadata = mock(KeyspaceMetadata.class); when(metadata.getKeyspace(any())).thenReturn(keyspaceMetadata); TableMetadata tableMetadata = mock(TableMetadata.class); @@ -245,4 +246,11 @@ public CassandraVersionProvider cassandraVersionProvider() builder.add(new MockCassandraFactory()); return builder.build(); } + + @Provides + @Singleton + public DnsResolver dnsResolver() + { + return CassandraClientTokenRingProviderTest.mockDnsResolver(); + } } diff --git a/server/src/test/java/org/apache/cassandra/sidecar/cluster/CassandraClientTokenRingProviderTest.java b/server/src/test/java/org/apache/cassandra/sidecar/cluster/CassandraClientTokenRingProviderTest.java index 39ccc16e7..e4283280c 100644 --- a/server/src/test/java/org/apache/cassandra/sidecar/cluster/CassandraClientTokenRingProviderTest.java +++ b/server/src/test/java/org/apache/cassandra/sidecar/cluster/CassandraClientTokenRingProviderTest.java @@ -92,46 +92,46 @@ public String reverseResolve(String s) } }; Set allHosts = Set.of( - mockHost("local1", "127.0.0.1", "-9223372036854775808", "DC1"), - mockHost("local2", "127.0.0.2", "-8301034833169298228", "DC1"), - mockHost("local3", "127.0.0.3", "-7378697629483820647", "DC1"), - mockHost("local4", "127.0.0.4", "-6456360425798343066", "DC1"), - mockHost("local5", "127.0.0.5", "-5534023222112865485", "DC1"), - mockHost("local6", "127.0.0.6", "-4611686018427387904", "DC1"), - mockHost("local7", "127.0.0.7", "-3689348814741910324", "DC1"), - mockHost("local8", "127.0.0.8", "-2767011611056432743", "DC1"), - mockHost("local9", "127.0.0.9", "-1844674407370955162", "DC1"), - mockHost("local10", "127.0.0.10", "-922337203685477581", "DC1"), - mockHost("local11", "127.0.0.11", "0", "DC1"), - mockHost("local12", "127.0.0.12", "922337203685477580", "DC1"), - mockHost("local13", "127.0.0.13", "1844674407370955161", "DC1"), - mockHost("local14", "127.0.0.14", "2767011611056432742", "DC1"), - mockHost("local15", "127.0.0.15", "3689348814741910323", "DC1"), - mockHost("local16", "127.0.0.16", "4611686018427387904", "DC1"), - mockHost("local17", "127.0.0.17", "5534023222112865484", "DC1"), - mockHost("local18", "127.0.0.18", "6456360425798343065", "DC1"), - mockHost("local19", "127.0.0.19", "7378697629483820646", "DC1"), - mockHost("local20", "127.0.0.20", "8301034833169298227", "DC1"), - mockHost("local21", "127.0.0.21", "-9223372036854775807", "DC2"), - mockHost("local22", "127.0.0.22", "-8301034833169298227", "DC2"), - mockHost("local23", "127.0.0.23", "-7378697629483820646", "DC2"), - mockHost("local24", "127.0.0.24", "-6456360425798343065", "DC2"), - mockHost("local25", "127.0.0.25", "-5534023222112865484", "DC2"), - mockHost("local26", "127.0.0.26", "-4611686018427387903", "DC2"), - mockHost("local27", "127.0.0.27", "-3689348814741910323", "DC2"), - mockHost("local28", "127.0.0.28", "-2767011611056432742", "DC2"), - mockHost("local29", "127.0.0.29", "-1844674407370955161", "DC2"), - mockHost("local30", "127.0.0.30", "-922337203685477580", "DC2"), - mockHost("local31", "127.0.0.31", "1", "DC2"), - mockHost("local32", "127.0.0.32", "922337203685477581", "DC2"), - mockHost("local33", "127.0.0.33", "1844674407370955162", "DC2"), - mockHost("local34", "127.0.0.34", "2767011611056432743", "DC2"), - mockHost("local35", "127.0.0.35", "3689348814741910324", "DC2"), - mockHost("local36", "127.0.0.36", "4611686018427387905", "DC2"), - mockHost("local37", "127.0.0.37", "5534023222112865485", "DC2"), - mockHost("local38", "127.0.0.38", "6456360425798343066", "DC2"), - mockHost("local39", "127.0.0.39", "7378697629483820647", "DC2"), - mockHost("local40", "127.0.0.40", "8301034833169298228", "DC2") + mockHost("localhost1", "127.0.0.1", "-9223372036854775808", "DC1"), + mockHost("localhost2", "127.0.0.2", "-8301034833169298228", "DC1"), + mockHost("localhost3", "127.0.0.3", "-7378697629483820647", "DC1"), + mockHost("localhost4", "127.0.0.4", "-6456360425798343066", "DC1"), + mockHost("localhost5", "127.0.0.5", "-5534023222112865485", "DC1"), + mockHost("localhost6", "127.0.0.6", "-4611686018427387904", "DC1"), + mockHost("localhost7", "127.0.0.7", "-3689348814741910324", "DC1"), + mockHost("localhost8", "127.0.0.8", "-2767011611056432743", "DC1"), + mockHost("localhost9", "127.0.0.9", "-1844674407370955162", "DC1"), + mockHost("localhost10", "127.0.0.10", "-922337203685477581", "DC1"), + mockHost("localhost11", "127.0.0.11", "0", "DC1"), + mockHost("localhost12", "127.0.0.12", "922337203685477580", "DC1"), + mockHost("localhost13", "127.0.0.13", "1844674407370955161", "DC1"), + mockHost("localhost14", "127.0.0.14", "2767011611056432742", "DC1"), + mockHost("localhost15", "127.0.0.15", "3689348814741910323", "DC1"), + mockHost("localhost16", "127.0.0.16", "4611686018427387904", "DC1"), + mockHost("localhost17", "127.0.0.17", "5534023222112865484", "DC1"), + mockHost("localhost18", "127.0.0.18", "6456360425798343065", "DC1"), + mockHost("localhost19", "127.0.0.19", "7378697629483820646", "DC1"), + mockHost("localhost20", "127.0.0.20", "8301034833169298227", "DC1"), + mockHost("localhost21", "127.0.0.21", "-9223372036854775807", "DC2"), + mockHost("localhost22", "127.0.0.22", "-8301034833169298227", "DC2"), + mockHost("localhost23", "127.0.0.23", "-7378697629483820646", "DC2"), + mockHost("localhost24", "127.0.0.24", "-6456360425798343065", "DC2"), + mockHost("localhost25", "127.0.0.25", "-5534023222112865484", "DC2"), + mockHost("localhost26", "127.0.0.26", "-4611686018427387903", "DC2"), + mockHost("localhost27", "127.0.0.27", "-3689348814741910323", "DC2"), + mockHost("localhost28", "127.0.0.28", "-2767011611056432742", "DC2"), + mockHost("localhost29", "127.0.0.29", "-1844674407370955161", "DC2"), + mockHost("localhost30", "127.0.0.30", "-922337203685477580", "DC2"), + mockHost("localhost31", "127.0.0.31", "1", "DC2"), + mockHost("localhost32", "127.0.0.32", "922337203685477581", "DC2"), + mockHost("localhost33", "127.0.0.33", "1844674407370955162", "DC2"), + mockHost("localhost34", "127.0.0.34", "2767011611056432743", "DC2"), + mockHost("localhost35", "127.0.0.35", "3689348814741910324", "DC2"), + mockHost("localhost36", "127.0.0.36", "4611686018427387905", "DC2"), + mockHost("localhost37", "127.0.0.37", "5534023222112865485", "DC2"), + mockHost("localhost38", "127.0.0.38", "6456360425798343066", "DC2"), + mockHost("localhost39", "127.0.0.39", "7378697629483820647", "DC2"), + mockHost("localhost40", "127.0.0.40", "8301034833169298228", "DC2") ); when(metadata.getAllHosts()).thenReturn(allHosts); @@ -208,7 +208,7 @@ public String reverseResolve(String s) .compareTo(BigInteger.ONE) > 0)); } - private static Host mockHost(String node, String ip, String token, String dc) + public static Host mockHost(String node, String ip, String token, String dc) { Host host = mock(Host.class, RETURNS_DEEP_STUBS); when(host.getTokens()).thenAnswer(invocation -> Set.of(new MockToken(token))); @@ -282,12 +282,12 @@ private static TokenRange createMockTokenRange(Token start, Token end) } } - protected DnsResolver mockDnsResolver() + public static DnsResolver mockDnsResolver() { - Map dnsMap = Map.of("local1", "127.0.0.1", - "local2", "127.0.0.2", - "local13", "127.0.0.3" + Map dnsMap = Map.of("localhost", "127.0.0.1", + "localhost2", "127.0.0.2", + "localhost3", "127.0.0.3" ); DnsResolver dnsResolver = mock(DnsResolver.class); try @@ -308,21 +308,21 @@ private InstancesMetadata mockInstancesMetadata() { InstancesMetadata instancesMetadata = mock(InstancesMetadata.class); - InstanceMetadata instance1 = getMockInstanceMetaData(101000101, "local1", getMetadata()); - InstanceMetadata instance2 = getMockInstanceMetaData(101000201, "local2", getMetadata()); - InstanceMetadata instance3 = getMockInstanceMetaData(101000301, "local3", getMetadata()); + InstanceMetadata instance1 = getMockInstanceMetaData(101000101, "localhost", getMetadata()); + InstanceMetadata instance2 = getMockInstanceMetaData(101000201, "localhost2", getMetadata()); + InstanceMetadata instance3 = getMockInstanceMetaData(101000301, "localhost3", getMetadata()); when(instancesMetadata.instances()).thenReturn(List.of(instance1, instance2, instance3)); return instancesMetadata; } - private Metadata getMetadata() + public static Metadata getMetadata() { Metadata metadata = mock(Metadata.class); when(metadata.getPartitioner()).thenReturn(Partitioners.MURMUR3.getClass().getSimpleName().toLowerCase()); Set allHosts = Set.of( - mockHost("local1", "127.0.0.1", "-9223372036854775808", "DC1"), - mockHost("local2", "127.0.0.2", "-8301034833169298228", "DC1"), - mockHost("local3", "127.0.0.3", "-7378697629483820647", "DC1") + mockHost("localhost", "127.0.0.1", "-9223372036854775808", "DC1"), + mockHost("localhost2", "127.0.0.2", "-8301034833169298228", "DC1"), + mockHost("localhost3", "127.0.0.3", "-7378697629483820647", "DC1") ); when(metadata.getAllHosts()).thenReturn(allHosts); return metadata;