Refine search
public LoadBalancingPolicy getLoadBalancingPolicy() { if (this.loadBalancingPolicyName.equals(TokenAwarePolicy.class.getSimpleName())) { return new TokenAwarePolicy(new RoundRobinPolicy()); } if (this.loadBalancingPolicyName.equals(DCAwareRoundRobinPolicy.class.getSimpleName())) { Builder builder = DCAwareRoundRobinPolicy.builder(); if (StringUtils.isNotBlank(datacenterName)) { builder = builder.withLocalDc(this.datacenterName); } return new TokenAwarePolicy(builder.build()); } throw new IllegalArgumentException("Unknown cassandra load balancing policy " + this.loadBalancingPolicyName); }
/** * Builds the policy configured by this builder. * * @return the policy. */ public DCAwareRoundRobinPolicy build() { if (usedHostsPerRemoteDc == 0 && allowRemoteDCsForLocalConsistencyLevel) { logger.warn( "Setting allowRemoteDCsForLocalConsistencyLevel has no effect if usedHostsPerRemoteDc = 0. " + "This setting will be ignored"); } return new DCAwareRoundRobinPolicy( localDc, usedHostsPerRemoteDc, allowRemoteDCsForLocalConsistencyLevel, true); } }
/** * Return the HostDistance for the provided host. * * <p>This policy consider nodes in the local datacenter as {@code LOCAL}. For each remote * datacenter, it considers a configurable number of hosts as {@code REMOTE} and the rest is * {@code IGNORED}. * * <p>To configure how many hosts in each remote datacenter should be considered, see {@link * Builder#withUsedHostsPerRemoteDc(int)}. * * @param host the host of which to return the distance of. * @return the HostDistance to {@code host}. */ @Override public HostDistance distance(Host host) { String dc = dc(host); if (dc == UNSET || dc.equals(localDc)) return HostDistance.LOCAL; CopyOnWriteArrayList<Host> dcHosts = perDcLiveHosts.get(dc); if (dcHosts == null || usedHostsPerRemoteDc == 0) return HostDistance.IGNORED; // We need to clone, otherwise our subList call is not thread safe dcHosts = cloneList(dcHosts); return dcHosts.subList(0, Math.min(dcHosts.size(), usedHostsPerRemoteDc)).contains(host) ? HostDistance.REMOTE : HostDistance.IGNORED; }
DCAwareRoundRobinPolicy policy = spy(DCAwareRoundRobinPolicy.builder().build()); ScassandraCluster sCluster = ScassandraCluster.builder().withNodes(2, 2).build(); Cluster cluster = Mockito.verify(policy).init(any(Cluster.class), initHostsCaptor.capture()); assertThat(initHostsCaptor.getValue()).containsOnly(host1, host3);
@Override public void onDown(Host host) { CopyOnWriteArrayList<Host> dcHosts = perDcLiveHosts.get(dc(host)); if (dcHosts != null) dcHosts.remove(host); }
@Override public void onAdd(Host host) { onUp(host); }
@Override public void onRemove(Host host) { onDown(host); }
localLiveHosts == null ? Collections.<Host>emptyList() : cloneList(localLiveHosts); final int startIdx = index.getAndIncrement();
spy(DCAwareRoundRobinPolicy.builder().withLocalDc(datacenter(3)).build()); Cluster cluster = builder() Mockito.verify(policy).init(any(Cluster.class), initHostsCaptor.capture()); assertThat(initHostsCaptor.getValue()).containsOnly(host1, host3);
@Override public void onUp(Host host) { String dc = dc(host); // If the localDC was in "auto-discover" mode and it's the first host for which we have a DC, // use it. if (localDc == UNSET && dc != UNSET) { logger.info( "Using data-center name '{}' for DCAwareRoundRobinPolicy (if this is incorrect, please provide the correct datacenter name with DCAwareRoundRobinPolicy constructor)", dc); localDc = dc; } CopyOnWriteArrayList<Host> dcHosts = perDcLiveHosts.get(dc); if (dcHosts == null) { CopyOnWriteArrayList<Host> newMap = new CopyOnWriteArrayList<Host>(Collections.singletonList(host)); dcHosts = perDcLiveHosts.putIfAbsent(dc, newMap); // If we've successfully put our new host, we're good, otherwise we've been beaten so continue if (dcHosts == null) return; } dcHosts.addIfAbsent(host); }
@Override public void onAdd(Host host) { onUp(host); }
@Override public void onRemove(Host host) { onDown(host); } }
final List<Host> hosts = localLiveHosts == null ? Collections.<Host>emptyList() : cloneList(localLiveHosts); final int startIdx = index.getAndIncrement();
DCAwareRoundRobinPolicy.Builder builder = DCAwareRoundRobinPolicy.builder() .withLocalDc(config.getDcAwareLocalDC()); if (config.getDcAwareUsedHostsPerRemoteDc() > 0) { builder.withUsedHostsPerRemoteDc(config.getDcAwareUsedHostsPerRemoteDc()); if (config.isDcAwareAllowRemoteDCsForLocal()) { builder.allowRemoteDCsForLocalConsistencyLevel();
public void should_use_local_dc_from_contact_points_when_not_explicitly_specified() { DCAwareRoundRobinPolicy policy = spy(DCAwareRoundRobinPolicy.builder().build()); ScassandraCluster sCluster = ScassandraCluster.builder().withNodes(2, 2).build(); Cluster cluster = Mockito.verify(policy).init(any(Cluster.class), initHostsCaptor.capture()); assertThat(initHostsCaptor.getValue()).containsExactly(host1);
.withLoadBalancingPolicy(new DCAwareRoundRobinPolicy("US_EAST"))
/** * Return the HostDistance for the provided host. * <p/> * This policy consider nodes in the local datacenter as {@code LOCAL}. * For each remote datacenter, it considers a configurable number of * hosts as {@code REMOTE} and the rest is {@code IGNORED}. * <p/> * To configure how many hosts in each remote datacenter should be considered, * see {@link Builder#withUsedHostsPerRemoteDc(int)}. * * @param host the host of which to return the distance of. * @return the HostDistance to {@code host}. */ @Override public HostDistance distance(Host host) { String dc = dc(host); if (dc == UNSET || dc.equals(localDc)) return HostDistance.LOCAL; CopyOnWriteArrayList<Host> dcHosts = perDcLiveHosts.get(dc); if (dcHosts == null || usedHostsPerRemoteDc == 0) return HostDistance.IGNORED; // We need to clone, otherwise our subList call is not thread safe dcHosts = cloneList(dcHosts); return dcHosts.subList(0, Math.min(dcHosts.size(), usedHostsPerRemoteDc)).contains(host) ? HostDistance.REMOTE : HostDistance.IGNORED; }
String dc = dc(host);
@Override public void onAdd(Host host) { onUp(host); }
@Override public void onRemove(Host host) { onDown(host); }