/* * 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.facebook.presto.cassandra; import com.datastax.driver.core.ConsistencyLevel; import com.datastax.driver.core.SocketOptions; import com.google.common.base.Splitter; import com.google.common.collect.ImmutableList; import io.airlift.configuration.Config; import io.airlift.configuration.ConfigDescription; import io.airlift.configuration.DefunctConfig; import io.airlift.units.Duration; import io.airlift.units.MaxDuration; import io.airlift.units.MinDuration; import javax.validation.constraints.Min; import javax.validation.constraints.NotNull; import javax.validation.constraints.Size; import java.util.Arrays; import java.util.List; import java.util.concurrent.TimeUnit; import static java.util.concurrent.TimeUnit.MILLISECONDS; import static java.util.concurrent.TimeUnit.MINUTES; @DefunctConfig({"cassandra.thrift-port", "cassandra.partitioner", "cassandra.thrift-connection-factory-class", "cassandra.transport-factory-options", "cassandra.no-host-available-retry-count"}) public class CassandraClientConfig { private static final Splitter SPLITTER = Splitter.on(',').trimResults().omitEmptyStrings(); private Duration schemaCacheTtl = new Duration(1, TimeUnit.HOURS); private Duration schemaRefreshInterval = new Duration(2, TimeUnit.MINUTES); private int maxSchemaRefreshThreads = 1; private ConsistencyLevel consistencyLevel = ConsistencyLevel.ONE; private int fetchSize = 5_000; private List<String> contactPoints = ImmutableList.of(); private int nativeProtocolPort = 9042; private int partitionSizeForBatchSelect = 100; private int splitSize = 1_024; private boolean allowDropTable; private String username; private String password; private Duration clientReadTimeout = new Duration(SocketOptions.DEFAULT_READ_TIMEOUT_MILLIS, MILLISECONDS); private Duration clientConnectTimeout = new Duration(SocketOptions.DEFAULT_CONNECT_TIMEOUT_MILLIS, MILLISECONDS); private Integer clientSoLinger; private RetryPolicyType retryPolicy = RetryPolicyType.DEFAULT; private boolean useDCAware; private String dcAwareLocalDC; private int dcAwareUsedHostsPerRemoteDc; private boolean dcAwareAllowRemoteDCsForLocal; private boolean useTokenAware; private boolean tokenAwareShuffleReplicas; private boolean useWhiteList; private List<String> whiteListAddresses = ImmutableList.of(); private Duration noHostAvailableRetryTimeout = new Duration(1, MINUTES); private int speculativeExecutionLimit = 1; private Duration speculativeExecutionDelay = new Duration(500, MILLISECONDS); @Min(1) public int getMaxSchemaRefreshThreads() { return maxSchemaRefreshThreads; } @Config("cassandra.max-schema-refresh-threads") public CassandraClientConfig setMaxSchemaRefreshThreads(int maxSchemaRefreshThreads) { this.maxSchemaRefreshThreads = maxSchemaRefreshThreads; return this; } @NotNull public Duration getSchemaCacheTtl() { return schemaCacheTtl; } @Config("cassandra.schema-cache-ttl") public CassandraClientConfig setSchemaCacheTtl(Duration schemaCacheTtl) { this.schemaCacheTtl = schemaCacheTtl; return this; } @NotNull public Duration getSchemaRefreshInterval() { return schemaRefreshInterval; } @Config("cassandra.schema-refresh-interval") public CassandraClientConfig setSchemaRefreshInterval(Duration schemaRefreshInterval) { this.schemaRefreshInterval = schemaRefreshInterval; return this; } @NotNull @Size(min = 1) public List<String> getContactPoints() { return contactPoints; } @Config("cassandra.contact-points") public CassandraClientConfig setContactPoints(String commaSeparatedList) { this.contactPoints = SPLITTER.splitToList(commaSeparatedList); return this; } public CassandraClientConfig setContactPoints(String... contactPoints) { this.contactPoints = Arrays.asList(contactPoints); return this; } @Min(1) public int getNativeProtocolPort() { return nativeProtocolPort; } @Config(("cassandra.native-protocol-port")) public CassandraClientConfig setNativeProtocolPort(int nativeProtocolPort) { this.nativeProtocolPort = nativeProtocolPort; return this; } @NotNull public ConsistencyLevel getConsistencyLevel() { return consistencyLevel; } @Config("cassandra.consistency-level") public CassandraClientConfig setConsistencyLevel(ConsistencyLevel level) { this.consistencyLevel = level; return this; } @Min(1) public int getFetchSize() { return fetchSize; } @Config("cassandra.fetch-size") public CassandraClientConfig setFetchSize(int fetchSize) { this.fetchSize = fetchSize; return this; } @Min(1) public int getPartitionSizeForBatchSelect() { return partitionSizeForBatchSelect; } @Config("cassandra.partition-size-for-batch-select") public CassandraClientConfig setPartitionSizeForBatchSelect(int partitionSizeForBatchSelect) { this.partitionSizeForBatchSelect = partitionSizeForBatchSelect; return this; } @Min(1) public int getSplitSize() { return splitSize; } @Config("cassandra.split-size") public CassandraClientConfig setSplitSize(int splitSize) { this.splitSize = splitSize; return this; } public boolean getAllowDropTable() { return this.allowDropTable; } @Config("cassandra.allow-drop-table") @ConfigDescription("Allow hive connector to drop table") public CassandraClientConfig setAllowDropTable(boolean allowDropTable) { this.allowDropTable = allowDropTable; return this; } public String getUsername() { return username; } @Config("cassandra.username") public CassandraClientConfig setUsername(String username) { this.username = username; return this; } public String getPassword() { return password; } @Config("cassandra.password") public CassandraClientConfig setPassword(String password) { this.password = password; return this; } @MinDuration("1ms") @MaxDuration("1h") public Duration getClientReadTimeout() { return clientReadTimeout; } @Config("cassandra.client.read-timeout") public CassandraClientConfig setClientReadTimeout(Duration clientReadTimeout) { this.clientReadTimeout = clientReadTimeout; return this; } @MinDuration("1ms") @MaxDuration("1h") public Duration getClientConnectTimeout() { return clientConnectTimeout; } @Config("cassandra.client.connect-timeout") public CassandraClientConfig setClientConnectTimeout(Duration clientConnectTimeout) { this.clientConnectTimeout = clientConnectTimeout; return this; } @Min(0) public Integer getClientSoLinger() { return clientSoLinger; } @Config("cassandra.client.so-linger") public CassandraClientConfig setClientSoLinger(Integer clientSoLinger) { this.clientSoLinger = clientSoLinger; return this; } @NotNull public RetryPolicyType getRetryPolicy() { return retryPolicy; } @Config("cassandra.retry-policy") public CassandraClientConfig setRetryPolicy(RetryPolicyType retryPolicy) { this.retryPolicy = retryPolicy; return this; } public boolean isUseDCAware() { return this.useDCAware; } @Config("cassandra.load-policy.use-dc-aware") public CassandraClientConfig setUseDCAware(boolean useDCAware) { this.useDCAware = useDCAware; return this; } public String getDcAwareLocalDC() { return dcAwareLocalDC; } @Config("cassandra.load-policy.dc-aware.local-dc") public CassandraClientConfig setDcAwareLocalDC(String dcAwareLocalDC) { this.dcAwareLocalDC = dcAwareLocalDC; return this; } @Min(0) public Integer getDcAwareUsedHostsPerRemoteDc() { return dcAwareUsedHostsPerRemoteDc; } @Config("cassandra.load-policy.dc-aware.used-hosts-per-remote-dc") public CassandraClientConfig setDcAwareUsedHostsPerRemoteDc(Integer dcAwareUsedHostsPerRemoteDc) { this.dcAwareUsedHostsPerRemoteDc = dcAwareUsedHostsPerRemoteDc; return this; } public boolean isDcAwareAllowRemoteDCsForLocal() { return this.dcAwareAllowRemoteDCsForLocal; } @Config("cassandra.load-policy.dc-aware.allow-remote-dc-for-local") public CassandraClientConfig setDcAwareAllowRemoteDCsForLocal(boolean dcAwareAllowRemoteDCsForLocal) { this.dcAwareAllowRemoteDCsForLocal = dcAwareAllowRemoteDCsForLocal; return this; } public boolean isUseTokenAware() { return this.useTokenAware; } @Config("cassandra.load-policy.use-token-aware") public CassandraClientConfig setUseTokenAware(boolean useTokenAware) { this.useTokenAware = useTokenAware; return this; } public boolean isTokenAwareShuffleReplicas() { return this.tokenAwareShuffleReplicas; } @Config("cassandra.load-policy.token-aware.shuffle-replicas") public CassandraClientConfig setTokenAwareShuffleReplicas(boolean tokenAwareShuffleReplicas) { this.tokenAwareShuffleReplicas = tokenAwareShuffleReplicas; return this; } public boolean isUseWhiteList() { return this.useWhiteList; } @Config("cassandra.load-policy.use-white-list") public CassandraClientConfig setUseWhiteList(boolean useWhiteList) { this.useWhiteList = useWhiteList; return this; } public List<String> getWhiteListAddresses() { return whiteListAddresses; } @Config("cassandra.load-policy.white-list.addresses") public CassandraClientConfig setWhiteListAddresses(String commaSeparatedList) { this.whiteListAddresses = SPLITTER.splitToList(commaSeparatedList); return this; } @NotNull public Duration getNoHostAvailableRetryTimeout() { return noHostAvailableRetryTimeout; } @Config("cassandra.no-host-available-retry-timeout") public CassandraClientConfig setNoHostAvailableRetryTimeout(Duration noHostAvailableRetryTimeout) { this.noHostAvailableRetryTimeout = noHostAvailableRetryTimeout; return this; } @Min(1) public int getSpeculativeExecutionLimit() { return speculativeExecutionLimit; } @Config("cassandra.speculative-execution.limit") public CassandraClientConfig setSpeculativeExecutionLimit(int speculativeExecutionLimit) { this.speculativeExecutionLimit = speculativeExecutionLimit; return this; } @MinDuration("1ms") public Duration getSpeculativeExecutionDelay() { return speculativeExecutionDelay; } @Config("cassandra.speculative-execution.delay") public CassandraClientConfig setSpeculativeExecutionDelay(Duration speculativeExecutionDelay) { this.speculativeExecutionDelay = speculativeExecutionDelay; return this; } }