Skip to main content

standalone/
options.rs

1// Copyright 2023 Greptime Team
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7//     http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15use common_base::readable_size::ReadableSize;
16use common_config::{Configurable, KvBackendConfig};
17use common_memory_manager::OnExhaustedPolicy;
18use common_options::memory::MemoryOptions;
19use common_telemetry::logging::{LoggingOptions, SlowQueryOptions, TracingOptions};
20use common_wal::config::DatanodeWalConfig;
21use datanode::config::{DatanodeOptions, ProcedureConfig, RegionEngineConfig, StorageConfig};
22use file_engine::config::EngineConfig as FileEngineConfig;
23use flow::FlowConfig;
24use frontend::frontend::FrontendOptions;
25use frontend::service_config::{
26    InfluxdbOptions, JaegerOptions, MysqlOptions, OpentsdbOptions, PostgresOptions,
27    PromStoreOptions,
28};
29use mito2::config::MitoConfig;
30use query::options::QueryOptions;
31use serde::{Deserialize, Serialize};
32use servers::grpc::GrpcOptions;
33use servers::http::HttpOptions;
34
35#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)]
36#[serde(default)]
37pub struct StandaloneOptions {
38    pub enable_telemetry: bool,
39    pub default_timezone: Option<String>,
40    pub default_column_prefix: Option<String>,
41    /// Maximum total memory for all concurrent write request bodies and messages (HTTP, gRPC, Flight).
42    /// Set to 0 to disable the limit. Default: "0" (unlimited)
43    pub max_in_flight_write_bytes: ReadableSize,
44    /// Policy when write bytes quota is exhausted.
45    /// Options: "wait" (default, 10s), "wait(<duration>)", "fail"
46    pub write_bytes_exhausted_policy: OnExhaustedPolicy,
47    pub http: HttpOptions,
48    pub grpc: GrpcOptions,
49    pub mysql: MysqlOptions,
50    pub postgres: PostgresOptions,
51    pub opentsdb: OpentsdbOptions,
52    pub influxdb: InfluxdbOptions,
53    pub jaeger: JaegerOptions,
54    pub prom_store: PromStoreOptions,
55    pub wal: DatanodeWalConfig,
56    pub storage: StorageConfig,
57    pub metadata_store: KvBackendConfig,
58    pub procedure: ProcedureConfig,
59    pub flow: FlowConfig,
60    pub logging: LoggingOptions,
61    pub user_provider: Option<String>,
62    /// Options for different store engines.
63    pub region_engine: Vec<RegionEngineConfig>,
64    pub tracing: TracingOptions,
65    pub init_regions_in_background: bool,
66    pub init_regions_parallelism: usize,
67    pub slow_query: SlowQueryOptions,
68    pub query: QueryOptions,
69    pub memory: MemoryOptions,
70    /// Environment variable keys to read and report in heartbeat messages.
71    pub heartbeat_env_vars: Vec<String>,
72}
73
74impl Default for StandaloneOptions {
75    fn default() -> Self {
76        Self {
77            enable_telemetry: true,
78            default_timezone: None,
79            default_column_prefix: None,
80            max_in_flight_write_bytes: ReadableSize(0),
81            write_bytes_exhausted_policy: OnExhaustedPolicy::default(),
82            http: HttpOptions::default(),
83            grpc: GrpcOptions::default(),
84            mysql: MysqlOptions::default(),
85            postgres: PostgresOptions::default(),
86            opentsdb: OpentsdbOptions::default(),
87            influxdb: InfluxdbOptions::default(),
88            jaeger: JaegerOptions::default(),
89            prom_store: PromStoreOptions::default(),
90            wal: DatanodeWalConfig::default(),
91            storage: StorageConfig::default(),
92            metadata_store: KvBackendConfig::default(),
93            procedure: ProcedureConfig::default(),
94            flow: FlowConfig::default(),
95            logging: LoggingOptions::default(),
96            user_provider: None,
97            region_engine: vec![
98                RegionEngineConfig::Mito(MitoConfig::default()),
99                RegionEngineConfig::File(FileEngineConfig::default()),
100            ],
101            tracing: TracingOptions::default(),
102            init_regions_in_background: false,
103            init_regions_parallelism: 16,
104            slow_query: SlowQueryOptions::default(),
105            query: QueryOptions::default(),
106            memory: MemoryOptions::default(),
107            heartbeat_env_vars: vec![],
108        }
109    }
110}
111
112impl Configurable for StandaloneOptions {
113    fn env_list_keys() -> Option<&'static [&'static str]> {
114        Some(&["heartbeat_env_vars", "wal.broker_endpoints"])
115    }
116}
117
118/// The [`StandaloneOptions`] is only defined in `standalone` crate,
119/// we don't want to make `frontend` depends on it, so impl [`Into`]
120/// rather than [`From`].
121#[allow(clippy::from_over_into)]
122impl Into<FrontendOptions> for StandaloneOptions {
123    fn into(self) -> FrontendOptions {
124        self.frontend_options()
125    }
126}
127
128impl StandaloneOptions {
129    pub fn frontend_options(&self) -> FrontendOptions {
130        let cloned_opts = self.clone();
131        FrontendOptions {
132            default_timezone: cloned_opts.default_timezone,
133            max_in_flight_write_bytes: cloned_opts.max_in_flight_write_bytes,
134            write_bytes_exhausted_policy: cloned_opts.write_bytes_exhausted_policy,
135            http: cloned_opts.http,
136            grpc: cloned_opts.grpc,
137            mysql: cloned_opts.mysql,
138            postgres: cloned_opts.postgres,
139            opentsdb: cloned_opts.opentsdb,
140            influxdb: cloned_opts.influxdb,
141            jaeger: cloned_opts.jaeger,
142            prom_store: cloned_opts.prom_store,
143            meta_client: None,
144            logging: cloned_opts.logging,
145            user_provider: cloned_opts.user_provider,
146            slow_query: cloned_opts.slow_query,
147            heartbeat_env_vars: cloned_opts.heartbeat_env_vars.clone(),
148            ..Default::default()
149        }
150    }
151
152    pub fn datanode_options(&self) -> DatanodeOptions {
153        let cloned_opts = self.clone();
154        DatanodeOptions {
155            node_id: Some(0),
156            enable_telemetry: cloned_opts.enable_telemetry,
157            wal: cloned_opts.wal,
158            storage: cloned_opts.storage,
159            region_engine: cloned_opts.region_engine,
160            grpc: cloned_opts.grpc,
161            init_regions_in_background: cloned_opts.init_regions_in_background,
162            init_regions_parallelism: cloned_opts.init_regions_parallelism,
163            query: cloned_opts.query,
164            heartbeat_env_vars: cloned_opts.heartbeat_env_vars,
165            ..Default::default()
166        }
167    }
168
169    /// Sanitize the `StandaloneOptions` to ensure the config is valid.
170    pub fn sanitize(&mut self) {
171        if self.storage.is_object_storage() {
172            self.storage
173                .store
174                .cache_config_mut()
175                .unwrap()
176                .sanitize(&self.storage.data_home);
177        }
178    }
179}