public void prepare() { LOG.info("Preparing state for {}", options.toString()); Preconditions.checkNotNull(options.getMapper, "CassandraBackingMap.Options should have getMapper"); Preconditions.checkNotNull(options.putMapper, "CassandraBackingMap.Options should have putMapper"); client = options.clientProvider.getClient(conf); session = client.connect(); if (options.maxParallelism == null || options.maxParallelism <= 0) { PoolingOptions po = session.getCluster().getConfiguration().getPoolingOptions(); Integer maxRequestsPerHost = Math.min( po.getMaxConnectionsPerHost(HostDistance.LOCAL) * po.getMaxRequestsPerConnection(HostDistance.LOCAL), po.getMaxConnectionsPerHost(HostDistance.REMOTE) * po.getMaxRequestsPerConnection(HostDistance.REMOTE) ); options.maxParallelism = maxRequestsPerHost / 2; LOG.info("Parallelism default set to {}", options.maxParallelism); } throttle = new Semaphore(options.maxParallelism, false); this.getResultMapper = new TridentAyncCQLResultSetValuesMapper(options.stateMapper.getStateFields(), throttle); this.putResultMapper = new TridentAyncCQLResultSetValuesMapper(null, throttle); }
HostConnectionPool(Host host, HostDistance hostDistance, SessionManager manager) { assert hostDistance != HostDistance.IGNORED; this.host = host; this.hostDistance = hostDistance; this.manager = manager; this.newConnectionTask = new Runnable() { @Override public void run() { addConnectionIfUnderMaximum(); scheduledForCreation.decrementAndGet(); } }; this.connections = new CopyOnWriteArrayList<Connection>(); this.open = new AtomicInteger(); this.minAllowedStreams = options().getMaxRequestsPerConnection(hostDistance) * 3 / 4; this.timeoutsExecutor = manager.getCluster().manager.connectionFactory.eventLoopGroup.next(); }
/** If we have more active connections than needed, trash some of them */ private void shrinkIfBelowCapacity() { int currentLoad = maxTotalInFlight.getAndSet(totalInFlight.get()); int maxRequestsPerConnection = options().getMaxRequestsPerConnection(hostDistance); int needed = currentLoad / maxRequestsPerConnection + 1; if (currentLoad % maxRequestsPerConnection > options().getNewConnectionThreshold(hostDistance)) needed += 1; needed = Math.max(needed, options().getCoreConnectionsPerHost(hostDistance)); int actual = open.get(); int toTrash = Math.max(0, actual - needed); logger.trace( "Current inFlight = {}, {} connections needed, {} connections available, trashing {}", currentLoad, needed, actual, toTrash); if (toTrash <= 0) return; for (Connection connection : connections) if (trashConnection(connection)) { toTrash -= 1; if (toTrash == 0) return; } }
@Test(groups = "unit") public void should_initialize_to_v2_defaults_if_v2_or_below() { PoolingOptions options = new PoolingOptions(); options.setProtocolVersion(ProtocolVersion.V1); assertThat(options.getCoreConnectionsPerHost(LOCAL)).isEqualTo(2); assertThat(options.getMaxConnectionsPerHost(LOCAL)).isEqualTo(8); assertThat(options.getCoreConnectionsPerHost(REMOTE)).isEqualTo(1); assertThat(options.getMaxConnectionsPerHost(REMOTE)).isEqualTo(2); assertThat(options.getNewConnectionThreshold(LOCAL)).isEqualTo(100); assertThat(options.getNewConnectionThreshold(REMOTE)).isEqualTo(100); assertThat(options.getMaxRequestsPerConnection(LOCAL)).isEqualTo(128); assertThat(options.getMaxRequestsPerConnection(REMOTE)).isEqualTo(128); }
@Test(groups = "unit") public void should_leave_connection_options_unset_until_protocol_version_known() { PoolingOptions options = new PoolingOptions(); assertThat(options.getCoreConnectionsPerHost(LOCAL)).isEqualTo(PoolingOptions.UNSET); assertThat(options.getCoreConnectionsPerHost(REMOTE)).isEqualTo(PoolingOptions.UNSET); assertThat(options.getMaxConnectionsPerHost(LOCAL)).isEqualTo(PoolingOptions.UNSET); assertThat(options.getMaxConnectionsPerHost(REMOTE)).isEqualTo(PoolingOptions.UNSET); assertThat(options.getNewConnectionThreshold(LOCAL)).isEqualTo(PoolingOptions.UNSET); assertThat(options.getNewConnectionThreshold(REMOTE)).isEqualTo(PoolingOptions.UNSET); assertThat(options.getMaxRequestsPerConnection(LOCAL)).isEqualTo(PoolingOptions.UNSET); assertThat(options.getMaxRequestsPerConnection(REMOTE)).isEqualTo(PoolingOptions.UNSET); }
@Test(groups = "unit") public void should_initialize_to_v3_defaults_if_v3_or_above() { PoolingOptions options = new PoolingOptions(); options.setProtocolVersion(ProtocolVersion.V3); assertThat(options.getCoreConnectionsPerHost(LOCAL)).isEqualTo(1); assertThat(options.getMaxConnectionsPerHost(LOCAL)).isEqualTo(1); assertThat(options.getCoreConnectionsPerHost(REMOTE)).isEqualTo(1); assertThat(options.getMaxConnectionsPerHost(REMOTE)).isEqualTo(1); assertThat(options.getNewConnectionThreshold(LOCAL)).isEqualTo(800); assertThat(options.getNewConnectionThreshold(REMOTE)).isEqualTo(200); assertThat(options.getMaxRequestsPerConnection(LOCAL)).isEqualTo(1024); assertThat(options.getMaxRequestsPerConnection(REMOTE)).isEqualTo(256); }
>= Math.min( connection.maxAvailableStreams(), options().getMaxRequestsPerConnection(hostDistance))) {
private void poolingMonitoring(PoolingOptions poolingOptions) { final LoadBalancingPolicy loadBalancingPolicy = cluster.getConfiguration().getPolicies().getLoadBalancingPolicy(); ScheduledExecutorService scheduled = Executors.newScheduledThreadPool(1); scheduled.scheduleAtFixedRate((Runnable) () -> { Session.State state = session.getState(); for (Host host : state.getConnectedHosts()) { HostDistance distance = loadBalancingPolicy.distance(host); int connections = state.getOpenConnections(host); int inFlightQueries = state.getInFlightQueries(host); LOGGER.info("{} connections={}, current load={}, max load={}", host, connections, inFlightQueries, connections * poolingOptions.getMaxRequestsPerConnection(distance)); } }, 5, 5, TimeUnit.SECONDS); } }
>= Math.min( leastBusy.maxAvailableStreams(), options().getMaxRequestsPerConnection(hostDistance))) { return enqueue(timeout, unit, maxQueueSize); (connectionCount - 1) * options().getMaxRequestsPerConnection(hostDistance) + options().getNewConnectionThreshold(hostDistance); if (totalInFlightCount > currentCapacity) maybeSpawnNewConnection();
Assert.assertEquals(configuration.getPoolingOptions().getMaxConnectionsPerHost(distance), 12); Assert.assertEquals(configuration.getPoolingOptions() .getMaxRequestsPerConnection(distance), 128); Assert.assertEquals(configuration.getPolicies().getLoadBalancingPolicy().getClass().getName(), TAP); Assert.assertEquals(configuration.getPolicies().getReconnectionPolicy().getClass().getName(), CRP);
Assert.assertEquals(configuration.getPoolingOptions().getMaxConnectionsPerHost(distance), 12); Assert.assertEquals(configuration.getPoolingOptions() .getMaxRequestsPerConnection(distance), 128); Assert.assertEquals(configuration.getPolicies().getLoadBalancingPolicy().getClass().getName(), LatencyAwarePolicy.class.getName());
Assert.assertEquals(configuration.getPoolingOptions().getMaxConnectionsPerHost(distance), 12); Assert.assertEquals(configuration.getPoolingOptions() .getMaxRequestsPerConnection(distance), 128);
Assert.assertEquals(configuration.getPoolingOptions().getMaxConnectionsPerHost(distance), 12); Assert.assertEquals(configuration.getPoolingOptions() .getMaxRequestsPerConnection(distance), 128);
Assert.assertEquals(configuration.getPoolingOptions().getMaxConnectionsPerHost(distance), 12); Assert.assertEquals(configuration.getPoolingOptions() .getMaxRequestsPerConnection(distance), 128);
@Test(groups = "unit") public void should_enforce_invariants_once_protocol_version_known() { // OK for v2 (default max = 8) PoolingOptions options = new PoolingOptions().setCoreConnectionsPerHost(LOCAL, 3); options.setCoreConnectionsPerHost(LOCAL, 3); options.setProtocolVersion(ProtocolVersion.V2); assertThat(options.getCoreConnectionsPerHost(LOCAL)).isEqualTo(3); assertThat(options.getMaxConnectionsPerHost(LOCAL)).isEqualTo(8); // KO for v3 (default max = 1) options = new PoolingOptions().setCoreConnectionsPerHost(LOCAL, 3); try { options.setProtocolVersion(ProtocolVersion.V3); fail("Expected an IllegalArgumentException"); } catch (IllegalArgumentException e) { /*expected*/ } // OK for v3 (up to 32K stream ids) options = new PoolingOptions().setMaxRequestsPerConnection(LOCAL, 5000); options.setProtocolVersion(ProtocolVersion.V3); assertThat(options.getMaxRequestsPerConnection(LOCAL)).isEqualTo(5000); // KO for v2 (up to 128) options = new PoolingOptions().setMaxRequestsPerConnection(LOCAL, 5000); try { options.setProtocolVersion(ProtocolVersion.V2); fail("Expected an IllegalArgumentException"); } catch (IllegalArgumentException e) { /*expected*/ } }
@Test(groups = "unit") public void should_leave_connection_options_unset_until_protocol_version_known() { PoolingOptions options = new PoolingOptions(); assertThat(options.getCoreConnectionsPerHost(LOCAL)).isEqualTo(PoolingOptions.UNSET); assertThat(options.getCoreConnectionsPerHost(REMOTE)).isEqualTo(PoolingOptions.UNSET); assertThat(options.getMaxConnectionsPerHost(LOCAL)).isEqualTo(PoolingOptions.UNSET); assertThat(options.getMaxConnectionsPerHost(REMOTE)).isEqualTo(PoolingOptions.UNSET); assertThat(options.getNewConnectionThreshold(LOCAL)).isEqualTo(PoolingOptions.UNSET); assertThat(options.getNewConnectionThreshold(REMOTE)).isEqualTo(PoolingOptions.UNSET); assertThat(options.getMaxRequestsPerConnection(LOCAL)).isEqualTo(PoolingOptions.UNSET); assertThat(options.getMaxRequestsPerConnection(REMOTE)).isEqualTo(PoolingOptions.UNSET); }
@Test(groups = "unit") public void should_initialize_to_v3_defaults_if_v3_or_above() { PoolingOptions options = new PoolingOptions(); options.setProtocolVersion(ProtocolVersion.V3); assertThat(options.getCoreConnectionsPerHost(LOCAL)).isEqualTo(1); assertThat(options.getMaxConnectionsPerHost(LOCAL)).isEqualTo(1); assertThat(options.getCoreConnectionsPerHost(REMOTE)).isEqualTo(1); assertThat(options.getMaxConnectionsPerHost(REMOTE)).isEqualTo(1); assertThat(options.getNewConnectionThreshold(LOCAL)).isEqualTo(800); assertThat(options.getNewConnectionThreshold(REMOTE)).isEqualTo(200); assertThat(options.getMaxRequestsPerConnection(LOCAL)).isEqualTo(1024); assertThat(options.getMaxRequestsPerConnection(REMOTE)).isEqualTo(256); }
@Test(groups = "unit") public void should_initialize_to_v2_defaults_if_v2_or_below() { PoolingOptions options = new PoolingOptions(); options.setProtocolVersion(ProtocolVersion.V1); assertThat(options.getCoreConnectionsPerHost(LOCAL)).isEqualTo(2); assertThat(options.getMaxConnectionsPerHost(LOCAL)).isEqualTo(8); assertThat(options.getCoreConnectionsPerHost(REMOTE)).isEqualTo(1); assertThat(options.getMaxConnectionsPerHost(REMOTE)).isEqualTo(2); assertThat(options.getNewConnectionThreshold(LOCAL)).isEqualTo(100); assertThat(options.getNewConnectionThreshold(REMOTE)).isEqualTo(100); assertThat(options.getMaxRequestsPerConnection(LOCAL)).isEqualTo(128); assertThat(options.getMaxRequestsPerConnection(REMOTE)).isEqualTo(128); }
public RxSessionImpl(Session session) { this.session = session; this.loadBalancingPolicy = session.getCluster().getConfiguration().getPolicies().getLoadBalancingPolicy(); PoolingOptions poolingOptions = session.getCluster().getConfiguration().getPoolingOptions(); maxInFlightLocal = poolingOptions.getCoreConnectionsPerHost(HostDistance.LOCAL) * poolingOptions.getMaxRequestsPerConnection(HostDistance.LOCAL); maxInFlightRemote = poolingOptions.getCoreConnectionsPerHost(HostDistance.REMOTE) * poolingOptions.getMaxRequestsPerConnection(HostDistance.REMOTE); }
public RxSessionImpl(Session session) { this.session = session; this.loadBalancingPolicy = session.getCluster().getConfiguration().getPolicies().getLoadBalancingPolicy(); PoolingOptions poolingOptions = session.getCluster().getConfiguration().getPoolingOptions(); maxInFlightLocal = poolingOptions.getCoreConnectionsPerHost(HostDistance.LOCAL) * poolingOptions.getMaxRequestsPerConnection(HostDistance.LOCAL); maxInFlightRemote = poolingOptions.getCoreConnectionsPerHost(HostDistance.REMOTE) * poolingOptions.getMaxRequestsPerConnection(HostDistance.REMOTE); }