Skip to main content

risingwave_meta/manager/
env.rs

1// Copyright 2022 RisingWave Labs
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 std::ops::Deref;
16use std::path::PathBuf;
17use std::sync::Arc;
18use std::sync::atomic::AtomicU32;
19
20use anyhow::Context;
21use risingwave_common::config::{
22    CompactionConfig, DefaultParallelism, ObjectStoreConfig, RpcClientConfig, SessionInitConfig,
23};
24use risingwave_common::system_param::reader::SystemParamsReader;
25use risingwave_common::{bail, system_param};
26use risingwave_meta_model::prelude::Cluster;
27use risingwave_pb::meta::SystemParams;
28use risingwave_rpc_client::{
29    FrontendClientPool, FrontendClientPoolRef, StreamClientPool, StreamClientPoolRef,
30};
31use risingwave_sqlparser::ast::RedactSqlOptionKeywordsRef;
32use sea_orm::EntityTrait;
33
34use crate::MetaResult;
35use crate::barrier::SharedActorInfos;
36use crate::controller::SqlMetaStore;
37use crate::controller::id::{
38    IdGeneratorManager as SqlIdGeneratorManager, IdGeneratorManagerRef as SqlIdGeneratorManagerRef,
39};
40use crate::controller::session_params::{SessionParamsController, SessionParamsControllerRef};
41use crate::controller::system_param::{SystemParamsController, SystemParamsControllerRef};
42use crate::hummock::sequence::SequenceGenerator;
43use crate::manager::event_log::{EventLogManagerRef, start_event_log_manager};
44use crate::manager::{IdleManager, IdleManagerRef, NotificationManager, NotificationManagerRef};
45use crate::model::ClusterId;
46
47/// [`MetaSrvEnv`] is the global environment in Meta service. The instance will be shared by all
48/// kind of managers inside Meta.
49#[derive(Clone)]
50pub struct MetaSrvEnv {
51    /// id generator manager.
52    id_gen_manager_impl: SqlIdGeneratorManagerRef,
53
54    /// system param manager.
55    system_param_manager_impl: SystemParamsControllerRef,
56
57    /// session param manager.
58    session_param_manager_impl: SessionParamsControllerRef,
59
60    /// meta store.
61    meta_store_impl: SqlMetaStore,
62
63    /// notification manager.
64    notification_manager: NotificationManagerRef,
65
66    pub shared_actor_info: SharedActorInfos,
67
68    /// stream client pool memorization.
69    stream_client_pool: StreamClientPoolRef,
70
71    /// rpc client pool for frontend nodes.
72    frontend_client_pool: FrontendClientPoolRef,
73
74    /// idle status manager.
75    idle_manager: IdleManagerRef,
76
77    event_log_manager: EventLogManagerRef,
78
79    /// Unique identifier of the cluster.
80    cluster_id: ClusterId,
81
82    pub hummock_seq: Arc<SequenceGenerator>,
83
84    /// The await-tree registry of the current meta node.
85    await_tree_reg: await_tree::Registry,
86
87    /// options read by all services
88    pub opts: Arc<MetaOpts>,
89
90    actor_id_generator: Arc<AtomicU32>,
91}
92
93/// Options shared by all meta service instances
94#[derive(Clone, serde::Serialize)]
95pub struct MetaOpts {
96    /// Whether to enable the recovery of the cluster. If disabled, the meta service will exit on
97    /// abnormal cases.
98    pub enable_recovery: bool,
99    /// Whether to disable the auto-scaling feature.
100    pub disable_automatic_parallelism_control: bool,
101    /// The number of streaming jobs per scaling operation.
102    pub parallelism_control_batch_size: usize,
103    /// The period of parallelism control trigger.
104    pub parallelism_control_trigger_period_sec: u64,
105    /// The first delay of parallelism control.
106    pub parallelism_control_trigger_first_delay_sec: u64,
107    /// The maximum number of pending barriers in each partial graph.
108    pub in_flight_barrier_nums: usize,
109    /// The maximum number of lagged barriers when finishing snapshot backfill.
110    pub snapshot_backfill_finish_max_lagged_barriers: usize,
111    /// The multiplier applied to the pending-barrier limit for snapshot backfill partial graphs.
112    pub snapshot_backfill_barrier_amplification_factor: usize,
113    /// After specified seconds of idle (no mview or flush), the process will be exited.
114    /// 0 for infinite, process will never be exited due to long idle time.
115    pub max_idle_ms: u64,
116    /// Whether run in compaction detection test mode
117    pub compaction_deterministic_test: bool,
118    /// Default parallelism of units for all streaming jobs.
119    pub default_parallelism: DefaultParallelism,
120
121    /// Interval of invoking a vacuum job, to remove stale metadata from meta store and objects
122    /// from object store.
123    pub vacuum_interval_sec: u64,
124    /// The spin interval inside a vacuum job. It avoids the vacuum job monopolizing resources of
125    /// meta node.
126    pub vacuum_spin_interval_ms: u64,
127    /// Interval of invoking iceberg garbage collection, to expire old snapshots.
128    pub iceberg_gc_interval_sec: u64,
129    /// Maximum time to wait for an iceberg compaction task report before the lease expires.
130    pub iceberg_compaction_report_timeout_sec: u64,
131    /// Maximum time to reuse cached iceberg compaction schedule config before refreshing it.
132    pub iceberg_compaction_config_refresh_interval_sec: u64,
133    pub time_travel_vacuum_interval_sec: u64,
134    pub time_travel_vacuum_max_version_count: Option<u32>,
135    /// Interval of hummock version checkpoint.
136    pub hummock_version_checkpoint_interval_sec: u64,
137    pub enable_hummock_data_archive: bool,
138    /// Compression algorithm for hummock version checkpoint: "zstd", "lz4", or "none".
139    pub checkpoint_compression_algorithm: risingwave_common::config::CheckpointCompression,
140    /// Chunk size in bytes for reading large checkpoints.
141    pub checkpoint_read_chunk_size: usize,
142    /// Maximum number of concurrent chunk reads for large checkpoints.
143    pub checkpoint_read_max_in_flight_chunks: usize,
144    pub hummock_time_travel_snapshot_interval: u64,
145    pub hummock_time_travel_sst_info_fetch_batch_size: usize,
146    pub hummock_time_travel_sst_info_insert_batch_size: usize,
147    pub hummock_time_travel_epoch_version_insert_batch_size: usize,
148    pub hummock_time_travel_delta_fetch_batch_size: usize,
149    pub hummock_gc_history_insert_batch_size: usize,
150    pub hummock_time_travel_filter_out_objects_batch_size: usize,
151    pub hummock_time_travel_filter_out_objects_v1: bool,
152    pub hummock_time_travel_filter_out_objects_list_version_batch_size: usize,
153    pub hummock_time_travel_filter_out_objects_list_delta_batch_size: usize,
154    /// The minimum delta log number a new checkpoint should compact, otherwise the checkpoint
155    /// attempt is rejected. Greater value reduces object store IO, meanwhile it results in
156    /// more loss of in memory `HummockVersionCheckpoint::stale_objects` state when meta node is
157    /// restarted.
158    pub min_delta_log_num_for_hummock_version_checkpoint: u64,
159    /// Objects within `min_sst_retention_time_sec` won't be deleted by hummock full GC, even they
160    /// are dangling.
161    pub min_sst_retention_time_sec: u64,
162    /// Interval of automatic hummock full GC.
163    pub full_gc_interval_sec: u64,
164    /// Max number of object per full GC job can fetch.
165    pub full_gc_object_limit: u64,
166    /// Duration in seconds to retain garbage collection history data.
167    pub gc_history_retention_time_sec: u64,
168    /// Max number of inflight time travel query.
169    pub max_inflight_time_travel_query: u64,
170    /// Enable sanity check when SSTs are committed
171    pub enable_committed_sst_sanity_check: bool,
172    /// Schedule compaction for all compaction groups with this interval.
173    pub periodic_compaction_interval_sec: u64,
174    /// Interval of reporting the number of nodes in the cluster.
175    pub node_num_monitor_interval_sec: u64,
176    /// Whether to protect the drop table operation with incoming sink.
177    pub protect_drop_table_with_incoming_sink: bool,
178    /// The Prometheus endpoint for Meta Dashboard Service.
179    /// The Dashboard service uses this in the following ways:
180    /// 1. Query Prometheus for relevant metrics to find Stream Graph Bottleneck, and display it.
181    /// 2. Provide cluster diagnostics, at `/api/monitor/diagnose` to troubleshoot cluster.
182    ///    These are just examples which show how the Meta Dashboard Service queries Prometheus.
183    pub prometheus_endpoint: Option<String>,
184
185    /// The additional selector used when querying Prometheus.
186    pub prometheus_selector: Option<String>,
187
188    /// The VPC id of the cluster.
189    pub vpc_id: Option<String>,
190
191    /// A usable security group id to assign to a vpc endpoint
192    pub security_group_id: Option<String>,
193
194    /// Default tag for the endpoint created when creating a privatelink connection.
195    /// Will be appended to the tags specified in the `tags` field in with clause in `create
196    /// connection`.
197    pub privatelink_endpoint_default_tags: Option<Vec<(String, String)>>,
198
199    /// Schedule `space_reclaim_compaction` for all compaction groups with this interval.
200    pub periodic_space_reclaim_compaction_interval_sec: u64,
201
202    /// telemetry enabled in config file or not
203    pub telemetry_enabled: bool,
204    /// Schedule `ttl_reclaim_compaction` for all compaction groups with this interval.
205    pub periodic_ttl_reclaim_compaction_interval_sec: u64,
206
207    /// Schedule `tombstone_reclaim_compaction` for all compaction groups with this interval.
208    pub periodic_tombstone_reclaim_compaction_interval_sec: u64,
209
210    /// Schedule the regular compaction-group split job for all compaction groups with this interval.
211    pub periodic_scheduling_compaction_group_split_interval_sec: u64,
212    /// Whether to enable overlap normalization before the regular merge scheduler.
213    pub enable_compaction_group_normalize: bool,
214    /// Maximum normalize splits in one scheduler round. Must be greater than 0.
215    pub max_normalize_splits_per_round: u64,
216
217    /// Whether config object storage bucket lifecycle to purge stale data.
218    pub do_not_config_object_storage_lifecycle: bool,
219
220    pub partition_vnode_count: u32,
221
222    /// threshold of high write throughput of state-table, unit: B/sec
223    pub table_high_write_throughput_threshold: u64,
224    /// threshold of low write throughput of state-table, unit: B/sec
225    pub table_low_write_throughput_threshold: u64,
226
227    pub compaction_task_max_heartbeat_interval_secs: u64,
228    pub compaction_task_max_progress_interval_secs: u64,
229    pub compaction_task_id_refill_capacity: u32,
230    pub compaction_config: Option<CompactionConfig>,
231
232    /// hybrid compaction group config
233    ///
234    /// `hybrid_partition_vnode_count` determines the granularity of vnodes in the hybrid compaction group for SST alignment.
235    /// When `hybrid_partition_vnode_count` > 0, in hybrid compaction group
236    /// - Tables with high write throughput will be split at vnode granularity
237    /// - Tables with high size tables will be split by table granularity
238    ///   When `hybrid_partition_vnode_count` = 0,no longer be special alignment operations for the hybrid compaction group
239    pub hybrid_partition_node_count: u32,
240
241    pub event_log_enabled: bool,
242    pub event_log_channel_max_size: u32,
243    pub advertise_addr: String,
244    /// The number of traces to be cached in-memory by the tracing collector
245    /// embedded in the meta node.
246    pub cached_traces_num: u32,
247    /// The maximum memory usage in bytes for the tracing collector embedded
248    /// in the meta node.
249    pub cached_traces_memory_limit_bytes: usize,
250
251    /// l0 picker whether to select trivial move task
252    pub enable_trivial_move: bool,
253
254    /// l0 multi level picker whether to check the overlap accuracy between sub levels
255    pub enable_check_task_level_overlap: bool,
256    pub enable_dropped_column_reclaim: bool,
257
258    /// Whether to split the compaction group when the size of the group exceeds the threshold.
259    pub split_group_size_ratio: f64,
260
261    /// The interval in seconds for the refresh scheduler to check and trigger scheduled refreshes.
262    pub refresh_scheduler_interval_sec: u64,
263
264    /// To split the compaction group when the high throughput statistics of the group exceeds the threshold.
265    pub table_stat_high_write_throughput_ratio_for_split: f64,
266
267    /// To merge the compaction group when the low throughput statistics of the group exceeds the threshold.
268    pub table_stat_low_write_throughput_ratio_for_merge: f64,
269
270    /// The window seconds of table throughput statistic history for split compaction group.
271    pub table_stat_throuput_window_seconds_for_split: usize,
272
273    /// The window seconds of table throughput statistic history for merge compaction group.
274    pub table_stat_throuput_window_seconds_for_merge: usize,
275
276    /// The configuration of the object store
277    pub object_store_config: ObjectStoreConfig,
278
279    /// The maximum number of trivial move tasks to be picked in a single loop
280    pub max_trivial_move_task_count_per_loop: usize,
281
282    /// The maximum number of times to probe for `PullTaskEvent`
283    pub max_get_task_probe_times: usize,
284
285    pub compact_task_table_size_partition_threshold_low: u64,
286    pub compact_task_table_size_partition_threshold_high: u64,
287
288    pub periodic_scheduling_compaction_group_merge_interval_sec: u64,
289
290    pub compaction_group_merge_dimension_threshold: f64,
291
292    // The private key for the secret store, used when the secret is stored in the meta.
293    pub secret_store_private_key: Option<Vec<u8>>,
294    /// The path of the temp secret file directory.
295    pub temp_secret_file_dir: String,
296
297    // Cluster limits
298    pub actor_cnt_per_worker_parallelism_hard_limit: usize,
299    pub actor_cnt_per_worker_parallelism_soft_limit: usize,
300
301    pub table_change_log_insert_batch_size: u64,
302    pub table_change_log_delete_batch_size: u64,
303
304    pub license_key_path: Option<PathBuf>,
305
306    pub compute_client_config: RpcClientConfig,
307    pub stream_client_config: RpcClientConfig,
308    pub frontend_client_config: RpcClientConfig,
309    pub redact_sql_option_keywords: RedactSqlOptionKeywordsRef,
310
311    pub cdc_table_split_init_sleep_interval_splits: u64,
312    pub cdc_table_split_init_sleep_duration_millis: u64,
313    pub cdc_table_split_init_insert_batch_size: u64,
314
315    pub enable_legacy_table_migration: bool,
316    pub pause_on_next_bootstrap_offline: bool,
317    pub serverless_backfill_controller_addr: String,
318}
319
320impl MetaOpts {
321    /// Default opts for testing. Some tests need `enable_recovery=true`
322    pub fn test(enable_recovery: bool) -> Self {
323        Self {
324            enable_recovery,
325            disable_automatic_parallelism_control: false,
326            parallelism_control_batch_size: 1,
327            parallelism_control_trigger_period_sec: 10,
328            parallelism_control_trigger_first_delay_sec: 30,
329            in_flight_barrier_nums: 40,
330            snapshot_backfill_finish_max_lagged_barriers: 100,
331            snapshot_backfill_barrier_amplification_factor: 1,
332            max_idle_ms: 0,
333            compaction_deterministic_test: false,
334            default_parallelism: DefaultParallelism::Full,
335            vacuum_interval_sec: 30,
336            time_travel_vacuum_interval_sec: 30,
337            time_travel_vacuum_max_version_count: None,
338            vacuum_spin_interval_ms: 0,
339            iceberg_gc_interval_sec: 3600,
340            iceberg_compaction_report_timeout_sec: 30 * 60,
341            iceberg_compaction_config_refresh_interval_sec: 60,
342            hummock_version_checkpoint_interval_sec: 30,
343            enable_hummock_data_archive: false,
344            checkpoint_compression_algorithm:
345                risingwave_common::config::CheckpointCompression::Zstd,
346            checkpoint_read_chunk_size: 128 * 1024 * 1024,
347            checkpoint_read_max_in_flight_chunks: 4,
348            hummock_time_travel_snapshot_interval: 0,
349            hummock_time_travel_sst_info_fetch_batch_size: 10_000,
350            hummock_time_travel_sst_info_insert_batch_size: 10,
351            hummock_time_travel_epoch_version_insert_batch_size: 1000,
352            hummock_time_travel_delta_fetch_batch_size: 1000,
353            hummock_gc_history_insert_batch_size: 1000,
354            hummock_time_travel_filter_out_objects_batch_size: 1000,
355            hummock_time_travel_filter_out_objects_v1: false,
356            hummock_time_travel_filter_out_objects_list_version_batch_size: 10,
357            hummock_time_travel_filter_out_objects_list_delta_batch_size: 1000,
358            min_delta_log_num_for_hummock_version_checkpoint: 1,
359            min_sst_retention_time_sec: 3600 * 24 * 7,
360            full_gc_interval_sec: 3600 * 24 * 7,
361            full_gc_object_limit: 100_000,
362            gc_history_retention_time_sec: 3600 * 24 * 7,
363            max_inflight_time_travel_query: 1000,
364            enable_committed_sst_sanity_check: false,
365            periodic_compaction_interval_sec: 300,
366            node_num_monitor_interval_sec: 10,
367            protect_drop_table_with_incoming_sink: false,
368            prometheus_endpoint: None,
369            prometheus_selector: None,
370            vpc_id: None,
371            security_group_id: None,
372            privatelink_endpoint_default_tags: None,
373            periodic_space_reclaim_compaction_interval_sec: 60,
374            telemetry_enabled: false,
375            periodic_ttl_reclaim_compaction_interval_sec: 60,
376            periodic_tombstone_reclaim_compaction_interval_sec: 60,
377            periodic_scheduling_compaction_group_split_interval_sec: 60,
378            enable_compaction_group_normalize: false,
379            max_normalize_splits_per_round: 4,
380            compact_task_table_size_partition_threshold_low: 128 * 1024 * 1024,
381            compact_task_table_size_partition_threshold_high: 512 * 1024 * 1024,
382            table_high_write_throughput_threshold: 128 * 1024 * 1024,
383            table_low_write_throughput_threshold: 64 * 1024 * 1024,
384            do_not_config_object_storage_lifecycle: true,
385            partition_vnode_count: 32,
386            compaction_task_max_heartbeat_interval_secs: 0,
387            compaction_task_max_progress_interval_secs: 1,
388            compaction_task_id_refill_capacity: 64,
389            compaction_config: None,
390            hybrid_partition_node_count: 4,
391            event_log_enabled: false,
392            event_log_channel_max_size: 1,
393            advertise_addr: "".to_owned(),
394            cached_traces_num: 1,
395            cached_traces_memory_limit_bytes: usize::MAX,
396            enable_trivial_move: true,
397            enable_check_task_level_overlap: true,
398            enable_dropped_column_reclaim: false,
399            object_store_config: ObjectStoreConfig::default(),
400            max_trivial_move_task_count_per_loop: 256,
401            max_get_task_probe_times: 5,
402            secret_store_private_key: Some(
403                hex::decode("0123456789abcdef0123456789abcdef").unwrap(),
404            ),
405            temp_secret_file_dir: "./secrets".to_owned(),
406            actor_cnt_per_worker_parallelism_hard_limit: usize::MAX,
407            actor_cnt_per_worker_parallelism_soft_limit: usize::MAX,
408            split_group_size_ratio: 0.9,
409            table_stat_high_write_throughput_ratio_for_split: 0.5,
410            table_stat_low_write_throughput_ratio_for_merge: 0.7,
411            table_stat_throuput_window_seconds_for_split: 60,
412            table_stat_throuput_window_seconds_for_merge: 240,
413            periodic_scheduling_compaction_group_merge_interval_sec: 60 * 10,
414            compaction_group_merge_dimension_threshold: 1.2,
415            license_key_path: None,
416            compute_client_config: RpcClientConfig::default(),
417            stream_client_config: RpcClientConfig::default(),
418            frontend_client_config: RpcClientConfig::default(),
419            redact_sql_option_keywords: Arc::new(Default::default()),
420            cdc_table_split_init_sleep_interval_splits: 1000,
421            cdc_table_split_init_sleep_duration_millis: 10,
422            cdc_table_split_init_insert_batch_size: 1000,
423            enable_legacy_table_migration: true,
424            refresh_scheduler_interval_sec: 60,
425            pause_on_next_bootstrap_offline: false,
426            serverless_backfill_controller_addr: String::new(),
427            table_change_log_insert_batch_size: 1000,
428            table_change_log_delete_batch_size: 1000,
429        }
430    }
431}
432
433impl MetaSrvEnv {
434    pub async fn new(
435        opts: MetaOpts,
436        mut init_system_params: SystemParams,
437        session_init: SessionInitConfig,
438        meta_store_impl: SqlMetaStore,
439    ) -> MetaResult<Self> {
440        let idle_manager = Arc::new(IdleManager::new(opts.max_idle_ms));
441        let stream_client_pool =
442            Arc::new(StreamClientPool::new(1, opts.stream_client_config.clone())); // typically no need for plural clients
443        let frontend_client_pool = Arc::new(FrontendClientPool::new(
444            1,
445            opts.frontend_client_config.clone(),
446        ));
447        let event_log_manager = Arc::new(start_event_log_manager(
448            opts.event_log_enabled,
449            opts.event_log_channel_max_size,
450        ));
451
452        // When license key path is specified, license key from system parameters can be easily
453        // overwritten. So we simply reject this case.
454        if opts.license_key_path.is_some()
455            && init_system_params.license_key
456                != system_param::default::license_key_opt().map(Into::into)
457        {
458            bail!(
459                "argument `--license-key-path` (or env var `RW_LICENSE_KEY_PATH`) and \
460                 system parameter `license_key` (or env var `RW_LICENSE_KEY`) may not \
461                 be set at the same time"
462            );
463        }
464
465        let cluster_first_launch = meta_store_impl.up().await.context(
466            "Failed to initialize the meta store, \
467            this may happen if there's existing metadata incompatible with the current version of RisingWave, \
468            e.g., downgrading from a newer release or a nightly build to an older one. \
469            For a single-node deployment, you may want to reset all data by deleting the data directory, \
470            typically located at `~/.risingwave`.",
471        )?;
472
473        let notification_manager =
474            Arc::new(NotificationManager::new(meta_store_impl.clone()).await);
475        let cluster_id = Cluster::find()
476            .one(&meta_store_impl.conn)
477            .await?
478            .map(|c| c.cluster_id.to_string().into())
479            .unwrap();
480
481        // For new clusters:
482        // - the name of the object store needs to be prefixed according to the object id.
483        //
484        // For old clusters
485        // - the prefix is ​​not divided for the sake of compatibility.
486        init_system_params.use_new_object_prefix_strategy = Some(cluster_first_launch);
487
488        let system_param_controller = Arc::new(
489            SystemParamsController::new(
490                meta_store_impl.clone(),
491                notification_manager.clone(),
492                init_system_params,
493            )
494            .await?,
495        );
496        let session_param_controller = Arc::new(
497            SessionParamsController::new(
498                meta_store_impl.clone(),
499                notification_manager.clone(),
500                session_init,
501            )
502            .await?,
503        );
504        Ok(Self {
505            id_gen_manager_impl: Arc::new(SqlIdGeneratorManager::new(&meta_store_impl.conn).await?),
506            system_param_manager_impl: system_param_controller,
507            session_param_manager_impl: session_param_controller,
508            meta_store_impl: meta_store_impl.clone(),
509            shared_actor_info: SharedActorInfos::new(notification_manager.clone()),
510            notification_manager,
511            stream_client_pool,
512            frontend_client_pool,
513            idle_manager,
514            event_log_manager,
515            cluster_id,
516            hummock_seq: Arc::new(SequenceGenerator::new(meta_store_impl.conn.clone())),
517            opts: opts.into(),
518            // Await trees on the meta node is lightweight, thus always enabled.
519            await_tree_reg: await_tree::Registry::new(Default::default()),
520            actor_id_generator: Arc::new(AtomicU32::new(0)),
521        })
522    }
523
524    pub fn meta_store(&self) -> SqlMetaStore {
525        self.meta_store_impl.clone()
526    }
527
528    pub fn meta_store_ref(&self) -> &SqlMetaStore {
529        &self.meta_store_impl
530    }
531
532    pub fn id_gen_manager(&self) -> &SqlIdGeneratorManagerRef {
533        &self.id_gen_manager_impl
534    }
535
536    pub fn notification_manager_ref(&self) -> NotificationManagerRef {
537        self.notification_manager.clone()
538    }
539
540    pub fn notification_manager(&self) -> &NotificationManager {
541        self.notification_manager.deref()
542    }
543
544    pub fn idle_manager_ref(&self) -> IdleManagerRef {
545        self.idle_manager.clone()
546    }
547
548    pub fn idle_manager(&self) -> &IdleManager {
549        self.idle_manager.deref()
550    }
551
552    pub fn actor_id_generator(&self) -> &AtomicU32 {
553        self.actor_id_generator.deref()
554    }
555
556    pub async fn system_params_reader(&self) -> SystemParamsReader {
557        self.system_param_manager_impl.get_params().await
558    }
559
560    pub fn system_params_manager_impl_ref(&self) -> SystemParamsControllerRef {
561        self.system_param_manager_impl.clone()
562    }
563
564    pub fn session_params_manager_impl_ref(&self) -> SessionParamsControllerRef {
565        self.session_param_manager_impl.clone()
566    }
567
568    pub fn stream_client_pool_ref(&self) -> StreamClientPoolRef {
569        self.stream_client_pool.clone()
570    }
571
572    pub fn stream_client_pool(&self) -> &StreamClientPool {
573        self.stream_client_pool.deref()
574    }
575
576    pub fn frontend_client_pool(&self) -> &FrontendClientPool {
577        self.frontend_client_pool.deref()
578    }
579
580    pub fn cluster_id(&self) -> &ClusterId {
581        &self.cluster_id
582    }
583
584    pub fn event_log_manager_ref(&self) -> EventLogManagerRef {
585        self.event_log_manager.clone()
586    }
587
588    pub fn await_tree_reg(&self) -> &await_tree::Registry {
589        &self.await_tree_reg
590    }
591
592    pub fn shared_actor_infos(&self) -> &SharedActorInfos {
593        &self.shared_actor_info
594    }
595}
596
597#[cfg(any(test, feature = "test"))]
598impl MetaSrvEnv {
599    // Instance for test.
600    pub async fn for_test() -> Self {
601        Self::for_test_opts(MetaOpts::test(false), |_| ()).await
602    }
603
604    pub async fn for_test_opts(
605        opts: MetaOpts,
606        on_test_system_params: impl FnOnce(&mut risingwave_pb::meta::PbSystemParams),
607    ) -> Self {
608        let mut system_params = risingwave_common::system_param::system_params_for_test();
609        on_test_system_params(&mut system_params);
610        Self::new(
611            opts,
612            system_params,
613            Default::default(),
614            SqlMetaStore::for_test().await,
615        )
616        .await
617        .unwrap()
618    }
619}