/* * Copyright (C) 2015 ScyllaDB * */ /* * This file is part of Scylla. * * Scylla is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Scylla is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Scylla. If not, see . */ #pragma once #include #include #include #include #include #include #include "seastarx.hh" #include "utils/config_file.hh" #include "utils/enum_option.hh" #include "db/hints/host_filter.hh" namespace seastar { class file; struct logging_settings; } namespace db { namespace fs = std::filesystem; class extensions; /* * This type is not use, and probably never will be. * So it makes sense to jump through hoops just to ensure * it is in fact handled properly... */ struct seed_provider_type { seed_provider_type() = default; seed_provider_type(sstring n, std::initializer_list opts = { }) : class_name(std::move(n)), parameters(std::move(opts)) { } sstring class_name; std::unordered_map parameters; bool operator==(const seed_provider_type& other) const { return class_name == other.class_name && parameters == other.parameters; } friend std::ostream& operator<<(std::ostream& os, const seed_provider_type&); }; std::ostream& operator<<(std::ostream& os, const db::seed_provider_type& s); } namespace utils { sstring config_value_as_json(const db::seed_provider_type& v); sstring config_value_as_json(const log_level& v); sstring config_value_as_json(const std::unordered_map& v); } namespace db { /// Enumeration of all valid values for the `experimental` config entry. struct experimental_features_t { enum feature { UNUSED, UDF, UNUSED_CDC, ALTERNATOR_STREAMS }; static std::unordered_map map(); // See enum_option. static std::vector> all(); }; class config : public utils::config_file { public: config(); config(std::shared_ptr); ~config(); // For testing only void add_cdc_extension(); /// True iff the feature is enabled. bool check_experimental(experimental_features_t::feature f) const; void setup_directories(); /** * Scans the environment variables for configuration files directory * definition. It's either $SCYLLA_CONF, $SCYLLA_HOME/conf or "conf" if none * of SCYLLA_CONF and SCYLLA_HOME is defined. * * @return path of the directory where configuration files are located * according the environment variables definitions. */ static fs::path get_conf_dir(); static fs::path get_conf_sub(fs::path); using string_map = std::unordered_map; //program_options::string_map; using string_list = std::vector; using seed_provider_type = db::seed_provider_type; using hinted_handoff_enabled_type = db::hints::host_filter; /* * All values and documentation taken from * http://docs.datastax.com/en/cassandra/2.1/cassandra/configuration/configCassandra_yaml_r.html */ named_value background_writer_scheduling_quota; named_value auto_adjust_flush_quota; named_value memtable_flush_static_shares; named_value compaction_static_shares; named_value compaction_enforce_min_threshold; named_value cluster_name; named_value listen_address; named_value listen_interface; named_value listen_interface_prefer_ipv6; named_value work_directory; named_value commitlog_directory; named_value data_file_directories; named_value hints_directory; named_value view_hints_directory; named_value saved_caches_directory; named_value commit_failure_policy; named_value disk_failure_policy; named_value endpoint_snitch; named_value rpc_address; named_value rpc_interface; named_value rpc_interface_prefer_ipv6; named_value seed_provider; named_value compaction_throughput_mb_per_sec; named_value compaction_large_partition_warning_threshold_mb; named_value compaction_large_row_warning_threshold_mb; named_value compaction_large_cell_warning_threshold_mb; named_value compaction_rows_count_warning_threshold; named_value memtable_total_space_in_mb; named_value concurrent_reads; named_value concurrent_writes; named_value concurrent_counter_writes; named_value incremental_backups; named_value snapshot_before_compaction; named_value phi_convict_threshold; named_value commitlog_sync; named_value commitlog_segment_size_in_mb; named_value commitlog_sync_period_in_ms; named_value commitlog_sync_batch_window_in_ms; named_value commitlog_total_space_in_mb; named_value commitlog_reuse_segments; named_value commitlog_use_o_dsync; named_value compaction_preheat_key_cache; named_value concurrent_compactors; named_value in_memory_compaction_limit_in_mb; named_value preheat_kernel_page_cache; named_value sstable_preemptive_open_interval_in_mb; named_value defragment_memory_on_idle; named_value memtable_allocation_type; named_value memtable_cleanup_threshold; named_value file_cache_size_in_mb; named_value memtable_flush_queue_size; named_value memtable_flush_writers; named_value memtable_heap_space_in_mb; named_value memtable_offheap_space_in_mb; named_value column_index_size_in_kb; named_value index_summary_capacity_in_mb; named_value index_summary_resize_interval_in_minutes; named_value reduce_cache_capacity_to; named_value reduce_cache_sizes_at; named_value stream_throughput_outbound_megabits_per_sec; named_value inter_dc_stream_throughput_outbound_megabits_per_sec; named_value trickle_fsync; named_value trickle_fsync_interval_in_kb; named_value auto_bootstrap; named_value batch_size_warn_threshold_in_kb; named_value batch_size_fail_threshold_in_kb; named_value broadcast_address; named_value listen_on_broadcast_address; named_value initial_token; named_value num_tokens; named_value partitioner; named_value storage_port; named_value auto_snapshot; named_value key_cache_keys_to_save; named_value key_cache_save_period; named_value key_cache_size_in_mb; named_value row_cache_keys_to_save; named_value row_cache_size_in_mb; named_value row_cache_save_period; named_value memory_allocator; named_value counter_cache_size_in_mb; named_value counter_cache_save_period; named_value counter_cache_keys_to_save; named_value tombstone_warn_threshold; named_value tombstone_failure_threshold; named_value range_request_timeout_in_ms; named_value read_request_timeout_in_ms; named_value counter_write_request_timeout_in_ms; named_value cas_contention_timeout_in_ms; named_value truncate_request_timeout_in_ms; named_value write_request_timeout_in_ms; named_value request_timeout_in_ms; named_value cross_node_timeout; named_value internode_send_buff_size_in_bytes; named_value internode_recv_buff_size_in_bytes; named_value internode_compression; named_value inter_dc_tcp_nodelay; named_value streaming_socket_timeout_in_ms; named_value start_native_transport; named_value native_transport_port; named_value native_transport_port_ssl; named_value native_shard_aware_transport_port; named_value native_shard_aware_transport_port_ssl; named_value native_transport_max_threads; named_value native_transport_max_frame_size_in_mb; named_value broadcast_rpc_address; named_value rpc_port; named_value start_rpc; named_value rpc_keepalive; named_value rpc_max_threads; named_value rpc_min_threads; named_value rpc_recv_buff_size_in_bytes; named_value rpc_send_buff_size_in_bytes; named_value rpc_server_type; named_value cache_hit_rate_read_balancing; named_value dynamic_snitch_badness_threshold; named_value dynamic_snitch_reset_interval_in_ms; named_value dynamic_snitch_update_interval_in_ms; named_value hinted_handoff_enabled; named_value hinted_handoff_throttle_in_kb; named_value max_hint_window_in_ms; named_value max_hints_delivery_threads; named_value batchlog_replay_throttle_in_kb; named_value request_scheduler; named_value request_scheduler_id; named_value request_scheduler_options; named_value thrift_framed_transport_size_in_mb; named_value thrift_max_message_length_in_mb; named_value authenticator; named_value internode_authenticator; named_value authorizer; named_value role_manager; named_value permissions_validity_in_ms; named_value permissions_update_interval_in_ms; named_value permissions_cache_max_entries; named_value server_encryption_options; named_value client_encryption_options; named_value alternator_encryption_options; named_value ssl_storage_port; named_value enable_in_memory_data_store; named_value enable_cache; named_value enable_commitlog; named_value volatile_system_keyspace_for_testing; named_value api_port; named_value api_address; named_value api_ui_dir; named_value api_doc_dir; named_value load_balance; named_value consistent_rangemovement; named_value join_ring; named_value load_ring_state; named_value replace_node; named_value replace_token; named_value replace_address; named_value replace_address_first_boot; named_value override_decommission; named_value enable_repair_based_node_ops; named_value ring_delay_ms; named_value shadow_round_ms; named_value fd_max_interval_ms; named_value fd_initial_value_ms; named_value shutdown_announce_in_ms; named_value developer_mode; named_value skip_wait_for_gossip_to_settle; named_value force_gossip_generation; named_value experimental; named_value>> experimental_features; named_value lsa_reclamation_step; named_value prometheus_port; named_value prometheus_address; named_value prometheus_prefix; named_value abort_on_lsa_bad_alloc; named_value murmur3_partitioner_ignore_msb_bits; named_value virtual_dirty_soft_limit; named_value sstable_summary_ratio; named_value large_memory_allocation_warning_threshold; named_value enable_deprecated_partitioners; named_value enable_keyspace_column_family_metrics; named_value enable_sstable_data_integrity_check; named_value enable_sstable_key_validation; named_value cpu_scheduler; named_value view_building; named_value enable_sstables_mc_format; named_value enable_sstables_md_format; named_value enable_dangerous_direct_import_of_cassandra_counters; named_value enable_shard_aware_drivers; named_value enable_ipv6_dns_lookup; named_value abort_on_internal_error; named_value max_partition_key_restrictions_per_query; named_value max_clustering_key_restrictions_per_query; named_value max_memory_for_unlimited_query_soft_limit; named_value max_memory_for_unlimited_query_hard_limit; named_value initial_sstable_loading_concurrency; named_value enable_3_1_0_compatibility_mode; named_value enable_user_defined_functions; named_value user_defined_function_time_limit_ms; named_value user_defined_function_allocation_limit_bytes; named_value user_defined_function_contiguous_allocation_limit_bytes; named_value schema_registry_grace_period; named_value max_concurrent_requests_per_shard; named_value alternator_port; named_value alternator_https_port; named_value alternator_address; named_value alternator_enforce_authorization; named_value alternator_write_isolation; named_value alternator_streams_time_window_s; named_value alternator_timeout_in_ms; named_value abort_on_ebadf; named_value redis_port; named_value redis_ssl_port; named_value redis_read_consistency_level; named_value redis_write_consistency_level; named_value redis_database_count; named_value redis_keyspace_replication_strategy_options; seastar::logging_settings logging_settings(const boost::program_options::variables_map&) const; const db::extensions& extensions() const; static const sstring default_tls_priority; private: template struct log_legacy_value : public named_value { using MyBase = named_value; using MyBase::MyBase; T value_or(T&& t) const { return this->is_set() ? (*this)() : t; } // do not add to boost::options. We only care about yaml config void add_command_line_option(boost::program_options::options_description_easy_init&) override {} }; log_legacy_value default_log_level; log_legacy_value> logger_log_level; log_legacy_value log_to_stdout, log_to_syslog; void maybe_in_workdir(named_value&, const char*); void maybe_in_workdir(named_value&, const char*); std::shared_ptr _extensions; }; }