/** * Equality is based on the data center name only. Two {@code DataCenter} objects are equal if they refer to * the same data center. */ @Override public boolean equals(Object o) { return (this == o) || (o instanceof DataCenter && _name.equals(((DataCenter) o).getName())); }
private Map.Entry<String, Object> serialize(DataCenter dataCenter) { return Maps.<String, Object>immutableEntry(dataCenter.getName(), ImmutableMap.<String, Object>builder() .put("cluster", _cluster) .put("serviceUri", dataCenter.getServiceUri().toString()) .put("adminUri", dataCenter.getAdminUri().toString()) .put("system", dataCenter.isSystem()) .put("cassandraName", dataCenter.getCassandraName()) .put("cassandraKeyspaces", sorted(dataCenter.getCassandraKeyspaces())) .build()); }
private static void verifySystemDataCenters(Collection<DataCenter> dataCenters) { Set<String> systemDataCenters = Sets.newTreeSet(); for (DataCenter dataCenter : dataCenters) { if (dataCenter.isSystem()) { systemDataCenters.add(dataCenter.getName()); } } if (systemDataCenters.size() > 1) { _log.error("Multiple data centers are configured as system data centers: {}", systemDataCenters); } }
@Provides @Singleton @AllCompactionControlSources public List<CompactionControlSource> getAllCompactionControlSources(@LocalCompactionControl CompactionControlSource localCompactionControlSource, @ServerCluster String serverCluster, Client client, DataCenters dataCenters, @CompControlApiKey String compControlApiKey, HealthCheckRegistry healthCheckRegistry, MetricRegistry metrics) { List<CompactionControlSource> compactionControlSources = Lists.newArrayList(); for (DataCenter dataCenter : dataCenters.getAll()) { MultiThreadedServiceFactory<CompactionControlSource> clientFactory = new CompactionControlClientFactory(serverCluster, new JerseyEmoClient(client), compControlApiKey); if (dataCenter.equals(dataCenters.getSelf())) { compactionControlSources.add(localCompactionControlSource); } else { ServiceEndPoint endPoint = new ServiceEndPointBuilder() .withServiceName(clientFactory.getServiceName()) .withId(dataCenter.getName()) .withPayload(new PayloadBuilder() .withUrl(dataCenter.getServiceUri().resolve(DataStoreClient.SERVICE_PATH)) .withAdminUrl(dataCenter.getAdminUri()) .toString()) .build(); compactionControlSources.add(ServicePoolBuilder.create(CompactionControlSource.class) .withHostDiscovery(new FixedHostDiscovery(endPoint)) .withServiceFactory(clientFactory) .withCachingPolicy(ServiceCachingPolicyBuilder.getMultiThreadedClientPolicy()) .withMetricRegistry(metrics) .buildProxy(new ExponentialBackoffRetry(30, 1, 10, TimeUnit.SECONDS))); } } return compactionControlSources; }
@Override public void withEndPoints(Function<Collection<EndPoint>, ?> function) { List<EndPoint> endPoints = Lists.newArrayList(); DataCenter self = _dataCenters.getSelf(); for (DataCenter dataCenter : _dataCenters.getAll()) { if (!dataCenter.equals(self)) { final URI adminUri = dataCenter.getAdminUri(); endPoints.add(new EndPoint() { @Override public String getAddress() { return _endPointAdapter.toEndPointAddress(adminUri); } @Override public boolean isValid() { return true; } }); } } function.apply(endPoints); } }
private Response redirectTo(DataCenter dataCenter, URI requestUri) { // Use the scheme+authority from the data center and the path+query from the request uri URI location = UriBuilder.fromUri(dataCenter.getServiceUri()). replacePath(requestUri.getRawPath()). replaceQuery(requestUri.getRawQuery()). build(); return Response.status(Response.Status.MOVED_PERMANENTLY). location(location). header("X-BV-Exception", UnsupportedOperationException.class.getName()). build(); }
private CachedInfo(Map<String, DataCenter> dataCenterByName) { verifySystemDataCenters(dataCenterByName.values()); _dataCenterByName = dataCenterByName; ImmutableMultimap.Builder<String, DataCenter> builder = ImmutableMultimap.builder(); for (DataCenter dataCenter : dataCenterByName.values()) { for (String keyspace : dataCenter.getCassandraKeyspaces()) { builder.put(keyspace, dataCenter); } } _dataCenterByKeyspace = builder.build(); }
/** Creates a ReplicationSource proxy to the remote data center. */ private ReplicationSource newRemoteReplicationSource(DataCenter dataCenter) { MultiThreadedServiceFactory<ReplicationSource> clientFactory = new ReplicationClientFactory(_jerseyClient) .usingApiKey(_replicationApiKey); ServiceEndPoint endPoint = new ServiceEndPointBuilder() .withServiceName(clientFactory.getServiceName()) .withId(dataCenter.getName()) .withPayload(new PayloadBuilder() .withUrl(dataCenter.getServiceUri().resolve(ReplicationClient.SERVICE_PATH)) .withAdminUrl(dataCenter.getAdminUri()) .toString()) .build(); return ServicePoolBuilder.create(ReplicationSource.class) .withHostDiscovery(new FixedHostDiscovery(endPoint)) .withServiceFactory(clientFactory) .withCachingPolicy(ServiceCachingPolicyBuilder.getMultiThreadedClientPolicy()) .withHealthCheckExecutor(_healthCheckExecutor) .withMetricRegistry(_metrics) .buildProxy(new ExponentialBackoffRetry(30, 1, 10, TimeUnit.SECONDS)); } }
private static void verifySystemDataCenters(Collection<DataCenter> dataCenters) { Set<String> systemDataCenters = Sets.newTreeSet(); for (DataCenter dataCenter : dataCenters) { if (dataCenter.isSystem()) { systemDataCenters.add(dataCenter.getName()); } } if (systemDataCenters.size() > 1) { _log.error("Multiple data centers are configured as system data centers: {}", systemDataCenters); } }
@Override public void withEndPoints(Function<Collection<EndPoint>, ?> function) { List<EndPoint> endPoints = Lists.newArrayList(); DataCenter self = _dataCenters.getSelf(); for (DataCenter dataCenter : _dataCenters.getAll()) { if (!dataCenter.equals(self)) { final URI adminUri = dataCenter.getAdminUri(); endPoints.add(new EndPoint() { @Override public String getAddress() { return _endPointAdapter.toEndPointAddress(adminUri); } @Override public boolean isValid() { return true; } }); } } function.apply(endPoints); } }
private CachedInfo(Map<String, DataCenter> dataCenterByName) { verifySystemDataCenters(dataCenterByName.values()); _dataCenterByName = dataCenterByName; ImmutableMultimap.Builder<String, DataCenter> builder = ImmutableMultimap.builder(); for (DataCenter dataCenter : dataCenterByName.values()) { for (String keyspace : dataCenter.getCassandraKeyspaces()) { builder.put(keyspace, dataCenter); } } _dataCenterByKeyspace = builder.build(); }
@Override public int compareTo(DataCenter o) { return _name.compareTo(o.getName()); }
private Map.Entry<String, Object> serialize(DataCenter dataCenter) { return Maps.<String, Object>immutableEntry(dataCenter.getName(), ImmutableMap.<String, Object>builder() .put("cluster", _cluster) .put("serviceUri", dataCenter.getServiceUri().toString()) .put("adminUri", dataCenter.getAdminUri().toString()) .put("system", dataCenter.isSystem()) .put("cassandraName", dataCenter.getCassandraName()) .put("cassandraKeyspaces", sorted(dataCenter.getCassandraKeyspaces())) .build()); }
/** Creates a ReplicationSource proxy to the remote data center. */ private ReplicationSource newRemoteReplicationSource(DataCenter dataCenter) { MultiThreadedServiceFactory<ReplicationSource> clientFactory = new ReplicationClientFactory(_jerseyClient) .usingApiKey(_replicationApiKey); ServiceEndPoint endPoint = new ServiceEndPointBuilder() .withServiceName(clientFactory.getServiceName()) .withId(dataCenter.getName()) .withPayload(new PayloadBuilder() .withUrl(dataCenter.getServiceUri().resolve(ReplicationClient.SERVICE_PATH)) .withAdminUrl(dataCenter.getAdminUri()) .toString()) .build(); return ServicePoolBuilder.create(ReplicationSource.class) .withHostDiscovery(new FixedHostDiscovery(endPoint)) .withServiceFactory(clientFactory) .withCachingPolicy(ServiceCachingPolicyBuilder.getMultiThreadedClientPolicy()) .withHealthCheckExecutor(_healthCheckExecutor) .withMetricRegistry(_metrics) .buildProxy(new ExponentialBackoffRetry(30, 1, 10, TimeUnit.SECONDS)); } }
/** * Equality is based on the data center name only. Two {@code DataCenter} objects are equal if they refer to * the same data center. */ @Override public boolean equals(Object o) { return (this == o) || (o instanceof DataCenter && _name.equals(((DataCenter) o).getName())); }
@Override public int compareTo(DataCenter o) { return _name.compareTo(o.getName()); }
public static String getReplicationFanoutChannel(DataCenter dataCenter, int partition) { return String.format("%s%s[%d]", REPLICATION_FANOUT_PREFIX, dataCenter.getName(), partition); }
public static String getReplicationFanoutChannel(DataCenter dataCenter, int partition) { return String.format("%s%s[%d]", REPLICATION_FANOUT_PREFIX, dataCenter.getName(), partition); }
private Map<String, DataCenter> deserializeAll(Map<String, Object> json) { ImmutableMap.Builder<String, DataCenter> builder = ImmutableMap.builder(); for (Map.Entry<String, Object> entry : json.entrySet()) { if (!entry.getKey().startsWith("~")) { DataCenter dataCenter = deserialize(entry); if (dataCenter != null) { builder.put(dataCenter.getName(), dataCenter); } } } return builder.build(); }
@Override public String get() { return format(JOBS_TABLE_NAME_FORMAT, dataCenters.getSelf().getName().replaceAll("\\s", "_")); } };