1use std::collections::HashMap;
16use std::sync::Arc;
17
18use api::v1::meta::ProcedureDetailResponse;
19use common_telemetry::tracing_context::W3cTrace;
20use store_api::storage::{RegionId, RegionNumber, TableId};
21
22use crate::cache_invalidator::CacheInvalidatorRef;
23use crate::ddl::flow_meta::FlowMetadataAllocatorRef;
24use crate::ddl::table_meta::TableMetadataAllocatorRef;
25use crate::error::{Result, UnsupportedSnafu};
26use crate::key::flow::FlowMetadataManagerRef;
27use crate::key::table_route::PhysicalTableRouteValue;
28use crate::key::TableMetadataManagerRef;
29use crate::node_manager::NodeManagerRef;
30use crate::region_keeper::MemoryRegionKeeperRef;
31use crate::region_registry::LeaderRegionRegistryRef;
32use crate::rpc::ddl::{SubmitDdlTaskRequest, SubmitDdlTaskResponse};
33use crate::rpc::procedure::{
34 AddRegionFollowerRequest, MigrateRegionRequest, MigrateRegionResponse, ProcedureStateResponse,
35 RemoveRegionFollowerRequest,
36};
37use crate::DatanodeId;
38
39pub mod alter_database;
40pub mod alter_logical_tables;
41pub mod alter_table;
42pub mod create_database;
43pub mod create_flow;
44pub mod create_logical_tables;
45pub mod create_table;
46mod create_table_template;
47pub mod create_view;
48pub mod drop_database;
49pub mod drop_flow;
50pub mod drop_table;
51pub mod drop_view;
52pub mod flow_meta;
53pub mod table_meta;
54#[cfg(any(test, feature = "testing"))]
55pub mod test_util;
56#[cfg(test)]
57pub(crate) mod tests;
58pub mod truncate_table;
59pub mod utils;
60
61#[derive(Debug, Default)]
62pub struct ExecutorContext {
63 pub tracing_context: Option<W3cTrace>,
64}
65
66#[async_trait::async_trait]
68pub trait ProcedureExecutor: Send + Sync {
69 async fn submit_ddl_task(
71 &self,
72 ctx: &ExecutorContext,
73 request: SubmitDdlTaskRequest,
74 ) -> Result<SubmitDdlTaskResponse>;
75
76 async fn add_region_follower(
78 &self,
79 _ctx: &ExecutorContext,
80 _request: AddRegionFollowerRequest,
81 ) -> Result<()> {
82 UnsupportedSnafu {
83 operation: "add_region_follower",
84 }
85 .fail()
86 }
87
88 async fn remove_region_follower(
90 &self,
91 _ctx: &ExecutorContext,
92 _request: RemoveRegionFollowerRequest,
93 ) -> Result<()> {
94 UnsupportedSnafu {
95 operation: "remove_region_follower",
96 }
97 .fail()
98 }
99
100 async fn migrate_region(
102 &self,
103 ctx: &ExecutorContext,
104 request: MigrateRegionRequest,
105 ) -> Result<MigrateRegionResponse>;
106
107 async fn query_procedure_state(
109 &self,
110 ctx: &ExecutorContext,
111 pid: &str,
112 ) -> Result<ProcedureStateResponse>;
113
114 async fn list_procedures(&self, ctx: &ExecutorContext) -> Result<ProcedureDetailResponse>;
115}
116
117pub type ProcedureExecutorRef = Arc<dyn ProcedureExecutor>;
118
119#[derive(Default)]
121pub struct TableMetadata {
122 pub table_id: TableId,
124 pub table_route: PhysicalTableRouteValue,
126 pub region_wal_options: HashMap<RegionNumber, String>,
129}
130
131pub type RegionFailureDetectorControllerRef = Arc<dyn RegionFailureDetectorController>;
132
133pub type DetectingRegion = (DatanodeId, RegionId);
134
135#[async_trait::async_trait]
139pub trait RegionFailureDetectorController: Send + Sync {
140 async fn register_failure_detectors(&self, detecting_regions: Vec<DetectingRegion>);
142
143 async fn deregister_failure_detectors(&self, detecting_regions: Vec<DetectingRegion>);
145}
146
147#[derive(Debug, Clone)]
149pub struct NoopRegionFailureDetectorControl;
150
151#[async_trait::async_trait]
152impl RegionFailureDetectorController for NoopRegionFailureDetectorControl {
153 async fn register_failure_detectors(&self, _detecting_regions: Vec<DetectingRegion>) {}
154
155 async fn deregister_failure_detectors(&self, _detecting_regions: Vec<DetectingRegion>) {}
156}
157
158#[derive(Clone)]
160pub struct DdlContext {
161 pub node_manager: NodeManagerRef,
163 pub cache_invalidator: CacheInvalidatorRef,
165 pub memory_region_keeper: MemoryRegionKeeperRef,
167 pub leader_region_registry: LeaderRegionRegistryRef,
169 pub table_metadata_manager: TableMetadataManagerRef,
171 pub table_metadata_allocator: TableMetadataAllocatorRef,
173 pub flow_metadata_manager: FlowMetadataManagerRef,
175 pub flow_metadata_allocator: FlowMetadataAllocatorRef,
177 pub region_failure_detector_controller: RegionFailureDetectorControllerRef,
179}
180
181impl DdlContext {
182 pub async fn register_failure_detectors(&self, detecting_regions: Vec<DetectingRegion>) {
187 self.region_failure_detector_controller
188 .register_failure_detectors(detecting_regions)
189 .await;
190 }
191
192 async fn deregister_failure_detectors(&self, detecting_regions: Vec<DetectingRegion>) {
197 self.region_failure_detector_controller
198 .deregister_failure_detectors(detecting_regions)
199 .await;
200 }
201}