1use 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 pub max_in_flight_write_bytes: ReadableSize,
44 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 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 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#[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 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}