mito2/worker/
handle_create.rs1use common_telemetry::info;
18use store_api::logstore::LogStore;
19use store_api::metadata::RegionMetadataBuilder;
20use store_api::region_request::{AffectedRows, RegionCreateRequest};
21use store_api::storage::RegionId;
22
23use crate::error::Result;
24use crate::region::opener::{RegionOpener, check_recovered_region};
25#[cfg(feature = "hdfs-object-store")]
26use crate::temp_file_sweeper;
27use crate::worker::RegionWorkerLoop;
28
29impl<S: LogStore> RegionWorkerLoop<S> {
30 pub(crate) async fn handle_create_request(
31 &mut self,
32 region_id: RegionId,
33 request: RegionCreateRequest,
34 ) -> Result<AffectedRows> {
35 if let Some(region) = self.regions.get_region(region_id) {
37 check_recovered_region(
39 ®ion.metadata(),
40 region_id,
41 &request.column_metadatas,
42 &request.primary_key,
43 )?;
44
45 return Ok(0);
46 }
47
48 let mut builder = RegionMetadataBuilder::new(region_id);
50 for column in request.column_metadatas {
51 builder.push_column_metadata(column);
52 }
53 builder.primary_key(request.primary_key);
54 if let Some(expr_json) = request.partition_expr_json.as_ref() {
55 builder.partition_expr_json(Some(expr_json.clone()));
56 }
57
58 let requirements = request.requirements;
60 let opener = RegionOpener::new(
61 region_id,
62 &request.table_dir,
63 request.path_type,
64 self.memtable_builder_provider.clone(),
65 self.object_store_manager.clone(),
66 self.purge_scheduler.clone(),
67 self.puffin_manager_factory.clone(),
68 self.intermediate_manager.clone(),
69 self.time_provider.clone(),
70 self.file_ref_manager.clone(),
71 self.partition_expr_fetcher.clone(),
72 )
73 .metadata_builder(builder)
74 .parse_options(request.options)?
75 .cache(Some(self.cache_manager.clone()))
76 .series_index_store(self.series_index_store.clone())
77 .series_index_purger(self.series_index_purger.clone())
78 .hook(self.plugins.get());
79
80 opener.ensure_region_requirements(requirements)?;
81
82 let region = opener.create_or_open(&self.config, &self.wal).await?;
83
84 #[cfg(feature = "hdfs-object-store")]
87 temp_file_sweeper::spawn_region_sweep(
88 region.access_layer(),
89 region_id,
90 self.config.gc.unknown_file_lingering_time,
91 self.sweep_limiter.clone(),
92 );
93
94 info!(
95 "A new region created with requirement {:?}, worker: {}, region: {:?}",
96 requirements,
97 self.id,
98 region.metadata()
99 );
100
101 self.region_count.inc();
102
103 if let Some(hook) = region.manifest_ctx.hook() {
106 hook.on_region_opened(region_id, ®ion.metadata()).await;
107 }
108
109 self.node_lease.seed(®ion.leader_deadline);
111 self.register_region(region);
113 if let Some(state) = &self.series_index_task_state {
114 state.wake();
115 }
116
117 Ok(0)
118 }
119}