From ab9e98a9ca95458af9125f4cf244c15de2cf7f7f Mon Sep 17 00:00:00 2001 From: Zhengchao An Date: Sat, 27 Jun 2026 17:14:25 +0800 Subject: [PATCH] refactor: align core runtime facade helpers (#3948) --- docs/architecture/migration-progress.md | 96 ++++++++++++++++--- .../admin/handlers/audit_runtime_config.rs | 6 +- rustfs/src/admin/handlers/config_admin.rs | 6 +- rustfs/src/admin/handlers/kms_dynamic.rs | 8 +- rustfs/src/admin/handlers/oidc.rs | 8 +- rustfs/src/admin/runtime_sources.rs | 26 ++--- rustfs/src/admin/service/config.rs | 10 +- rustfs/src/admin/service/site_replication.rs | 4 +- rustfs/src/app/context.rs | 24 +---- rustfs/src/app/context/runtime_sources.rs | 8 +- rustfs/src/app/runtime_sources.rs | 9 +- rustfs/src/app/storage_api.rs | 4 - rustfs/src/auth.rs | 12 +-- rustfs/src/config/info.rs | 6 +- rustfs/src/init.rs | 6 +- rustfs/src/protocols/client.rs | 4 +- rustfs/src/runtime_sources.rs | 35 ++++--- rustfs/src/server/runtime_sources.rs | 19 ++-- rustfs/src/startup_runtime_sources.rs | 8 +- rustfs/src/storage/mod.rs | 6 +- rustfs/src/storage/runtime_sources.rs | 26 ++--- rustfs/src/storage/storage_api.rs | 8 +- rustfs/src/workload_admission.rs | 4 +- 23 files changed, 193 insertions(+), 150 deletions(-) diff --git a/docs/architecture/migration-progress.md b/docs/architecture/migration-progress.md index 2ec288de3..4efcd2f99 100644 --- a/docs/architecture/migration-progress.md +++ b/docs/architecture/migration-progress.md @@ -5,7 +5,7 @@ Status values: `[ ]` not started, `[~]` in progress, `[x]` complete, `[!]` block ## Current Context - Issue: [`rustfs/backlog#660`](https://github.com/rustfs/backlog/issues/660) -- Branch: `overtrue/arch-global-app-runtime-consumer-batch` +- Branch: `overtrue/arch-runtime-object-store-fallback-removal` - Baseline: completed `C-011/C-012/C-013/API-055/API-059/API-079/API-080/API-081/API-082/API-083/API-084/API-085/API-086/API-087/API-088/API-089/API-090/API-091/API-092/API-093/API-094/API-095/API-096/API-097/API-098/API-099/API-100/API-101/API-102/API-103/API-104/API-105/API-106/API-107/API-108/API-109/API-110/API-111/API-112/API-113/API-114/API-115/API-116/API-117/API-118/API-119/API-120/API-121/API-122/API-123/API-124/API-125/API-126/API-127/API-128/API-129/API-130/API-131/API-132/API-133/API-134/API-135/API-136/API-137/API-138/API-139/API-140/API-141/API-142/API-143/API-144/API-145/API-146/API-147/API-148/API-149/API-150/API-151/API-152/API-153/API-154/API-155/API-156/API-157/API-158/API-159/API-160/API-161/API-162/API-163/API-164/API-165/API-166/API-167/API-168/API-169/API-170/API-171/API-172/API-173/API-174/API-175/API-176/API-177/API-178/API-179/API-180/API-181/API-182/API-183/API-184/API-185/API-186/API-187/API-188/API-189/API-190/API-191/API-192/API-193/API-194/API-195/API-196/API-197/API-198/API-199/API-200/API-201/API-202/API-203/API-204/API-205/API-206/API-207/API-208/API-209/API-210/API-211/API-212/API-213/API-214/API-215/API-216/API-217/API-218/API-219/API-220/API-221/API-222/API-223/API-224/API-225/API-226/API-227/API-228/API-229/API-230/API-231/API-232/API-233/API-234/API-235/API-236/API-237/API-238/API-239/API-240/API-241/API-242/API-243/API-244/API-245/API-246/API-247/API-248/API-249/API-250/API-251/API-252/API-253/API-254/CTX-002`. - Current baseline also includes API-255 from PR #3923, API-256 from PR #3925, CFG-009 from PR #3927, C-007/C-009 from PR #3935, C-008/C-010 @@ -14,19 +14,23 @@ Status values: `[ ]` not started, `[~]` in progress, `[x]` complete, `[!]` block GLOB-005/CRATE-001/CRATE-002 from PR #3939, GLOB-006 from PR #3941, the first GLOB-007 admin runtime context handoff from PR #3942, and the GLOB-007 admin object-store/notification/server-config consumer batch from - PR #3943, the GLOB-007 admin runtime helper alias batch from PR #3944, and - the GLOB-007 storage/server runtime facade consumer batch from PR #3946. -- Current phase PR: GLOB-007 app runtime facade consumer batch. -- Based on: `origin/main` after PR #3946 merged. + PR #3943, the GLOB-007 admin runtime helper alias batch from PR #3944, the + GLOB-007 storage/server runtime facade consumer batch from PR #3946, the + GLOB-007 app runtime facade consumer batch from PR #3947, the pending + GLOB-007 core runtime facade consumer batch from PR #3948, and the + GLOB-007 runtime facade alias sweep merged into that base branch from + PR #3949. +- Current phase PR: GLOB-007 object-store fallback removal. +- Based on: `overtrue/arch-global-core-runtime-consumer-batch` while PR #3948 + is pending. - PR type for this branch: `ci-gate`. -- Runtime behavior changes: none intended. -- Rust code changes: expose app runtime facade aliases as `current_*` and route - bucket, admin, object, multipart, select-object, and lifecycle test - consumers through those names while keeping the underlying root resolvers and - fallback behavior unchanged. +- Runtime behavior changes: object-store access now requires AppContext instead + of falling back to the legacy global object layer. +- Rust code changes: remove the legacy global object-store fallback from the + AppContext object-store resolver family. - CI/script changes: none intended. -- Docs changes: update this progress ledger for the app runtime facade consumer - batch. +- Docs changes: update this progress ledger for the object-store fallback + removal. ## Phase 0 Tasks @@ -2797,9 +2801,18 @@ Status values: `[ ]` not started, `[~]` in progress, `[x]` complete, `[!]` block - Current slice: expose app runtime-source facade reads as `current_*` aliases and move app bucket/admin/object/multipart/select-object consumers plus the lifecycle transition test off direct resolver names. - - Remaining work: remove one fallback family per PR only after scans prove no - production caller depends on it; this slice keeps the fallback behavior - because broader app/storage/server consumers still use the root resolvers. + - Current slice: expose root runtime-source facade reads as `current_*` + aliases and move auth, init, startup, protocols, config info, and workload + admission consumers off direct resolver names. + - Current slice: expose the remaining root runtime-source `current_*` + aliases, route admin/app/server/storage facade modules through alias names, + and move admin context-aware object-store, notification-system, and + server-config consumers off direct resolver names. + - Current slice: remove the legacy global object-store fallback from the + AppContext object-store resolver family after production consumers were + routed through current runtime facade helpers. + - Remaining work: remove the next fallback family per PR only after scans + prove no production caller depends on it. - Verification: focused RustFS compile and admin test-target compile, resolver residual scan, formatting, diff hygiene, architecture guard, Rust risk scan, and full PR gate. @@ -6066,6 +6079,15 @@ Status values: `[ ]` not started, `[~]` in progress, `[x]` complete, `[!]` block | Expert | Status | Notes | |---|---|---| +| Quality/architecture | pass | GLOB-007 removes the object-store resolver family's legacy global fallback and keeps object-store access behind AppContext-backed current runtime facades. | +| Migration preservation | pass | All production object-store consumers resolve through admin, app, server, storage, or root current-runtime helpers; absent AppContext now returns `None` instead of consulting the legacy object layer. | +| Testing/verification | pass | Focused RustFS compile, formatting, architecture guard, object-store fallback residual scan, diff hygiene, and diff-added Rust risk scan are required before the full PR gate. | +| Quality/architecture | pass | GLOB-007 exposes the remaining root runtime-source `current_*` aliases and routes admin, app, server, and storage facade modules plus admin context-aware consumers through alias names. | +| Migration preservation | pass | The alias sweep delegates to the same root AppContext-first resolvers, so object-store, notification-system, server-config, KMS, IAM, endpoint, tier, scanner, lock, and metrics behavior stays unchanged. | +| Testing/verification | pass | Focused RustFS compile, formatting, architecture guard, facade residual scan, diff hygiene, and diff-added Rust risk scan are required before the full PR gate. | +| Quality/architecture | pass | GLOB-007 adds root runtime-source `current_*` aliases for core consumers and moves auth, init, startup, protocols, config info, and workload admission callers off direct resolver names. | +| Migration preservation | pass | The aliases delegate to the same root AppContext-first resolvers, so owner credentials, IAM ready lookup, notification startup, region selection, TLS generation, replication pool, buffer config, and workload admission behavior stay unchanged. | +| Testing/verification | pass | Focused RustFS compile, formatting, architecture guard, core resolver residual scan, diff hygiene, and diff-added Rust risk scan are required before the full PR gate. | | Quality/architecture | pass | GLOB-007 exposes app runtime-source facade reads as `current_*` aliases and moves bucket, admin, object, multipart, select-object, and lifecycle test consumers off direct resolver names. | | Migration preservation | pass | The aliases delegate to the same root runtime resolvers, so AppContext object-store selection, notification dispatch, expiry/tier handles, endpoint snapshots, encryption service, and S3 Select DB behavior stay unchanged. | | Testing/verification | pass | Focused RustFS compile, formatting, architecture guard, app resolver residual scan, diff hygiene, and diff-added Rust risk scan are required before the full PR gate. | @@ -6438,6 +6460,50 @@ Status values: `[ ]` not started, `[~]` in progress, `[x]` complete, `[!]` block Passed before push: +- Issue #660 GLOB-007 object-store fallback removal: + - Branch freshness check: rebased onto + `origin/overtrue/arch-global-core-runtime-consumer-batch` after PR #3949 + merged into that base branch; full PR gate passed before the rebase. + - `cargo check -p rustfs --lib`: passed. + - `cargo fmt --all`: passed. + - `cargo fmt --all --check`: passed. + - `git diff --check`: passed. + - `./scripts/check_architecture_migration_rules.sh`: passed. + - Object-store fallback residual scan: passed. + - Diff-added Rust risk scan: passed. + - Three-expert review: passed. + - `make pre-pr`: passed (`nextest`: 6917 passed, 112 skipped; doctests + passed). + +- Issue #660 GLOB-007 runtime facade alias sweep: + - Branch freshness check: created from + `overtrue/arch-global-core-runtime-consumer-batch` while PR #3948 is + pending. + - `cargo check -p rustfs --lib`: passed. + - `cargo fmt --all`: passed. + - `cargo fmt --all --check`: passed. + - `git diff --check`: passed. + - `./scripts/check_architecture_migration_rules.sh`: passed. + - Runtime facade resolver residual scan: passed. + - Diff-added Rust risk scan: passed. + - Three-expert review: passed. + - `make pre-pr`: passed (`nextest`: 6917 passed, 112 skipped; doctests + passed). + +- Issue #660 GLOB-007 core runtime facade consumer slice: + - Branch freshness check: rebased onto `origin/main` after PR #3947 merged. + - `cargo check -p rustfs --lib`: passed. + - `cargo fmt --all`: passed. + - `cargo fmt --all --check`: passed. + - `git diff --check`: passed. + - `./scripts/check_architecture_migration_rules.sh`: passed. + - Core runtime resolver residual scan: passed. + - Diff-added Rust risk scan: passed; no new production unwrap/expect, + panic/todo/dbg, or ad-hoc stdout/stderr. + - Three-expert review: passed. + - `make pre-pr`: passed, including 6912 nextest tests passed, 112 skipped, + and doctests. + - Issue #660 GLOB-007 app runtime facade consumer slice: - Branch freshness check: rebased onto `origin/main` after PR #3946 merged. - `cargo check -p rustfs --lib`: passed. diff --git a/rustfs/src/admin/handlers/audit_runtime_config.rs b/rustfs/src/admin/handlers/audit_runtime_config.rs index 679a913d3..5f038c118 100644 --- a/rustfs/src/admin/handlers/audit_runtime_config.rs +++ b/rustfs/src/admin/handlers/audit_runtime_config.rs @@ -13,7 +13,7 @@ // limitations under the License. use crate::admin::handlers::target_descriptor::AdminTargetSpec; -use crate::admin::runtime_sources::{AppContext, current_app_context, resolve_object_store_handle_for_context}; +use crate::admin::runtime_sources::{AppContext, current_app_context, current_object_store_handle_for_context}; use crate::admin::storage_api::config::{read_admin_config_without_migrate, save_admin_server_config}; use rustfs_audit::{audit_system, start_audit_system as start_global_audit_system, system::AuditSystemState}; use rustfs_config::DEFAULT_DELIMITER; @@ -21,7 +21,7 @@ use rustfs_config::server_config::Config; use s3s::{S3Result, s3_error}; pub(crate) async fn load_server_config_from_store_for_context(context: Option<&AppContext>) -> S3Result { - let Some(store) = resolve_object_store_handle_for_context(context) else { + let Some(store) = current_object_store_handle_for_context(context) else { return Ok(Config::new()); }; @@ -88,7 +88,7 @@ async fn update_audit_config_and_reload_for_context( where F: FnMut(&mut Config) -> bool, { - let Some(store) = resolve_object_store_handle_for_context(context) else { + let Some(store) = current_object_store_handle_for_context(context) else { return Err(s3_error!(InternalError, "server storage not initialized")); }; diff --git a/rustfs/src/admin/handlers/config_admin.rs b/rustfs/src/admin/handlers/config_admin.rs index dbafc7d7c..0ce0a69aa 100644 --- a/rustfs/src/admin/handlers/config_admin.rs +++ b/rustfs/src/admin/handlers/config_admin.rs @@ -15,7 +15,7 @@ use crate::admin::auth::validate_admin_request; use crate::admin::router::{AdminOperation, Operation, S3Router}; use crate::admin::runtime_sources::{ - current_app_context, publish_server_config, resolve_object_store_handle_for_context, resolve_server_config_for_context, + current_app_context, current_object_store_handle_for_context, current_server_config_for_context, publish_server_config, }; use crate::admin::service::config::{ apply_dynamic_config_for_subsystem, is_dynamic_config_subsystem, signal_config_snapshot_reload, signal_dynamic_config_reload, @@ -712,7 +712,7 @@ fn success_response(config_applied: bool) -> S3Result S3Result> { let context = current_app_context(); - resolve_object_store_handle_for_context(context.as_deref()) + current_object_store_handle_for_context(context.as_deref()) .ok_or_else(|| s3_error!(InternalError, "server storage not initialized")) } @@ -730,7 +730,7 @@ async fn load_active_server_config() -> S3Result { } let context = current_app_context(); - resolve_server_config_for_context(context.as_deref()) + current_server_config_for_context(context.as_deref()) .ok_or_else(|| s3_error!(InternalError, "server config is not initialized")) } diff --git a/rustfs/src/admin/handlers/kms_dynamic.rs b/rustfs/src/admin/handlers/kms_dynamic.rs index 3b1c8c6b1..28625ad9f 100644 --- a/rustfs/src/admin/handlers/kms_dynamic.rs +++ b/rustfs/src/admin/handlers/kms_dynamic.rs @@ -17,8 +17,8 @@ use crate::admin::auth::validate_admin_request; use crate::admin::router::{AdminOperation, Operation, S3Router}; use crate::admin::runtime_sources::{ - current_app_context, current_kms_runtime_service_manager, current_or_init_kms_runtime_service_manager, - resolve_object_store_handle_for_context, + current_app_context, current_kms_runtime_service_manager, current_object_store_handle_for_context, + current_or_init_kms_runtime_service_manager, }; use crate::admin::storage_api::config::{read_admin_config, save_admin_config}; use crate::auth::{check_key_valid, get_session_token}; @@ -107,7 +107,7 @@ fn normalize_configure_request_auth( #[instrument(skip(config))] async fn save_kms_config(config: &KmsConfig) -> Result<(), String> { let context = current_app_context(); - let Some(store) = resolve_object_store_handle_for_context(context.as_deref()) else { + let Some(store) = current_object_store_handle_for_context(context.as_deref()) else { return Err("Storage layer not initialized".to_string()); }; @@ -132,7 +132,7 @@ async fn save_kms_config(config: &KmsConfig) -> Result<(), String> { #[instrument] pub async fn load_kms_config() -> Option { let context = current_app_context(); - let Some(store) = resolve_object_store_handle_for_context(context.as_deref()) else { + let Some(store) = current_object_store_handle_for_context(context.as_deref()) else { warn!( component = LOG_COMPONENT_ADMIN, subsystem = LOG_SUBSYSTEM_KMS, diff --git a/rustfs/src/admin/handlers/oidc.rs b/rustfs/src/admin/handlers/oidc.rs index 5e57d1cf5..98b91c0aa 100644 --- a/rustfs/src/admin/handlers/oidc.rs +++ b/rustfs/src/admin/handlers/oidc.rs @@ -16,7 +16,7 @@ use super::sts::create_oidc_sts_credentials; use crate::admin::auth::validate_admin_request; use crate::admin::router::{AdminOperation, Operation, S3Router}; use crate::admin::runtime_sources::{ - current_app_context, current_oidc_handle, resolve_object_store_handle_for_context, resolve_server_config_for_context, + current_app_context, current_object_store_handle_for_context, current_oidc_handle, current_server_config_for_context, }; use crate::admin::storage_api::config::{read_admin_config_without_migrate, save_admin_server_config}; use crate::auth::{check_key_valid, get_session_token}; @@ -795,7 +795,7 @@ fn json_response(status: StatusCode, payload: &T) -> S3Result S3Result { let context = current_app_context(); - let Some(store) = resolve_object_store_handle_for_context(context.as_deref()) else { + let Some(store) = current_object_store_handle_for_context(context.as_deref()) else { return Err(s3_error!(InternalError, "storage layer not initialized")); }; @@ -806,7 +806,7 @@ async fn load_server_config_from_store() -> S3Result { async fn save_server_config_to_store(config: &ServerConfig) -> S3Result<()> { let context = current_app_context(); - let Some(store) = resolve_object_store_handle_for_context(context.as_deref()) else { + let Some(store) = current_object_store_handle_for_context(context.as_deref()) else { return Err(s3_error!(InternalError, "storage layer not initialized")); }; @@ -831,7 +831,7 @@ fn provider_instance_key(provider_id: &str) -> String { fn oidc_restart_required(config: &ServerConfig) -> bool { let context = current_app_context(); - let active_config = resolve_server_config_for_context(context.as_deref()); + let active_config = current_server_config_for_context(context.as_deref()); oidc_restart_required_from_active_config(config, active_config.as_ref()) } diff --git a/rustfs/src/admin/runtime_sources.rs b/rustfs/src/admin/runtime_sources.rs index 824d9d603..0b178ff84 100644 --- a/rustfs/src/admin/runtime_sources.rs +++ b/rustfs/src/admin/runtime_sources.rs @@ -18,19 +18,13 @@ pub(crate) use crate::app::admin_usecase::{ }; use crate::app::object_usecase::DefaultObjectUsecase; pub(crate) use crate::runtime_sources::{ - AppContext, publish_server_config, publish_storage_class_config, resolve_action_credentials as current_action_credentials, - resolve_boot_time as current_boot_time, resolve_bucket_metadata_handle as current_bucket_metadata_handle, - resolve_bucket_monitor_handle as current_bucket_monitor_handle, resolve_daily_tier_stats as current_daily_tier_stats, - resolve_deployment_id as current_deployment_id, resolve_endpoints_handle as current_endpoints_handle, - resolve_iam_handle as current_iam_handle, resolve_kms_runtime_service_manager as current_kms_runtime_service_manager, - resolve_notification_system_for_context, resolve_object_store_handle_for_context, resolve_oidc_handle as current_oidc_handle, - resolve_or_init_kms_runtime_service_manager as current_or_init_kms_runtime_service_manager, - resolve_outbound_tls_generation as current_outbound_tls_generation, resolve_outbound_tls_state as current_outbound_tls_state, - resolve_ready_iam_handle as current_ready_iam_handle, resolve_region as current_region, - resolve_replication_pool_handle as current_replication_pool_handle, - resolve_replication_stats_handle as current_replication_stats_handle, resolve_runtime_port as current_runtime_port, - resolve_scanner_metrics_report as current_scanner_metrics_report, resolve_server_config_for_context, - resolve_tier_config_handle as current_tier_config_handle, resolve_token_signing_key as current_token_signing_key, + AppContext, current_action_credentials, current_boot_time, current_bucket_metadata_handle, current_bucket_monitor_handle, + current_daily_tier_stats, current_deployment_id, current_endpoints_handle, current_iam_handle, + current_kms_runtime_service_manager, current_notification_system_for_context, current_object_store_handle_for_context, + current_oidc_handle, current_or_init_kms_runtime_service_manager, current_outbound_tls_generation, + current_outbound_tls_state, current_ready_iam_handle, current_region, current_replication_pool_handle, + current_replication_stats_handle, current_runtime_port, current_scanner_metrics_report, current_server_config_for_context, + current_tier_config_handle, current_token_signing_key, publish_server_config, publish_storage_class_config, }; use rustfs_config::server_config::Config; use std::sync::Arc; @@ -52,15 +46,15 @@ pub(crate) fn current_app_context() -> Option> { pub(crate) fn current_object_store_handle() -> Option> { let context = current_app_context(); - resolve_object_store_handle_for_context(context.as_deref()) + current_object_store_handle_for_context(context.as_deref()) } pub(crate) fn current_notification_system() -> Option<&'static NotificationSys> { let context = current_app_context(); - resolve_notification_system_for_context(context.as_deref()) + current_notification_system_for_context(context.as_deref()) } pub(crate) fn current_server_config() -> Option { let context = current_app_context(); - resolve_server_config_for_context(context.as_deref()) + current_server_config_for_context(context.as_deref()) } diff --git a/rustfs/src/admin/service/config.rs b/rustfs/src/admin/service/config.rs index 6ce3177fd..85222e6b6 100644 --- a/rustfs/src/admin/service/config.rs +++ b/rustfs/src/admin/service/config.rs @@ -13,8 +13,8 @@ // limitations under the License. use crate::admin::runtime_sources::{ - AppContext, current_app_context, publish_server_config, publish_storage_class_config, - resolve_notification_system_for_context, resolve_object_store_handle_for_context, + AppContext, current_app_context, current_notification_system_for_context, current_object_store_handle_for_context, + publish_server_config, publish_storage_class_config, }; use crate::admin::storage_api::config::{STORAGE_CLASS_SUB_SYS, read_admin_config_without_migrate, storageclass}; use crate::admin::storage_api::contract::admin::StorageAdminApi; @@ -68,7 +68,7 @@ fn invalid_request(message: impl Into) -> S3Error { } fn resolve_runtime_config_store_for_context(context: Option<&AppContext>) -> S3Result> { - resolve_object_store_handle_for_context(context).ok_or_else(|| internal_error("storage layer not initialized")) + current_object_store_handle_for_context(context).ok_or_else(|| internal_error("storage layer not initialized")) } async fn apply_storage_class_runtime_config_for_context(context: Option<&AppContext>, config: &ServerConfig) -> S3Result<()> { @@ -372,7 +372,7 @@ pub async fn signal_dynamic_config_reload_for_context(context: Option<&AppContex return; } - let Some(notification_sys) = resolve_notification_system_for_context(context) else { + let Some(notification_sys) = current_notification_system_for_context(context) else { return; }; @@ -389,7 +389,7 @@ pub async fn signal_dynamic_config_reload(sub_system: &str) { } pub async fn signal_config_snapshot_reload_for_context(context: Option<&AppContext>) { - let Some(notification_sys) = resolve_notification_system_for_context(context) else { + let Some(notification_sys) = current_notification_system_for_context(context) else { return; }; diff --git a/rustfs/src/admin/service/site_replication.rs b/rustfs/src/admin/service/site_replication.rs index 0fbc6afa9..74c5ff859 100644 --- a/rustfs/src/admin/service/site_replication.rs +++ b/rustfs/src/admin/service/site_replication.rs @@ -12,7 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -use crate::admin::runtime_sources::{AppContext, current_app_context, resolve_object_store_handle_for_context}; +use crate::admin::runtime_sources::{AppContext, current_app_context, current_object_store_handle_for_context}; use crate::admin::site_replication_identity::{deployment_id_for_endpoint, normalize_peer_map_by_identity_with}; use crate::admin::storage_api::config::{read_admin_config, save_admin_config}; use crate::admin::storage_api::error::Error as StorageError; @@ -91,7 +91,7 @@ fn normalize_site_replication_state_json(data: &[u8]) -> Result>, /// RustFS does not currently keep a separate in-memory cache for this state, /// so "reload" means validating that the persisted JSON is readable. pub async fn reload_site_replication_runtime_state_for_context(context: Option<&AppContext>) -> S3Result<()> { - let Some(store) = resolve_object_store_handle_for_context(context) else { + let Some(store) = current_object_store_handle_for_context(context) else { return Err(S3Error::with_message(S3ErrorCode::InternalError, "Not init".to_string())); }; diff --git a/rustfs/src/app/context.rs b/rustfs/src/app/context.rs index 906415313..1ff741f04 100644 --- a/rustfs/src/app/context.rs +++ b/rustfs/src/app/context.rs @@ -116,11 +116,9 @@ pub fn resolve_object_store_handle() -> Option> { resolve_object_store_handle_for_context(context.as_deref()) } -/// Resolve object store handle using an explicit AppContext, falling back to the legacy global object layer. +/// Resolve object store handle using an explicit AppContext. pub fn resolve_object_store_handle_for_context(context: Option<&AppContext>) -> Option> { - context - .map(|context| context.object_store()) - .or_else(runtime_sources::object_store) + context.map(|context| context.object_store()) } /// Resolve notify interface using AppContext-first precedence. @@ -436,9 +434,9 @@ where #[cfg(test)] fn resolve_object_store_handle_with( context: Option>, - fallback: impl FnOnce() -> Option>, + _fallback: impl FnOnce() -> Option>, ) -> Option> { - context.map(|context| context.object_store()).or_else(fallback) + context.map(|context| context.object_store()) } fn resolve_endpoints_handle_with( @@ -940,11 +938,6 @@ mod tests { } async fn test_store() -> (TempDir, Arc, EndpointServerPools) { - if let Some(store) = runtime_sources::object_store() { - let endpoints = EndpointServerPools(store.pools.iter().map(|pool| pool.endpoints.clone()).collect()); - return (tempfile::tempdir().expect("compat test temp dir"), store, endpoints); - } - let temp_dir = tempfile::tempdir().expect("test temp dir"); let disk_paths = (0..4) .map(|index| temp_dir.path().join(format!("disk{index}"))) @@ -973,10 +966,6 @@ mod tests { }; let endpoint_pools = EndpointServerPools(vec![pool_endpoints]); - if let Some(store) = runtime_sources::object_store() { - return (temp_dir, store, endpoint_pools); - } - init_local_disks(endpoint_pools.clone()).await.expect("test local disks"); let store = ECStore::new( "127.0.0.1:0".parse().expect("test addr"), @@ -1326,10 +1315,7 @@ mod tests { &resolve_bucket_metadata_handle_with(None, || Some(bucket_metadata.clone())).expect("fallback bucket metadata"), &bucket_metadata )); - assert!(Arc::ptr_eq( - &resolve_object_store_handle_with(None, || Some(object_store.clone())).expect("fallback object store"), - &object_store - )); + assert!(resolve_object_store_handle_with(None, || Some(object_store.clone())).is_none()); assert!(Arc::ptr_eq( &resolve_replication_stats_handle_with(None, || Some(fallback_replication_stats.clone())) .expect("fallback replication stats"), diff --git a/rustfs/src/app/context/runtime_sources.rs b/rustfs/src/app/context/runtime_sources.rs index 9ad6408d6..16d4f4c0f 100644 --- a/rustfs/src/app/context/runtime_sources.rs +++ b/rustfs/src/app/context/runtime_sources.rs @@ -12,15 +12,15 @@ // See the License for the specific language governing permissions and // limitations under the License. +use super::super::storage_api::context::EndpointServerPools; use super::super::storage_api::context::bucket::metadata_sys::BucketMetadataSys; use super::super::storage_api::context::runtime::{ BucketBandwidthMonitor, DailyAllTierStats, DynReplicationPool, ExpiryState, NotificationSys, ReplicationStats, ScannerMetricsReport, StorageClassConfig, TierConfigMgr, collect_scanner_metrics_report, get_daily_all_tier_stats, get_global_boot_time, get_global_bucket_monitor, get_global_deployment_id, get_global_endpoints_opt, get_global_expiry_state, get_global_lock_client, get_global_lock_clients, get_global_notification_sys, get_global_region, get_global_replication_pool, - get_global_replication_stats, get_global_tier_config_mgr, global_rustfs_port, new_object_layer_fn, set_global_storage_class, + get_global_replication_stats, get_global_tier_config_mgr, global_rustfs_port, set_global_storage_class, }; -use super::super::storage_api::context::{ECStore, EndpointServerPools}; use crate::config::{RustFSBufferConfig, get_global_buffer_config}; use rustfs_config::server_config::{Config, get_global_server_config, set_global_server_config}; use rustfs_credentials::{Credentials, get_global_action_cred}; @@ -205,7 +205,3 @@ pub fn set_storage_class(config: StorageClassConfig) { pub fn buffer_config() -> RustFSBufferConfig { get_global_buffer_config().clone() } - -pub fn object_store() -> Option> { - new_object_layer_fn() -} diff --git a/rustfs/src/app/runtime_sources.rs b/rustfs/src/app/runtime_sources.rs index 15d673b40..94bb2e86e 100644 --- a/rustfs/src/app/runtime_sources.rs +++ b/rustfs/src/app/runtime_sources.rs @@ -13,16 +13,13 @@ // limitations under the License. pub(crate) use crate::runtime_sources::{ - AppContext, resolve_encryption_service as current_encryption_service, resolve_endpoints_handle as current_endpoints_handle, - resolve_expiry_state_handle as current_expiry_state_handle, resolve_notification_system as current_notification_system, - resolve_notify_interface_for_context as current_notify_interface_for_context, - resolve_object_store_handle_for_context as current_object_store_handle_for_context, - resolve_s3select_db as current_s3select_db, + AppContext, current_encryption_service, current_endpoints_handle, current_expiry_state_handle, current_notification_system, + current_notify_interface_for_context, current_object_store_handle_for_context, current_s3select_db, }; use std::sync::Arc; #[cfg(test)] -pub(crate) use crate::runtime_sources::resolve_tier_config_handle as current_tier_config_handle; +pub(crate) use crate::runtime_sources::current_tier_config_handle; pub(crate) fn current_app_context() -> Option> { crate::runtime_sources::current_app_context() diff --git a/rustfs/src/app/storage_api.rs b/rustfs/src/app/storage_api.rs index 44894b592..7d6a0d717 100644 --- a/rustfs/src/app/storage_api.rs +++ b/rustfs/src/app/storage_api.rs @@ -171,10 +171,6 @@ pub(crate) mod runtime { crate::storage::storage_api::get_global_expiry_state() } - pub(crate) fn new_object_layer_fn() -> Option> { - crate::storage::storage_api::new_object_layer_fn() - } - pub(crate) fn set_object_store_resolver(resolver: Arc) -> bool { crate::storage::storage_api::set_object_store_resolver(resolver) } diff --git a/rustfs/src/auth.rs b/rustfs/src/auth.rs index 002a578e8..1aff4172b 100644 --- a/rustfs/src/auth.rs +++ b/rustfs/src/auth.rs @@ -12,7 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -use crate::runtime_sources::resolve_action_credentials; +use crate::runtime_sources::{current_action_credentials, current_ready_iam_handle}; use http::HeaderMap; use http::Uri; use rustfs_credentials::Credentials; @@ -186,7 +186,7 @@ impl S3Auth for IAMAuth { return Ok(key); } - if let Ok(iam_store) = crate::runtime_sources::resolve_ready_iam_handle() { + if let Ok(iam_store) = current_ready_iam_handle() { // Use check_key instead of get_user to ensure user is loaded from disk if not in cache // This is important for newly created users that may not be in cache yet. // check_key will automatically attempt to load the user from disk if not found in cache. @@ -331,7 +331,7 @@ pub async fn check_key_valid(session_token: &str, access_key: &str) -> S3Result< return Err(s3_error!(InvalidAccessKeyId, "Keystone authentication requires X-Auth-Token header")); } - let Some(mut cred) = resolve_action_credentials() else { + let Some(mut cred) = current_action_credentials() else { return Err(S3Error::with_message( S3ErrorCode::InternalError, format!("get_global_action_cred {:?}", IamError::IamSysNotInitialized), @@ -341,7 +341,7 @@ pub async fn check_key_valid(session_token: &str, access_key: &str) -> S3Result< let sys_cred = cred.clone(); if !constant_time_eq(&cred.access_key, access_key) { - let Ok(iam_store) = crate::runtime_sources::resolve_ready_iam_handle() else { + let Ok(iam_store) = current_ready_iam_handle() else { return Err(S3Error::with_message( S3ErrorCode::InternalError, format!("check_key_valid {:?}", IamError::IamSysNotInitialized), @@ -435,7 +435,7 @@ pub fn check_claims_from_token(token: &str, cred: &Credentials) -> S3Result ConfigInfoJson { let workload_profile = { use super::workload_profiles::is_buffer_profile_enabled; if is_buffer_profile_enabled() { - let config = resolve_buffer_config(); + let config = current_buffer_config(); let profile = config.workload_profile(); let buffer_config = profile.config(); Some(WorkloadProfileJson { @@ -870,7 +870,7 @@ fn get_workload_profile_info() -> String { return "| Workload Profile | (disabled) |".to_string(); } - let config = resolve_buffer_config(); + let config = current_buffer_config(); let profile = config.workload_profile(); let name = config.workload_name(); let buffer_config = profile.config(); diff --git a/rustfs/src/init.rs b/rustfs/src/init.rs index 2909bee23..a4a5b8a31 100644 --- a/rustfs/src/init.rs +++ b/rustfs/src/init.rs @@ -12,7 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -use crate::runtime_sources::{resolve_notify_interface, resolve_region}; +use crate::runtime_sources::{current_notify_interface, current_region}; use crate::server::ShutdownHandle; use crate::storage_api::startup::init::{ get_bucket_notification_config, process_lambda_configurations, process_queue_configurations, process_topic_configurations, @@ -158,7 +158,7 @@ fn arn_to_target_id(arn_str: &str) -> Result) { - let global_region = resolve_region(); + let global_region = current_region(); let region = global_region .as_ref() .filter(|r| !r.as_str().is_empty()) @@ -244,7 +244,7 @@ pub async fn add_bucket_notification_configuration(buckets: Vec) { ); } - if let Err(e) = resolve_notify_interface() + if let Err(e) = current_notify_interface() .add_event_specific_rules(bucket, region, &event_rules) .await .map_err(|e| s3_error!(InternalError, "Failed to add rules: {e}")) diff --git a/rustfs/src/protocols/client.rs b/rustfs/src/protocols/client.rs index 5e9f27dad..f7854f78e 100644 --- a/rustfs/src/protocols/client.rs +++ b/rustfs/src/protocols/client.rs @@ -12,7 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -use crate::runtime_sources::resolve_action_credentials; +use crate::runtime_sources::current_action_credentials; use crate::storage_api::protocols::client::{FS, ReqInfo, RequestContext}; use http::{HeaderMap, Method}; use percent_encoding::{AsciiSet, CONTROLS, utf8_percent_encode}; @@ -140,7 +140,7 @@ impl ProtocolStorageClient { ) -> S3Result> { let mut extensions = http::Extensions::default(); - let is_owner = if let Some(global_cred) = resolve_action_credentials() { + let is_owner = if let Some(global_cred) = current_action_credentials() { params.access_key == global_cred.access_key } else { false diff --git a/rustfs/src/runtime_sources.rs b/rustfs/src/runtime_sources.rs index a4804e0a1..91c1cefde 100644 --- a/rustfs/src/runtime_sources.rs +++ b/rustfs/src/runtime_sources.rs @@ -17,17 +17,30 @@ use std::sync::Arc; pub(crate) use context::{ AppContext, NotifyInterface, publish_oidc_handle, publish_server_config, publish_storage_class_config, - resolve_action_credentials, resolve_boot_time, resolve_bucket_metadata_handle, resolve_bucket_monitor_handle, - resolve_buffer_config, resolve_daily_tier_stats, resolve_deployment_id, resolve_encryption_service, resolve_endpoints_handle, - resolve_expiry_state_handle, resolve_iam_handle, resolve_iam_ready, resolve_internode_metrics, - resolve_kms_runtime_service_manager, resolve_local_node_name, resolve_lock_client, resolve_lock_clients_handle, - resolve_notification_system, resolve_notification_system_for_context, resolve_notify_interface, - resolve_notify_interface_for_context, resolve_object_store_handle, resolve_object_store_handle_for_context, - resolve_oidc_handle, resolve_or_init_kms_runtime_service_manager, resolve_outbound_tls_generation, - resolve_outbound_tls_state, resolve_performance_metrics, resolve_ready_iam_handle, resolve_region, - resolve_replication_pool_handle, resolve_replication_stats_handle, resolve_runtime_port, resolve_s3select_db, - resolve_scanner_metrics_report, resolve_server_config, resolve_server_config_for_context, resolve_tier_config_handle, - resolve_token_signing_key, + resolve_action_credentials as current_action_credentials, resolve_boot_time as current_boot_time, + resolve_bucket_metadata_handle as current_bucket_metadata_handle, + resolve_bucket_monitor_handle as current_bucket_monitor_handle, resolve_buffer_config as current_buffer_config, + resolve_daily_tier_stats as current_daily_tier_stats, resolve_deployment_id as current_deployment_id, + resolve_encryption_service as current_encryption_service, resolve_endpoints_handle as current_endpoints_handle, + resolve_expiry_state_handle as current_expiry_state_handle, resolve_iam_handle as current_iam_handle, + resolve_iam_ready as current_iam_ready, resolve_internode_metrics as current_internode_metrics, + resolve_kms_runtime_service_manager as current_kms_runtime_service_manager, + resolve_local_node_name as current_local_node_name, resolve_lock_client as current_lock_client, + resolve_lock_clients_handle as current_lock_clients_handle, resolve_notification_system as current_notification_system, + resolve_notification_system_for_context as current_notification_system_for_context, + resolve_notify_interface as current_notify_interface, + resolve_notify_interface_for_context as current_notify_interface_for_context, + resolve_object_store_handle as current_object_store_handle, + resolve_object_store_handle_for_context as current_object_store_handle_for_context, + resolve_oidc_handle as current_oidc_handle, + resolve_or_init_kms_runtime_service_manager as current_or_init_kms_runtime_service_manager, + resolve_outbound_tls_generation as current_outbound_tls_generation, resolve_outbound_tls_state as current_outbound_tls_state, + resolve_performance_metrics as current_performance_metrics, resolve_ready_iam_handle as current_ready_iam_handle, + resolve_region as current_region, resolve_replication_pool_handle as current_replication_pool_handle, + resolve_replication_stats_handle as current_replication_stats_handle, resolve_runtime_port as current_runtime_port, + resolve_s3select_db as current_s3select_db, resolve_scanner_metrics_report as current_scanner_metrics_report, + resolve_server_config as current_server_config, resolve_server_config_for_context as current_server_config_for_context, + resolve_tier_config_handle as current_tier_config_handle, resolve_token_signing_key as current_token_signing_key, }; #[cfg(test)] diff --git a/rustfs/src/server/runtime_sources.rs b/rustfs/src/server/runtime_sources.rs index 84fa2e882..e16dbb2ea 100644 --- a/rustfs/src/server/runtime_sources.rs +++ b/rustfs/src/server/runtime_sources.rs @@ -12,10 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -use crate::runtime_sources::{ - NotifyInterface, resolve_endpoints_handle, resolve_iam_ready, resolve_kms_runtime_service_manager, - resolve_lock_clients_handle, resolve_notify_interface, resolve_object_store_handle, resolve_server_config, -}; +use crate::runtime_sources::NotifyInterface; use crate::storage_api::server::runtime_sources::{ECStore, EndpointServerPools}; use rustfs_kms::KmsServiceManager; use rustfs_lock::LockClient; @@ -23,29 +20,29 @@ use std::collections::HashMap; use std::sync::Arc; pub(crate) fn current_kms_runtime_service_manager() -> Option> { - resolve_kms_runtime_service_manager() + crate::runtime_sources::current_kms_runtime_service_manager() } pub(crate) fn current_server_config() -> Option { - resolve_server_config() + crate::runtime_sources::current_server_config() } pub(crate) fn current_notify_interface() -> Arc { - resolve_notify_interface() + crate::runtime_sources::current_notify_interface() } pub(crate) fn current_object_store_handle() -> Option> { - resolve_object_store_handle() + crate::runtime_sources::current_object_store_handle() } pub(crate) fn current_iam_ready() -> bool { - resolve_iam_ready() + crate::runtime_sources::current_iam_ready() } pub(crate) fn current_endpoints_handle() -> Option { - resolve_endpoints_handle() + crate::runtime_sources::current_endpoints_handle() } pub(crate) fn current_lock_clients_handle() -> Option>> { - resolve_lock_clients_handle() + crate::runtime_sources::current_lock_clients_handle() } diff --git a/rustfs/src/startup_runtime_sources.rs b/rustfs/src/startup_runtime_sources.rs index 08f5326db..3f507721e 100644 --- a/rustfs/src/startup_runtime_sources.rs +++ b/rustfs/src/startup_runtime_sources.rs @@ -13,7 +13,9 @@ // limitations under the License. use crate::config::RustFSBufferConfig; -use crate::runtime_sources::{resolve_outbound_tls_generation, resolve_replication_pool_handle}; +use crate::runtime_sources::{ + current_outbound_tls_generation as runtime_current_outbound_tls_generation, current_replication_pool_handle, +}; use crate::storage_api::startup::runtime_sources::{DynReplicationPool, set_global_region, set_global_rustfs_port}; use rustfs_kms::KmsServiceManager; use rustfs_obs::{GlobalError as ObservabilityError, OtelGuard}; @@ -73,7 +75,7 @@ pub(crate) fn init_metrics_runtime(ctx: CancellationToken) { } pub(crate) fn replication_pool_handle() -> Option> { - resolve_replication_pool_handle() + current_replication_pool_handle() } pub(crate) fn set_put_stage_metrics_enabled(enabled: bool) { @@ -89,7 +91,7 @@ pub(crate) fn init_tls_metrics() { } pub(crate) fn current_outbound_tls_generation() -> u64 { - resolve_outbound_tls_generation().0 + runtime_current_outbound_tls_generation().0 } pub(crate) async fn publish_outbound_tls_state(generation: TlsGeneration, outbound: &OutboundTlsMaterial) { diff --git a/rustfs/src/storage/mod.rs b/rustfs/src/storage/mod.rs index 4d802f62f..d4cbb7ce5 100644 --- a/rustfs/src/storage/mod.rs +++ b/rustfs/src/storage/mod.rs @@ -73,9 +73,9 @@ pub(crate) use storage_api::{ global_rustfs_port, head_prefix_consumer, helper_consumer, init_background_replication, init_bucket_metadata_sys, init_ecstore_config, init_global_config_sys, init_local_disks, init_lock_clients, is_all_buckets_not_found, is_dist_erasure, is_err_bucket_not_found, is_err_object_not_found, is_err_version_not_found, is_valid_storage_class, load_bucket_metadata, - new_global_notification_sys, new_object_layer_fn, options_consumer, prewarm_local_disk_id_map, read_config, - record_replication_proxy, register_event_dispatch_hook, reload_transition_tier_config, replication_queue_current_count, - rpc_consumer, runtime_sources_consumer, s3_api_consumer, save_config, serialize, set_bucket_metadata, set_global_endpoints, + new_global_notification_sys, options_consumer, prewarm_local_disk_id_map, read_config, record_replication_proxy, + register_event_dispatch_hook, reload_transition_tier_config, replication_queue_current_count, rpc_consumer, + runtime_sources_consumer, s3_api_consumer, save_config, serialize, set_bucket_metadata, set_global_endpoints, set_global_region, set_global_rustfs_port, set_object_store_resolver, set_workload_admission_snapshot_provider, shutdown_background_services, table_catalog_path_hash, to_s3s_etag, topology_snapshot_from_endpoint_pools_with_capabilities, try_migrate_bucket_metadata, try_migrate_iam_config, try_migrate_server_config, update_bucket_metadata_config, diff --git a/rustfs/src/storage/runtime_sources.rs b/rustfs/src/storage/runtime_sources.rs index 6c1c7276c..920ca3de5 100644 --- a/rustfs/src/storage/runtime_sources.rs +++ b/rustfs/src/storage/runtime_sources.rs @@ -29,53 +29,53 @@ pub(crate) fn current_app_context() -> Option> { } pub(crate) fn current_object_store_handle() -> Option> { - root_runtime_sources::resolve_object_store_handle() + root_runtime_sources::current_object_store_handle() } pub(crate) fn current_object_store_handle_for_context(context: Option<&AppContext>) -> Option> { - root_runtime_sources::resolve_object_store_handle_for_context(context) + root_runtime_sources::current_object_store_handle_for_context(context) } pub(crate) fn current_buffer_config() -> RustFSBufferConfig { - root_runtime_sources::resolve_buffer_config() + root_runtime_sources::current_buffer_config() } pub(crate) fn current_internode_metrics() -> Arc { - root_runtime_sources::resolve_internode_metrics() + root_runtime_sources::current_internode_metrics() } pub(crate) async fn current_local_node_name() -> String { - root_runtime_sources::resolve_local_node_name().await + root_runtime_sources::current_local_node_name().await } pub(crate) fn current_action_credentials() -> Option { - root_runtime_sources::resolve_action_credentials() + root_runtime_sources::current_action_credentials() } pub(crate) fn current_notify_interface() -> Arc { - root_runtime_sources::resolve_notify_interface() + root_runtime_sources::current_notify_interface() } pub(crate) fn current_performance_metrics() -> Arc { - root_runtime_sources::resolve_performance_metrics() + root_runtime_sources::current_performance_metrics() } pub(crate) async fn current_encryption_service() -> Option> { - root_runtime_sources::resolve_encryption_service().await + root_runtime_sources::current_encryption_service().await } pub(crate) fn current_region() -> Option { - root_runtime_sources::resolve_region() + root_runtime_sources::current_region() } pub(crate) fn current_ready_iam_handle() -> IamResult>> { - root_runtime_sources::resolve_ready_iam_handle() + root_runtime_sources::current_ready_iam_handle() } pub(crate) fn current_iam_handle() -> Option>> { - root_runtime_sources::resolve_iam_handle() + root_runtime_sources::current_iam_handle() } pub(crate) fn current_lock_client() -> Option> { - root_runtime_sources::resolve_lock_client() + root_runtime_sources::current_lock_client() } diff --git a/rustfs/src/storage/storage_api.rs b/rustfs/src/storage/storage_api.rs index 7481dfe04..4fc9bf9c1 100644 --- a/rustfs/src/storage/storage_api.rs +++ b/rustfs/src/storage/storage_api.rs @@ -378,8 +378,8 @@ pub(crate) mod ecstore_global { pub(crate) use rustfs_ecstore::api::global::{ GLOBAL_BOOT_TIME, GLOBAL_TierConfigMgr, get_global_bucket_monitor, get_global_deployment_id, get_global_endpoints_opt, get_global_lock_client, get_global_lock_clients, get_global_region, get_global_tier_config_mgr, global_rustfs_port, - is_dist_erasure, new_object_layer_fn, set_global_endpoints, set_global_region, set_global_rustfs_port, - set_object_store_resolver, shutdown_background_services, update_erasure_type, + is_dist_erasure, set_global_endpoints, set_global_region, set_global_rustfs_port, set_object_store_resolver, + shutdown_background_services, update_erasure_type, }; } @@ -1111,10 +1111,6 @@ pub(crate) fn get_global_tier_config_mgr() -> Arc Option> { - ecstore_global::new_object_layer_fn() -} - pub(crate) fn set_object_store_resolver(resolver: Arc) -> bool { ecstore_global::set_object_store_resolver(resolver) } diff --git a/rustfs/src/workload_admission.rs b/rustfs/src/workload_admission.rs index 65deaa02a..319b6a39a 100644 --- a/rustfs/src/workload_admission.rs +++ b/rustfs/src/workload_admission.rs @@ -12,7 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -use crate::runtime_sources::resolve_replication_pool_handle; +use crate::runtime_sources::current_replication_pool_handle; use crate::storage_api::workload::admission::{bucket_metadata_runtime_initialized, replication_queue_current_count}; use rustfs_concurrency::{ AdmissionState, WorkloadAdmissionRegistrySnapshot, WorkloadAdmissionSnapshot, WorkloadAdmissionSnapshotProvider, @@ -175,7 +175,7 @@ fn repair_workload_admission_snapshot_from_counts( } pub fn replication_workload_admission_snapshot() -> WorkloadAdmissionSnapshot { - let Some(pool) = resolve_replication_pool_handle() else { + let Some(pool) = current_replication_pool_handle() else { return replication_workload_admission_snapshot_from_counts(false, None, None); };