chore: wrap standalone runtime with trait (#8083)

* chore: introduce standalone start service trait

Signed-off-by: shuiyisong <xixing.sys@gmail.com>

* chore: add region server to the trait

Signed-off-by: shuiyisong <xixing.sys@gmail.com>

* chore: add comments

Signed-off-by: shuiyisong <xixing.sys@gmail.com>

---------

Signed-off-by: shuiyisong <xixing.sys@gmail.com>
This commit is contained in:
shuiyisong
2026-05-11 18:06:29 +08:00
committed by GitHub
parent dc5fab93a8
commit 7279e48e22
2 changed files with 151 additions and 17 deletions

View File

@@ -163,6 +163,7 @@ pub struct DatanodeBuilder {
kv_backend: KvBackendRef,
cache_registry: Option<Arc<LayeredCacheRegistry>>,
topic_stats_reporter: Option<Box<dyn TopicStatsReporter>>,
open_regions_writable_override: Option<bool>,
#[cfg(feature = "enterprise")]
extension_range_provider_factory: Option<mito2::extension::BoxedExtensionRangeProviderFactory>,
}
@@ -176,6 +177,7 @@ impl DatanodeBuilder {
meta_client: None,
kv_backend,
cache_registry: None,
open_regions_writable_override: None,
#[cfg(feature = "enterprise")]
extension_range_provider_factory: None,
topic_stats_reporter: None,
@@ -205,6 +207,20 @@ impl DatanodeBuilder {
self
}
/// Overrides whether regions opened during datanode startup should become writable.
///
/// When unset, the builder uses its default writable policy for reopened regions
/// (writable only when no metasrv client is configured).
///
/// Warning: setting this to `true` on a metasrv-controlled datanode (one built
/// with `with_meta_client`) will promote regions to Leader before heartbeat and
/// lease coordination begin, bypassing the metasrv safety contract and creating a
/// potential split-brain window during startup.
pub fn with_open_regions_writable_override(&mut self, writable: bool) -> &mut Self {
self.open_regions_writable_override = Some(writable);
self
}
#[cfg(feature = "enterprise")]
pub fn with_extension_range_provider(
&mut self,
@@ -274,10 +290,13 @@ impl DatanodeBuilder {
let region_open_requests =
build_region_open_requests(node_id, self.kv_backend.clone()).await?;
let open_with_writable = self
.open_regions_writable_override
.unwrap_or(!controlled_by_metasrv);
let open_all_regions = open_all_regions(
region_server.clone(),
region_open_requests,
!controlled_by_metasrv,
open_with_writable,
self.opts.init_regions_parallelism,
// Ignore nonexistent regions in recovery mode.
is_recovery_mode,