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};
25use crate::worker::RegionWorkerLoop;
26
27impl<S: LogStore> RegionWorkerLoop<S> {
28 pub(crate) async fn handle_create_request(
29 &mut self,
30 region_id: RegionId,
31 request: RegionCreateRequest,
32 ) -> Result<AffectedRows> {
33 if let Some(region) = self.regions.get_region(region_id) {
35 check_recovered_region(
37 ®ion.metadata(),
38 region_id,
39 &request.column_metadatas,
40 &request.primary_key,
41 )?;
42
43 return Ok(0);
44 }
45
46 let mut builder = RegionMetadataBuilder::new(region_id);
48 for column in request.column_metadatas {
49 builder.push_column_metadata(column);
50 }
51 builder.primary_key(request.primary_key);
52 if let Some(expr_json) = request.partition_expr_json.as_ref() {
53 builder.partition_expr_json(Some(expr_json.clone()));
54 }
55
56 let requirements = request.requirements;
58 let opener = RegionOpener::new(
59 region_id,
60 &request.table_dir,
61 request.path_type,
62 self.memtable_builder_provider.clone(),
63 self.object_store_manager.clone(),
64 self.purge_scheduler.clone(),
65 self.puffin_manager_factory.clone(),
66 self.intermediate_manager.clone(),
67 self.time_provider.clone(),
68 self.file_ref_manager.clone(),
69 self.partition_expr_fetcher.clone(),
70 )
71 .metadata_builder(builder)
72 .parse_options(request.options)?
73 .cache(Some(self.cache_manager.clone()))
74 .hook(self.plugins.get());
75
76 opener.ensure_region_requirements(requirements)?;
77
78 let region = opener.create_or_open(&self.config, &self.wal).await?;
79
80 info!(
81 "A new region created with requirement {:?}, worker: {}, region: {:?}",
82 requirements,
83 self.id,
84 region.metadata()
85 );
86
87 self.region_count.inc();
88
89 self.regions.insert_region(region);
91
92 Ok(0)
93 }
94}