org.janusgraph.diskstorage.cql.CQLConfigOptions Maven / Gradle / Ivy
// Copyright 2017 JanusGraph Authors
//
// 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 org.janusgraph.diskstorage.cql;
import com.datastax.oss.driver.api.core.config.DefaultDriverOption;
import org.janusgraph.diskstorage.configuration.ConfigElement;
import org.janusgraph.diskstorage.configuration.ConfigNamespace;
import org.janusgraph.diskstorage.configuration.ConfigOption;
import org.janusgraph.diskstorage.configuration.Configuration;
import org.janusgraph.diskstorage.configuration.ExecutorServiceBuilder;
import org.janusgraph.diskstorage.cql.strategy.GroupedExecutionStrategyBuilder;
import org.janusgraph.diskstorage.util.backpressure.QueryBackPressure;
import org.janusgraph.diskstorage.util.backpressure.builder.QueryBackPressureBuilder;
import org.janusgraph.graphdb.configuration.GraphDatabaseConfiguration;
import org.janusgraph.graphdb.configuration.PreInitializeConfigOptions;
/**
* Configuration options for the CQL storage backend. These are managed under the 'cql' namespace in the configuration.
*/
@PreInitializeConfigOptions
public interface CQLConfigOptions {
ConfigNamespace CQL_NS = new ConfigNamespace(
GraphDatabaseConfiguration.STORAGE_NS,
"cql",
"CQL storage backend options");
ConfigOption KEYSPACE = new ConfigOption<>(
CQL_NS,
"keyspace",
"The name of JanusGraph's keyspace. It will be created if it does not exist.",
ConfigOption.Type.LOCAL,
"janusgraph");
ConfigOption PROTOCOL_VERSION = new ConfigOption<>(
CQL_NS,
"protocol-version",
"The protocol version used to connect to the Cassandra database. If no value is supplied then the driver will negotiate with the server.",
ConfigOption.Type.LOCAL,
0);
ConfigOption READ_CONSISTENCY = new ConfigOption<>(
CQL_NS,
"read-consistency-level",
"The consistency level of read operations against Cassandra",
ConfigOption.Type.MASKABLE,
CQLStoreManager.CONSISTENCY_QUORUM);
ConfigOption WRITE_CONSISTENCY = new ConfigOption<>(
CQL_NS,
"write-consistency-level",
"The consistency level of write operations against Cassandra",
ConfigOption.Type.MASKABLE,
CQLStoreManager.CONSISTENCY_QUORUM);
ConfigOption INIT_WAIT_TIME = new ConfigOption<>(
CQL_NS,
"init-wait-time",
"Number of milliseconds to sleep after creating each keyspace/table, only needed if table creation " +
"is asynchronous, e.g. Amazon Keyspace",
ConfigOption.Type.LOCAL, Integer.class);
ConfigOption ONLY_USE_LOCAL_CONSISTENCY_FOR_SYSTEM_OPERATIONS =
new ConfigOption<>(CQL_NS, "only-use-local-consistency-for-system-operations",
"True to prevent any system queries from using QUORUM consistency " +
"and always use LOCAL_QUORUM instead",
ConfigOption.Type.MASKABLE, false);
ConfigOption USE_EXTERNAL_LOCKING = new ConfigOption<>(
CQL_NS,
"use-external-locking",
"True to prevent JanusGraph from using its own locking mechanism. Setting this to true eliminates " +
"redundant checks when using an external locking mechanism outside of JanusGraph. Be aware that " +
"when use-external-locking is set to true, that failure to employ a locking algorithm which locks " +
"all columns that participate in a transaction upfront and unlocks them when the transaction ends, " +
"will result in a 'read uncommitted' transaction isolation level guarantee. If set to true without " +
"an appropriate external locking mechanism in place side effects such as " +
"dirty/non-repeatable/phantom reads should be expected.",
ConfigOption.Type.MASKABLE,
false);
// The number of statements in a batch
ConfigOption BATCH_STATEMENT_SIZE = new ConfigOption<>(
CQL_NS,
"batch-statement-size",
"The number of statements in each batch",
ConfigOption.Type.MASKABLE,
20);
// Whether to use un-logged batches
ConfigOption ATOMIC_BATCH_MUTATE = new ConfigOption<>(
CQL_NS,
"atomic-batch-mutate",
"True to use Cassandra atomic batch mutation, false to use non-atomic batches",
ConfigOption.Type.MASKABLE,
false);
// Replication
String SIMPLE_REPLICATION_STRATEGY = "SimpleStrategy";
String NETWORK_TOPOLOGY_REPLICATION_STRATEGY = "NetworkTopologyStrategy";
ConfigOption REPLICATION_STRATEGY = new ConfigOption<>(
CQL_NS,
"replication-strategy-class",
"The replication strategy to use for JanusGraph keyspace. Available strategies: "+
String.join(",",new String[]{SIMPLE_REPLICATION_STRATEGY, NETWORK_TOPOLOGY_REPLICATION_STRATEGY})+".",
ConfigOption.Type.FIXED,
SIMPLE_REPLICATION_STRATEGY);
ConfigOption REPLICATION_FACTOR = new ConfigOption<>(
CQL_NS,
"replication-factor",
"The number of data replicas (including the original copy) that should be kept. This options is used when "
+ConfigElement.getPath(REPLICATION_STRATEGY)+" is set to "+SIMPLE_REPLICATION_STRATEGY,
ConfigOption.Type.GLOBAL_OFFLINE,
1);
ConfigOption REPLICATION_OPTIONS = new ConfigOption<>(
CQL_NS,
"replication-strategy-options",
"Replication strategy options, e.g. factor or replicas per datacenter. This list is interpreted as a " +
"map. It must have an even number of elements in [key,val,key,val,...] form. This options is used when "
+ConfigElement.getPath(REPLICATION_STRATEGY)+" is set to "+NETWORK_TOPOLOGY_REPLICATION_STRATEGY+". " +
"`replication_factor` can be used to specify a replication factor.",
ConfigOption.Type.FIXED,
String[].class);
ConfigOption COMPACTION_STRATEGY = new ConfigOption<>(
CQL_NS,
"compaction-strategy-class",
"The compaction strategy to use for JanusGraph tables",
ConfigOption.Type.FIXED,
String.class);
ConfigOption COMPACTION_OPTIONS = new ConfigOption<>(
CQL_NS,
"compaction-strategy-options",
"Compaction strategy options. This list is interpreted as a " +
"map. It must have an even number of elements in [key,val,key,val,...] form.",
ConfigOption.Type.FIXED,
String[].class);
ConfigOption SPECULATIVE_RETRY = new ConfigOption<>(
CQL_NS,
"speculative-retry",
"The speculative retry policy. One of: NONE, ALWAYS, percentile, ms.",
ConfigOption.Type.FIXED,
String.class);
ConfigOption GC_GRACE_SECONDS = new ConfigOption<>(
CQL_NS,
"gc-grace-seconds",
"The number of seconds before tombstones (deletion markers) are eligible for garbage-collection.",
ConfigOption.Type.FIXED,
Integer.class);
// Compression
ConfigOption CF_COMPRESSION = new ConfigOption<>(
CQL_NS,
"compression",
"Whether the storage backend should use compression when storing the data",
ConfigOption.Type.FIXED,
true);
ConfigOption CF_COMPRESSION_TYPE = new ConfigOption<>(
CQL_NS,
"compression-type",
"The compression class value JanusGraph uses when creating column families. " +
"This accepts any value allowed by Cassandra's compression class option. " +
"Leave this unset to disable compression on JanusGraph-created CFs.",
ConfigOption.Type.MASKABLE,
"LZ4Compressor");
ConfigOption CF_COMPRESSION_BLOCK_SIZE = new ConfigOption<>(
CQL_NS,
"compression-block-size",
"The size of the compression blocks in kilobytes",
ConfigOption.Type.FIXED,
64);
ConfigOption LOCAL_MAX_CONNECTIONS_PER_HOST = new ConfigOption<>(
CQL_NS,
"local-max-connections-per-host",
"The maximum number of connections that can be created per host for local datacenter",
ConfigOption.Type.MASKABLE,
1);
ConfigOption REMOTE_MAX_CONNECTIONS_PER_HOST = new ConfigOption<>(
CQL_NS,
"remote-max-connections-per-host",
"The maximum number of connections that can be created per host for remote datacenter",
ConfigOption.Type.MASKABLE,
1);
ConfigOption MAX_REQUESTS_PER_CONNECTION = new ConfigOption<>(
CQL_NS,
"max-requests-per-connection",
"The maximum number of requests that can be executed concurrently on a connection.",
ConfigOption.Type.MASKABLE,
1024);
ConfigOption BACK_PRESSURE_LIMIT = new ConfigOption<>(
CQL_NS,
"back-pressure-limit",
"The maximum number of concurrent requests which are allowed to be processed by CQL driver. " +
"If no value is provided or the value is set to `0` then the value will be calculated based on CQL driver " +
"session provided parameters by using formula ["+DefaultDriverOption.CONNECTION_MAX_REQUESTS.getPath()+" * "
+DefaultDriverOption.CONNECTION_POOL_LOCAL_SIZE.getPath()+" * available_nodes_amount]. " +
"It's not recommended to use any value which is above this limit because it may result in CQL driver overload " +
"but it's suggested to have a lower value to keep the driver healthy under pressure. In situations when remote " +
"nodes connections are in use then the bigger value might be relevant as well to improve parallelism.",
ConfigOption.Type.MASKABLE,
Integer.class);
ConfigOption BACK_PRESSURE_CLASS = new ConfigOption<>(
CQL_NS,
"back-pressure-class",
"The implementation of `QueryBackPressure` to use. " +
"The full name of the class which extends `"+ QueryBackPressure.class.getSimpleName()+"` which has either " +
"a public constructor with `"+ Configuration.class.getSimpleName()+" janusGraphConfiguration` and `"+
Integer.class.getSimpleName()+" backPressureLimit` arguments (preferred constructor) or a public constructor with `"+
Configuration.class.getSimpleName()+" janusGraphConfiguration` argument (second preferred constructor) or "+
"a public parameterless constructor. Other accepted options are:
`"+
QueryBackPressureBuilder.SEMAPHORE_QUERY_BACK_PRESSURE_CLASS+"` - fair semaphore based back pressure implementation of `"
+BACK_PRESSURE_LIMIT.getName()+"` limit size (preferred implementation);
`"
+QueryBackPressureBuilder.SEMAPHORE_RELEASE_PROTECTED_QUERY_BACK_PRESSURE_CLASS+"` - fair semaphore based back pressure " +
"implementation of `"+BACK_PRESSURE_LIMIT.getName()+"` limit size with protected releasing logic (meant to be used for testing);
`"
+QueryBackPressureBuilder.PASS_ALL_QUERY_BACK_PRESSURE_CLASS+"` - turned off back pressure (it is recommended to tune " +
"CQL driver for the ongoing workload when this implementation is used);",
ConfigOption.Type.MASKABLE,
String.class,
QueryBackPressureBuilder.SEMAPHORE_QUERY_BACK_PRESSURE_CLASS);
ConfigOption HEARTBEAT_INTERVAL = new ConfigOption<>(
CQL_NS,
"heartbeat-interval",
"The connection heartbeat interval in milliseconds.",
ConfigOption.Type.MASKABLE,
Long.class);
ConfigOption HEARTBEAT_TIMEOUT = new ConfigOption<>(
CQL_NS,
"heartbeat-timeout",
"How long the driver waits for the response (in milliseconds) to a heartbeat.",
ConfigOption.Type.MASKABLE,
Long.class);
ConfigOption TTL_ENABLED = new ConfigOption<>(
CQL_NS,
"ttl-enabled",
"Whether TTL should be enabled or not. Must be turned off if the storage does not support TTL. " +
"Amazon Keyspace, for example, does not support TTL by default unless otherwise enabled.",
ConfigOption.Type.LOCAL,
Boolean.class,
true);
ConfigOption PARTITIONER_NAME = new ConfigOption<>(
CQL_NS,
"partitioner-name",
"The name of Cassandra cluster's partitioner. It will be retrieved by client if not provided. " +
"If provided, it must match the cluster's partitioner name. It can be the full class name such as " +
"`org.apache.cassandra.dht.ByteOrderedPartitioner` or the simple name such as `ByteOrderedPartitioner`",
ConfigOption.Type.MASKABLE,
String.class);
ConfigOption METADATA_SCHEMA_ENABLED = new ConfigOption<>(
CQL_NS,
"metadata-schema-enabled",
"Whether schema metadata is enabled.",
ConfigOption.Type.MASKABLE,
Boolean.class);
ConfigOption METADATA_TOKEN_MAP_ENABLED = new ConfigOption<>(
CQL_NS,
"metadata-token-map-enabled",
"Whether token metadata is enabled. If disabled, partitioner-name must be provided.",
ConfigOption.Type.MASKABLE,
Boolean.class);
// SSL
ConfigNamespace SSL_NS = new ConfigNamespace(
CQL_NS,
"ssl",
"Configuration options for SSL");
ConfigNamespace SSL_KEYSTORE_NS = new ConfigNamespace(
SSL_NS,
"keystore",
"Configuration options for SSL Keystore.");
ConfigNamespace SSL_TRUSTSTORE_NS = new ConfigNamespace(
SSL_NS,
"truststore",
"Configuration options for SSL Truststore.");
ConfigOption SSL_CLIENT_AUTHENTICATION_ENABLED = new ConfigOption<>(
SSL_NS,
"client-authentication-enabled",
"Enables use of a client key to authenticate with Cassandra",
ConfigOption.Type.LOCAL,
false);
ConfigOption SSL_ENABLED = new ConfigOption<>(
SSL_NS,
"enabled",
"Controls use of the SSL connection to Cassandra",
ConfigOption.Type.LOCAL,
false);
ConfigOption SSL_HOSTNAME_VALIDATION = new ConfigOption<>(
SSL_NS,
"hostname_validation",
"Enable / disable SSL hostname validation.",
ConfigOption.Type.LOCAL,
false);
ConfigOption SSL_KEYSTORE_LOCATION = new ConfigOption<>(
SSL_KEYSTORE_NS,
"location",
"Marks the location of the SSL Keystore.",
ConfigOption.Type.LOCAL,
"");
ConfigOption SSL_KEYSTORE_KEY_PASSWORD = new ConfigOption<>(
SSL_KEYSTORE_NS,
"keypassword",
"The password to access the key in SSL Keystore.",
ConfigOption.Type.LOCAL,
"");
ConfigOption SSL_KEYSTORE_STORE_PASSWORD = new ConfigOption<>(
SSL_KEYSTORE_NS,
"storepassword",
"The password to access the SSL Keystore.",
ConfigOption.Type.LOCAL,
"");
ConfigOption SSL_TRUSTSTORE_LOCATION = new ConfigOption<>(
SSL_TRUSTSTORE_NS,
"location",
"Marks the location of the SSL Truststore.",
ConfigOption.Type.LOCAL,
"");
ConfigOption SSL_TRUSTSTORE_PASSWORD = new ConfigOption<>(
SSL_TRUSTSTORE_NS,
"password",
"The password to access SSL Truststore.",
ConfigOption.Type.LOCAL,
"");
// Other options
ConfigOption SESSION_NAME = new ConfigOption<>(
CQL_NS,
"session-name",
"Default name for the Cassandra session",
ConfigOption.Type.MASKABLE,
"JanusGraph Session");
ConfigOption LOCAL_DATACENTER = new ConfigOption<>(
CQL_NS,
"local-datacenter",
"The name of the local or closest Cassandra datacenter. " +
"This value will be passed into CqlSessionBuilder.withLocalDatacenter.",
/*
* It's between either LOCAL or MASKABLE. MASKABLE could be useful for cases where all the JanusGraph instances are closest to
* the same Cassandra DC.
*/
ConfigOption.Type.MASKABLE,
String.class,
"datacenter1");
// Netty
ConfigNamespace NETTY = new ConfigNamespace(
CQL_NS,
"netty",
"Configuration options related to the Netty event loop groups used internally by the CQL driver.");
ConfigOption NETTY_IO_SIZE = new ConfigOption<>(
NETTY,
"io-size",
"The number of threads for the event loop group used for I/O operations " +
"(reading and writing to Cassandra nodes). " +
"If this is not set, the driver will use `Runtime.getRuntime().availableProcessors() * 2`.",
ConfigOption.Type.LOCAL,
Integer.class);
ConfigOption NETTY_ADMIN_SIZE = new ConfigOption<>(
NETTY,
"admin-size",
"The number of threads for the event loop group used for admin tasks not related to request I/O " +
"(handle cluster events, refresh metadata, schedule reconnections, etc.). " +
"If this is not set, the driver will use 2.",
ConfigOption.Type.LOCAL,
Integer.class);
ConfigOption NETTY_TIMER_TICK_DURATION = new ConfigOption<>(
NETTY,
"timer-tick-duration",
"The timer tick duration in milliseconds. This is how frequent the timer should wake up to check for timed-out tasks " +
"or speculative executions. See DataStax Java Driver option `" +
DefaultDriverOption.NETTY_TIMER_TICK_DURATION.getPath() + "` for more information.",
ConfigOption.Type.LOCAL,
Long.class);
ConfigOption NETTY_TIMER_TICKS_PER_WHEEL = new ConfigOption<>(
NETTY,
"timer-ticks-per-wheel",
"Number of ticks in a Timer wheel. See DataStax Java Driver option `" +
DefaultDriverOption.NETTY_TIMER_TICKS_PER_WHEEL.getPath() + "` for more information.",
ConfigOption.Type.LOCAL,
Integer.class);
// Metrics
ConfigNamespace METRICS = new ConfigNamespace(
CQL_NS,
"metrics",
"Configuration options for CQL metrics");
ConfigOption METRICS_SESSION_ENABLED = new ConfigOption<>(
METRICS,
"session-enabled",
"Comma separated list of enabled session metrics. Used only when basic metrics are enabled. " +
"Check DataStax Cassandra Driver 4 documentation for available metrics " +
"(example: bytes-sent, bytes-received, connected-nodes).",
ConfigOption.Type.LOCAL,
String[].class);
ConfigOption METRICS_SESSION_REQUESTS_HIGHEST_LATENCY = new ConfigOption<>(
METRICS,
"cql-requests-highest-latency",
"The largest latency that we expect to record for requests in milliseconds. " +
"Used if 'cql-requests' session metric is enabled. "+
"See DataStax driver configuration option `"
+DefaultDriverOption.METRICS_SESSION_CQL_REQUESTS_HIGHEST.getPath()+"`",
ConfigOption.Type.LOCAL,
Long.class);
ConfigOption METRICS_SESSION_REQUESTS_SIGNIFICANT_DIGITS = new ConfigOption<>(
METRICS,
"cql-requests-significant-digits",
"The number of significant decimal digits to which internal structures will maintain value resolution " +
"and separation for requests. This must be between 0 and 5. " +
"Used if 'cql-requests' session metric is enabled. "+
"See DataStax driver configuration option `"
+DefaultDriverOption.METRICS_SESSION_CQL_REQUESTS_DIGITS.getPath()+"`",
ConfigOption.Type.LOCAL,
Integer.class);
ConfigOption METRICS_SESSION_REQUESTS_REFRESH_INTERVAL = new ConfigOption<>(
METRICS,
"cql-requests-refresh-interval",
"The interval at which percentile data is refreshed in milliseconds for requests. " +
"Used if 'cql-requests' session metric is enabled. "+
"See DataStax driver configuration option `"
+DefaultDriverOption.METRICS_SESSION_CQL_REQUESTS_INTERVAL.getPath()+"`",
ConfigOption.Type.LOCAL,
Long.class);
ConfigOption METRICS_SESSION_THROTTLING_HIGHEST_LATENCY = new ConfigOption<>(
METRICS,
"throttling-delay-highest-latency",
"The largest latency that we expect to record for throttling in milliseconds. " +
"Used if 'throttling.delay' session metric is enabled. "+
"See DataStax driver configuration option `"
+DefaultDriverOption.METRICS_SESSION_THROTTLING_HIGHEST.getPath()+"`",
ConfigOption.Type.LOCAL,
Long.class);
ConfigOption METRICS_SESSION_THROTTLING_SIGNIFICANT_DIGITS = new ConfigOption<>(
METRICS,
"throttling-delay-significant-digits",
"The number of significant decimal digits to which internal structures will maintain value resolution " +
"and separation for throttling. This must be between 0 and 5. " +
"Used if 'throttling.delay' session metric is enabled. "+
"See DataStax driver configuration option `"
+DefaultDriverOption.METRICS_SESSION_THROTTLING_DIGITS.getPath()+"`",
ConfigOption.Type.LOCAL,
Integer.class);
ConfigOption METRICS_SESSION_THROTTLING_REFRESH_INTERVAL = new ConfigOption<>(
METRICS,
"throttling-delay-refresh-interval",
"The interval at which percentile data is refreshed in milliseconds for throttling. " +
"Used if 'throttling.delay' session metric is enabled. "+
"See DataStax driver configuration option `"
+DefaultDriverOption.METRICS_SESSION_THROTTLING_INTERVAL.getPath()+"`",
ConfigOption.Type.LOCAL,
Long.class);
ConfigOption METRICS_NODE_ENABLED = new ConfigOption<>(
METRICS,
"node-enabled",
"Comma separated list of enabled node metrics. Used only when basic metrics are enabled. " +
"Check DataStax Cassandra Driver 4 documentation for available metrics " +
"(example: pool.open-connections, pool.available-streams, bytes-sent).",
ConfigOption.Type.LOCAL,
String[].class);
ConfigOption METRICS_NODE_MESSAGES_HIGHEST_LATENCY = new ConfigOption<>(
METRICS,
"cql-messages-highest-latency",
"The largest latency that we expect to record for requests in milliseconds. " +
"Used if 'cql-messages' node metric is enabled. "+
"See DataStax driver configuration option `"
+DefaultDriverOption.METRICS_NODE_CQL_MESSAGES_HIGHEST.getPath()+"`",
ConfigOption.Type.LOCAL,
Long.class);
ConfigOption METRICS_NODE_MESSAGES_SIGNIFICANT_DIGITS = new ConfigOption<>(
METRICS,
"cql-messages-significant-digits",
"The number of significant decimal digits to which internal structures will maintain value resolution " +
"and separation for requests. This must be between 0 and 5. " +
"Used if 'cql-messages' node metric is enabled. "+
"See DataStax driver configuration option `"
+DefaultDriverOption.METRICS_NODE_CQL_MESSAGES_DIGITS.getPath()+"`",
ConfigOption.Type.LOCAL,
Integer.class);
ConfigOption METRICS_NODE_MESSAGES_REFRESH_INTERVAL = new ConfigOption<>(
METRICS,
"cql-messages-delay-refresh-interval",
"The interval at which percentile data is refreshed in milliseconds for requests. " +
"Used if 'cql-messages' node metric is enabled. "+
"See DataStax driver configuration option `"
+DefaultDriverOption.METRICS_NODE_CQL_MESSAGES_INTERVAL.getPath()+"`",
ConfigOption.Type.LOCAL,
Long.class);
ConfigOption METRICS_NODE_EXPIRE_AFTER = new ConfigOption<>(
METRICS,
"node-expire-after",
"The time after which the node level metrics will be evicted in milliseconds.",
ConfigOption.Type.LOCAL,
Long.class);
// Request tracker (request logging)
ConfigNamespace REQUEST_TRACKER = new ConfigNamespace(
CQL_NS,
"request-tracker",
"Configuration options for CQL request tracker and builtin request logger");
ConfigOption REQUEST_TRACKER_CLASS = new ConfigOption<>(
REQUEST_TRACKER,
"class",
"It is either a predefined DataStax driver value for a builtin request tracker " +
"or a full qualified class name which implements " +
"`com.datastax.oss.driver.internal.core.tracker.RequestTracker` interface. " +
"If no any value provided, the default DataStax request tracker is used, which is `NoopRequestTracker` " +
"which doesn't do anything. If `RequestLogger` value is provided, the DataStax [RequestLogger]" +
"(https://docs.datastax.com/en/developer/java-driver/4.9/manual/core/request_tracker/#request-logger) " +
"is used.",
ConfigOption.Type.LOCAL,
String.class);
ConfigOption REQUEST_LOGGER_SUCCESS_ENABLED = new ConfigOption<>(
REQUEST_TRACKER,
"logs-success-enabled",
"Whether to log successful requests. " +
"Can be used when `" + REQUEST_TRACKER_CLASS + "` is set to `RequestLogger`.",
ConfigOption.Type.LOCAL,
Boolean.class);
ConfigOption REQUEST_LOGGER_SLOW_THRESHOLD = new ConfigOption<>(
REQUEST_TRACKER,
"logs-slow-threshold",
"The threshold to classify a successful request as `slow`. In milliseconds. " +
"Can be used when `" + REQUEST_TRACKER_CLASS + "` is set to `RequestLogger`.",
ConfigOption.Type.LOCAL,
Long.class);
ConfigOption REQUEST_LOGGER_SLOW_ENABLED = new ConfigOption<>(
REQUEST_TRACKER,
"logs-slow-enabled",
"Whether to log `slow` requests." +
"Can be used when `" + REQUEST_TRACKER_CLASS + "` is set to `RequestLogger`.",
ConfigOption.Type.LOCAL,
Boolean.class);
ConfigOption REQUEST_LOGGER_ERROR_ENABLED = new ConfigOption<>(
REQUEST_TRACKER,
"logs-error-enabled",
"Whether to log failed requests." +
"Can be used when `" + REQUEST_TRACKER_CLASS + "` is set to `RequestLogger`.",
ConfigOption.Type.LOCAL,
Boolean.class);
ConfigOption REQUEST_LOGGER_MAX_QUERY_LENGTH = new ConfigOption<>(
REQUEST_TRACKER,
"logs-max-query-length",
"The maximum length of the query string in the log message. " +
"Can be used when `" + REQUEST_TRACKER_CLASS + "` is set to `RequestLogger`.",
ConfigOption.Type.LOCAL,
Integer.class);
ConfigOption REQUEST_LOGGER_SHOW_VALUES = new ConfigOption<>(
REQUEST_TRACKER,
"logs-show-values",
"Whether to log bound values in addition to the query string. " +
"Can be used when `" + REQUEST_TRACKER_CLASS + "` is set to `RequestLogger`.",
ConfigOption.Type.LOCAL,
Boolean.class);
ConfigOption REQUEST_LOGGER_MAX_VALUE_LENGTH = new ConfigOption<>(
REQUEST_TRACKER,
"logs-max-value-length",
"The maximum length for bound values in the log message. " +
"Can be used when `" + REQUEST_TRACKER_CLASS + "` is set to `RequestLogger`.",
ConfigOption.Type.LOCAL,
Integer.class);
ConfigOption REQUEST_LOGGER_MAX_VALUES = new ConfigOption<>(
REQUEST_TRACKER,
"logs-max-values",
"The maximum number of bound values to log. " +
"Can be used when `" + REQUEST_TRACKER_CLASS + "` is set to `RequestLogger`.",
ConfigOption.Type.LOCAL,
Integer.class);
ConfigOption REQUEST_LOGGER_SHOW_STACK_TRACES = new ConfigOption<>(
REQUEST_TRACKER,
"logs-show-stack-traces",
"Whether to log stack traces for failed queries. " +
"Can be used when `" + REQUEST_TRACKER_CLASS + "` is set to `RequestLogger`.",
ConfigOption.Type.LOCAL,
Boolean.class);
ConfigNamespace EXECUTOR_SERVICE = new ConfigNamespace(
CQL_NS,
"executor-service",
"Configuration options for CQL executor service which is used to process deserialization of CQL queries.");
ConfigOption EXECUTOR_SERVICE_CORE_POOL_SIZE = new ConfigOption<>(
EXECUTOR_SERVICE,
GraphDatabaseConfiguration.PARALLEL_BACKEND_EXECUTOR_SERVICE_CORE_POOL_SIZE.getName(),
GraphDatabaseConfiguration.PARALLEL_BACKEND_EXECUTOR_SERVICE_CORE_POOL_SIZE.getDescription(),
ConfigOption.Type.LOCAL,
Integer.class);
ConfigOption EXECUTOR_SERVICE_MAX_POOL_SIZE = new ConfigOption<>(
EXECUTOR_SERVICE,
GraphDatabaseConfiguration.PARALLEL_BACKEND_EXECUTOR_SERVICE_MAX_POOL_SIZE.getName(),
GraphDatabaseConfiguration.PARALLEL_BACKEND_EXECUTOR_SERVICE_MAX_POOL_SIZE.getDescription(),
ConfigOption.Type.LOCAL,
Integer.class,
Integer.MAX_VALUE);
ConfigOption EXECUTOR_SERVICE_KEEP_ALIVE_TIME = new ConfigOption<>(
EXECUTOR_SERVICE,
GraphDatabaseConfiguration.PARALLEL_BACKEND_EXECUTOR_SERVICE_KEEP_ALIVE_TIME.getName(),
GraphDatabaseConfiguration.PARALLEL_BACKEND_EXECUTOR_SERVICE_KEEP_ALIVE_TIME.getDescription(),
ConfigOption.Type.LOCAL,
Long.class,
60000L);
ConfigOption EXECUTOR_SERVICE_CLASS = new ConfigOption<>(
EXECUTOR_SERVICE,
GraphDatabaseConfiguration.PARALLEL_BACKEND_EXECUTOR_SERVICE_CLASS.getName(),
GraphDatabaseConfiguration.PARALLEL_BACKEND_EXECUTOR_SERVICE_CLASS.getDescription(),
ConfigOption.Type.LOCAL,
String.class,
ExecutorServiceBuilder.FIXED_THREAD_POOL_CLASS);
ConfigOption EXECUTOR_SERVICE_MAX_SHUTDOWN_WAIT_TIME = new ConfigOption<>(
EXECUTOR_SERVICE,
GraphDatabaseConfiguration.PARALLEL_BACKEND_EXECUTOR_SERVICE_MAX_SHUTDOWN_WAIT_TIME.getName(),
GraphDatabaseConfiguration.PARALLEL_BACKEND_EXECUTOR_SERVICE_MAX_SHUTDOWN_WAIT_TIME.getDescription(),
ConfigOption.Type.LOCAL,
Long.class,
60000L);
ConfigOption SESSION_LEAK_THRESHOLD = new ConfigOption<>(
CQL_NS,
"session-leak-threshold",
"The maximum number of live sessions that are allowed to coexist in a given VM until the warning " +
"starts to log for every new session. " +
"If the value is less than or equal to 0, the feature is disabled: no warning will be issued. "+
"See DataStax Java Driver option `" +
DefaultDriverOption.SESSION_LEAK_THRESHOLD.getPath() + "` for more information.",
ConfigOption.Type.MASKABLE, Integer.class);
ConfigOption REQUEST_TIMEOUT = new ConfigOption<>(
CQL_NS,
"request-timeout",
"Timeout for CQL requests in milliseconds. See DataStax Java Driver option `" +
DefaultDriverOption.REQUEST_TIMEOUT.getPath() + "` for more information.",
ConfigOption.Type.MASKABLE, 12000L);
ConfigNamespace INTERNAL_CONFIGURATION = new ConfigNamespace(
CQL_NS,
"internal",
"Advanced configuration of internal DataStax driver. Notice, all available configurations will be composed in the order. " +
"Non specified configurations will be skipped. By default only base configuration is enabled " +
"(which has the smallest priority. It means that you can overwrite any configuration used in base programmatic configuration by using any other configuration type). " +
"The configurations are composed in the next order (sorted by priority in descending order): " +
"`file-configuration`, " +
"`resource-configuration`, " +
"`string-configuration`, " +
"`url-configuration`, " +
"`base-programmatic-configuration` (which is controlled by `base-programmatic-configuration-enabled` property). " +
"Configurations with higher priority always overwrite configurations with lower priority. " +
"I.e. if the same configuration parameter is used in both `file-configuration` and `string-configuration` the configuration parameter " +
"from `file-configuration` will be used and configuration parameter from `string-configuration` will be ignored. "+
"See available configuration options and configurations structure here: https://docs.datastax.com/en/developer/java-driver/4.13/manual/core/configuration/reference/");
ConfigOption BASE_PROGRAMMATIC_CONFIGURATION_ENABLED = new ConfigOption<>(
INTERNAL_CONFIGURATION,
"base-programmatic-configuration-enabled",
"Whether to use main programmatic configuration provided by JanusGraph properties or not. " +
"We don't recommend to disable this property unless you want to disable usage of all "+
CQL_NS.toStringWithoutRoot()+" properties and use default configurations or other configurations. " +
"If programmatic configuration options miss some important configuration options you can provide those missing " +
"configurations with other configuration types which will be applied with programmatic configuration " +
"(see other configuration types in this section). For most use cases this option should always be `true`. " +
"JanusGraph behaviour might be unpredictable when using unspecified configuration options.",
ConfigOption.Type.MASKABLE,
true);
ConfigOption URL_CONFIGURATION = new ConfigOption<>(
INTERNAL_CONFIGURATION,
"url-configuration",
"Url where to get DataStax configuration.",
ConfigOption.Type.MASKABLE,
String.class);
ConfigOption STRING_CONFIGURATION = new ConfigOption<>(
INTERNAL_CONFIGURATION,
"string-configuration",
"String representing DataStax configuration.",
ConfigOption.Type.MASKABLE,
String.class);
ConfigOption RESOURCE_CONFIGURATION = new ConfigOption<>(
INTERNAL_CONFIGURATION,
"resource-configuration",
"Classpath resource with DataStax configuration.",
ConfigOption.Type.MASKABLE,
String.class);
ConfigOption FILE_CONFIGURATION = new ConfigOption<>(
INTERNAL_CONFIGURATION,
"file-configuration",
"Path to file with DataStax configuration.",
ConfigOption.Type.LOCAL,
String.class);
ConfigNamespace CQL_GROUPING_NS = new ConfigNamespace(
CQL_NS,
"grouping",
"Configuration options for controlling CQL queries grouping");
String MAX_IN_CONFIG_MSG = "Notice, for ScyllaDB this option should not exceed the maximum number of distinct " +
"clustering key restrictions per query which can be changed by ScyllaDB configuration option `max-partition-key-restrictions-per-query` " +
"(https://enterprise.docs.scylladb.com/branch-2022.2/faq.html#how-can-i-change-the-maximum-number-of-in-restrictions). " +
"For AstraDB this limit is set to 20 and usually it's fixed. However, you can ask customer support for a possibility to change " +
"the default threshold to your desired configuration via `partition_keys_in_select_failure_threshold` " +
"and `in_select_cartesian_product_failure_threshold` threshold configurations (https://docs.datastax.com/en/astra-serverless/docs/plan/planning.html#_cassandra_yaml).
" +
"Ensure that your storage backend allows more IN selectors than the one set via this configuration.";
ConfigOption SLICE_GROUPING_ALLOWED = new ConfigOption<>(
CQL_GROUPING_NS,
"slice-allowed",
"If `true` this allows multiple Slice queries which are allowed to be performed as non-range " +
"queries (i.e. direct equality operation) to be grouped together into a single CQL query via `IN` operator. " +
"Notice, currently only operations to fetch properties with Cardinality.SINGLE are allowed to be performed as non-range queries " +
"(edges fetching or properties with Cardinality SET or LIST won't be grouped together).
" +
"If this option is `false` then each Slice query will be executed in a separate asynchronous CQL query even when " +
"grouping is allowed.",
ConfigOption.Type.MASKABLE,
true);
ConfigOption SLICE_GROUPING_LIMIT = new ConfigOption<>(
CQL_GROUPING_NS,
"slice-limit",
"Maximum amount of grouped together slice queries into a single CQL query.
" + MAX_IN_CONFIG_MSG +
"
This option is used only when `"+SLICE_GROUPING_ALLOWED.toStringWithoutRoot()+"` is `true`.",
ConfigOption.Type.MASKABLE,
20);
ConfigOption KEYS_GROUPING_ALLOWED = new ConfigOption<>(
CQL_GROUPING_NS,
"keys-allowed",
"If `true` this allows multiple partition keys to be grouped together into a single CQL query via `IN` operator based on the keys grouping strategy provided " +
"(usually grouping is done by same token-ranges or same replica sets, but may also involve shard ids for custom implementations).
" +
"Notice, that any CQL query grouped with more than 1 key will require to return a row key for any column fetched.
" +
"This option is useful when less amount of CQL queries is desired to be sent for read requests in expense of fetching more data (partition key per each fetched value).
" +
"Notice, different storage backends may have different way of executing multi-partition `IN` queries " +
"(including, but not limited to how the checksum queries are sent for different consistency levels, processing node CPU usage, disk access pattern, etc.). Thus, a proper " +
"benchmarking is needed to determine if keys grouping is useful or not per case by case scenario.
" +
"This option can be enabled only for storage backends which support `PER PARTITION LIMIT`. As such, this feature can't be used with Amazon Keyspaces because it doesn't support `PER PARTITION LIMIT`.
" +
"If this option is `false` then each partition key will be executed in a separate asynchronous CQL query even when multiple keys from the same token range are queried.
" +
"Notice, the default grouping strategy does not take shards into account. Thus, this might be inefficient with ScyllaDB storage backend. " +
"ScyllaDB specific keys grouping strategy should be implemented after the resolution of the [ticket #232](https://github.com/scylladb/java-driver/issues/232).",
ConfigOption.Type.MASKABLE,
false);
ConfigOption KEYS_GROUPING_CLASS = new ConfigOption<>(
CQL_GROUPING_NS,
"keys-class",
"Full class path of the keys grouping execution strategy. The class should implement " +
"`org.janusgraph.diskstorage.cql.strategy.GroupedExecutionStrategy` interface and have a public constructor " +
"with two arguments `org.janusgraph.diskstorage.configuration.Configuration` and `org.janusgraph.diskstorage.cql.CQLStoreManager`.
" +
"Shortcuts available:
" +
"- `"+GroupedExecutionStrategyBuilder.TOKEN_RANGE_AWARE +"` - groups partition keys which belong to the same token range. Notice, this strategy does not take shards into account. Thus, this might be inefficient with ScyllaDB storage backend.
" +
"- `"+GroupedExecutionStrategyBuilder.REPLICAS_AWARE +"` - groups partition keys which belong to the same replica sets (same nodes). Notice, this strategy does not take shards into account. Thus, this might be inefficient with ScyllaDB storage backend.
" +
"
Usually `"+GroupedExecutionStrategyBuilder.TOKEN_RANGE_AWARE+"` grouping strategy provides more smaller groups where each group contain keys which are stored close to each other on a disk and may cause less disk seeks in some cases. " +
"However `"+GroupedExecutionStrategyBuilder.REPLICAS_AWARE+"` grouping strategy groups keys per replica set which usually means fewer bigger groups to be used (i.e. less CQL requests)." +
"
This option takes effect only when `"+KEYS_GROUPING_ALLOWED.toStringWithoutRoot()+"` is `true`.",
ConfigOption.Type.MASKABLE,
GroupedExecutionStrategyBuilder.REPLICAS_AWARE);
ConfigOption KEYS_GROUPING_LIMIT = new ConfigOption<>(
CQL_GROUPING_NS,
"keys-limit",
"Maximum amount of the keys which can be grouped together into a single CQL query. " +
"If more keys are queried, they are going to be grouped into separate CQL queries.
"
+ MAX_IN_CONFIG_MSG +
"
This option takes effect only when `"+KEYS_GROUPING_ALLOWED.toStringWithoutRoot()+"` is `true`.",
ConfigOption.Type.MASKABLE,
20);
ConfigOption KEYS_GROUPING_MIN = new ConfigOption<>(
CQL_GROUPING_NS,
"keys-min",
"Minimum amount of keys to consider for grouping. Grouping will be skipped for any multi-key query " +
"which has less than this amount of keys (i.e. a separate CQL query will be executed for each key in such case).
" +
"Usually this configuration should always be set to `2`. It is useful to increase the value only in cases when queries " +
"with more keys should not be grouped, but be performed separately to increase parallelism in expense of the network overhead." +
"
This option takes effect only when `"+KEYS_GROUPING_ALLOWED.toStringWithoutRoot()+"` is `true`.",
ConfigOption.Type.MASKABLE,
2);
}
© 2015 - 2024 Weber Informatics LLC | Privacy Policy