/*
* Copyright (C) 2012-2015 DataStax Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.datastax.driver.core.policies;
import com.datastax.driver.core.AtomicMonotonicTimestampGenerator;
import com.datastax.driver.core.TimestampGenerator;
/**
* Policies configured for a {@link com.datastax.driver.core.Cluster} instance.
*/
public class Policies {
/**
* Returns a builder to create a new {@code Policies} object.
*
* @return the builder.
*/
public static Builder builder() {
return new Builder();
}
private static final ReconnectionPolicy DEFAULT_RECONNECTION_POLICY = new ExponentialReconnectionPolicy(1000, 10 * 60 * 1000);
private static final RetryPolicy DEFAULT_RETRY_POLICY = DefaultRetryPolicy.INSTANCE;
private static final AddressTranslator DEFAULT_ADDRESS_TRANSLATOR = new IdentityTranslator();
private static final SpeculativeExecutionPolicy DEFAULT_SPECULATIVE_EXECUTION_POLICY = NoSpeculativeExecutionPolicy.INSTANCE;
private final LoadBalancingPolicy loadBalancingPolicy;
private final ReconnectionPolicy reconnectionPolicy;
private final RetryPolicy retryPolicy;
private final AddressTranslator addressTranslator;
private final TimestampGenerator timestampGenerator;
private final SpeculativeExecutionPolicy speculativeExecutionPolicy;
private Policies(LoadBalancingPolicy loadBalancingPolicy,
ReconnectionPolicy reconnectionPolicy,
RetryPolicy retryPolicy,
AddressTranslator addressTranslator,
TimestampGenerator timestampGenerator,
SpeculativeExecutionPolicy speculativeExecutionPolicy) {
this.loadBalancingPolicy = loadBalancingPolicy;
this.reconnectionPolicy = reconnectionPolicy;
this.retryPolicy = retryPolicy;
this.addressTranslator = addressTranslator;
this.timestampGenerator = timestampGenerator;
this.speculativeExecutionPolicy = speculativeExecutionPolicy;
}
/**
* The default load balancing policy.
* <p/>
* The default load balancing policy is {@link DCAwareRoundRobinPolicy} with token
* awareness (so {@code new TokenAwarePolicy(new DCAwareRoundRobinPolicy())}).
* <p/>
* Note that this policy shuffles the replicas when token awareness is used, see
* {@link TokenAwarePolicy#TokenAwarePolicy(LoadBalancingPolicy, boolean)} for an
* explanation of the tradeoffs.
*
* @return the default load balancing policy.
*/
public static LoadBalancingPolicy defaultLoadBalancingPolicy() {
// Note: balancing policies are stateful, so we can't store that in a static or that would screw thing
// up if multiple Cluster instance are started in the same JVM.
return new TokenAwarePolicy(DCAwareRoundRobinPolicy.builder().build());
}
/**
* The default reconnection policy.
* <p/>
* The default reconnection policy is an {@link ExponentialReconnectionPolicy}
* where the base delay is 1 second and the max delay is 10 minutes;
*
* @return the default reconnection policy.
*/
public static ReconnectionPolicy defaultReconnectionPolicy() {
return DEFAULT_RECONNECTION_POLICY;
}
/**
* The default retry policy.
* <p/>
* The default retry policy is {@link DefaultRetryPolicy}.
*
* @return the default retry policy.
*/
public static RetryPolicy defaultRetryPolicy() {
return DEFAULT_RETRY_POLICY;
}
/**
* The default address translator.
* <p/>
* The default address translator is {@link IdentityTranslator}.
*
* @return the default address translator.
*/
public static AddressTranslator defaultAddressTranslator() {
return DEFAULT_ADDRESS_TRANSLATOR;
}
/**
* The default timestamp generator.
* <p/>
* This is an instance of {@link AtomicMonotonicTimestampGenerator}.
*
* @return the default timestamp generator.
*/
public static TimestampGenerator defaultTimestampGenerator() {
return new AtomicMonotonicTimestampGenerator();
}
/**
* The default speculative retry policy.
* <p/>
* The default speculative retry policy is a {@link NoSpeculativeExecutionPolicy}.
*
* @return the default speculative retry policy.
*/
public static SpeculativeExecutionPolicy defaultSpeculativeExecutionPolicy() {
return DEFAULT_SPECULATIVE_EXECUTION_POLICY;
}
/**
* The load balancing policy in use.
* <p/>
* The load balancing policy defines how Cassandra hosts are picked for queries.
*
* @return the load balancing policy in use.
*/
public LoadBalancingPolicy getLoadBalancingPolicy() {
return loadBalancingPolicy;
}
/**
* The reconnection policy in use.
* <p/>
* The reconnection policy defines how often the driver tries to reconnect to a dead node.
*
* @return the reconnection policy in use.
*/
public ReconnectionPolicy getReconnectionPolicy() {
return reconnectionPolicy;
}
/**
* The retry policy in use.
* <p/>
* The retry policy defines in which conditions a query should be
* automatically retries by the driver.
*
* @return the retry policy in use.
*/
public RetryPolicy getRetryPolicy() {
return retryPolicy;
}
/**
* The address translator in use.
*
* @return the address translator in use.
*/
public AddressTranslator getAddressTranslator() {
return addressTranslator;
}
/**
* The timestamp generator to use.
*
* @return the timestamp generator to use.
*/
public TimestampGenerator getTimestampGenerator() {
return timestampGenerator;
}
/**
* The speculative execution policy in use.
*
* @return the speculative execution policy in use.
*/
public SpeculativeExecutionPolicy getSpeculativeExecutionPolicy() {
return speculativeExecutionPolicy;
}
/**
* A builder to create a new {@code Policies} object.
*/
public static class Builder {
private LoadBalancingPolicy loadBalancingPolicy;
private ReconnectionPolicy reconnectionPolicy;
private RetryPolicy retryPolicy;
private AddressTranslator addressTranslator;
private TimestampGenerator timestampGenerator;
private SpeculativeExecutionPolicy speculativeExecutionPolicy;
/**
* Sets the load balancing policy.
*
* @param loadBalancingPolicy see {@link #getLoadBalancingPolicy()}.
* @return this builder.
*/
public Builder withLoadBalancingPolicy(LoadBalancingPolicy loadBalancingPolicy) {
this.loadBalancingPolicy = loadBalancingPolicy;
return this;
}
/**
* Sets the reconnection policy.
*
* @param reconnectionPolicy see {@link #getReconnectionPolicy()}.
* @return this builder.
*/
public Builder withReconnectionPolicy(ReconnectionPolicy reconnectionPolicy) {
this.reconnectionPolicy = reconnectionPolicy;
return this;
}
/**
* Sets the retry policy.
*
* @param retryPolicy see {@link #getRetryPolicy()}.
* @return this builder.
*/
public Builder withRetryPolicy(RetryPolicy retryPolicy) {
this.retryPolicy = retryPolicy;
return this;
}
/**
* Sets the address translator.
*
* @param addressTranslator see {@link #getAddressTranslator()}.
* @return this builder.
*/
public Builder withAddressTranslator(AddressTranslator addressTranslator) {
this.addressTranslator = addressTranslator;
return this;
}
/**
* Sets the timestamp generator.
*
* @param timestampGenerator see {@link #getTimestampGenerator()}.
* @return this builder.
*/
public Builder withTimestampGenerator(TimestampGenerator timestampGenerator) {
this.timestampGenerator = timestampGenerator;
return this;
}
/**
* Sets the speculative execution policy.
*
* @param speculativeExecutionPolicy see {@link #getSpeculativeExecutionPolicy()}.
* @return this builder.
*/
public Builder withSpeculativeExecutionPolicy(SpeculativeExecutionPolicy speculativeExecutionPolicy) {
this.speculativeExecutionPolicy = speculativeExecutionPolicy;
return this;
}
/**
* Builds the final object from this builder.
* <p/>
* Any field that hasn't been set explicitly will get its default value.
*
* @return the object.
*/
public Policies build() {
return new Policies(
loadBalancingPolicy == null ? defaultLoadBalancingPolicy() : loadBalancingPolicy,
reconnectionPolicy == null ? defaultReconnectionPolicy() : reconnectionPolicy,
retryPolicy == null ? defaultRetryPolicy() : retryPolicy,
addressTranslator == null ? defaultAddressTranslator() : addressTranslator,
timestampGenerator == null ? defaultTimestampGenerator() : timestampGenerator,
speculativeExecutionPolicy == null ? defaultSpeculativeExecutionPolicy() : speculativeExecutionPolicy);
}
}
}