From 2c857216549c7d064c93a235a042f0d48510287f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AE=89=E6=AD=A3=E8=B6=85?= Date: Thu, 26 Feb 2026 20:41:11 +0800 Subject: [PATCH] refactor(app): centralize context resolvers for admin/server paths (#1975) --- rustfs/src/admin/handlers/pools.rs | 4 +-- rustfs/src/admin/handlers/quota.rs | 6 ++--- rustfs/src/admin/handlers/tier.rs | 24 ++++++----------- rustfs/src/admin/handlers/trace.rs | 4 +-- rustfs/src/app/context.rs | 34 ++++++++++++++++++++++++ rustfs/src/server/audit.rs | 7 ++--- rustfs/src/server/event.rs | 7 ++--- rustfs/src/storage/objects/put_object.rs | 6 ++--- 8 files changed, 55 insertions(+), 37 deletions(-) diff --git a/rustfs/src/admin/handlers/pools.rs b/rustfs/src/admin/handlers/pools.rs index 5f6839f90..9c3d385cc 100644 --- a/rustfs/src/admin/handlers/pools.rs +++ b/rustfs/src/admin/handlers/pools.rs @@ -27,7 +27,7 @@ use crate::{ router::{AdminOperation, Operation, S3Router}, }, app::admin_usecase::{DefaultAdminUsecase, QueryPoolStatusRequest}, - app::context::get_global_app_context, + app::context::resolve_endpoints_handle, auth::{check_key_valid, get_session_token}, error::ApiError, server::{ADMIN_PREFIX, RemoteAddr}, @@ -36,7 +36,7 @@ use hyper::Method; use rustfs_ecstore::new_object_layer_fn; fn endpoints_from_context() -> Option { - get_global_app_context().and_then(|context| context.endpoints().handle()) + resolve_endpoints_handle() } pub fn register_pool_route(r: &mut S3Router) -> std::io::Result<()> { diff --git a/rustfs/src/admin/handlers/quota.rs b/rustfs/src/admin/handlers/quota.rs index 623bae8a7..3f9cce4ab 100644 --- a/rustfs/src/admin/handlers/quota.rs +++ b/rustfs/src/admin/handlers/quota.rs @@ -16,7 +16,7 @@ use crate::admin::auth::{validate_admin_request, validate_admin_request_with_bucket}; use crate::admin::router::{AdminOperation, Operation, S3Router}; -use crate::app::context::get_global_app_context; +use crate::app::context::{resolve_bucket_metadata_handle, resolve_object_store_handle}; use crate::auth::{check_key_valid, get_session_token}; use crate::server::ADMIN_PREFIX; use hyper::{Method, StatusCode}; @@ -86,11 +86,11 @@ pub struct GetBucketQuotaStatsHandler; pub struct CheckBucketQuotaHandler; fn bucket_metadata_from_context() -> Option>> { - get_global_app_context().and_then(|context| context.bucket_metadata().handle()) + resolve_bucket_metadata_handle() } async fn current_usage_from_context(bucket: &str) -> u64 { - let Some(store) = get_global_app_context().map(|context| context.object_store()) else { + let Some(store) = resolve_object_store_handle() else { return 0; }; diff --git a/rustfs/src/admin/handlers/tier.rs b/rustfs/src/admin/handlers/tier.rs index 4b1a01e48..01cb001f0 100644 --- a/rustfs/src/admin/handlers/tier.rs +++ b/rustfs/src/admin/handlers/tier.rs @@ -18,7 +18,7 @@ use crate::{ auth::validate_admin_request, router::{AdminOperation, Operation, S3Router}, }, - app::context::{default_tier_config_interface, get_global_app_context}, + app::context::resolve_tier_config_handle, auth::{check_key_valid, get_session_token}, server::{ADMIN_PREFIX, RemoteAddr}, }; @@ -45,17 +45,9 @@ use s3s::{ s3_error, }; use serde_urlencoded::from_bytes; -use std::sync::Arc; use time::OffsetDateTime; -use tokio::sync::RwLock; use tracing::{debug, warn}; -fn tier_config_mgr_from_context() -> Arc> { - get_global_app_context() - .map(|context| context.tier_config().handle()) - .unwrap_or_else(|| default_tier_config_interface().handle()) -} - #[derive(Debug, Clone, serde::Deserialize, Default)] pub struct AddTierQuery { #[serde(rename = "accessKey")] @@ -214,7 +206,7 @@ impl Operation for AddTier { &_ => (), } - let tier_config_mgr_handle = tier_config_mgr_from_context(); + let tier_config_mgr_handle = resolve_tier_config_handle(); let mut tier_config_mgr = tier_config_mgr_handle.write().await; //tier_config_mgr.reload(api); if let Err(err) = tier_config_mgr.add(args, force).await { @@ -307,7 +299,7 @@ impl Operation for EditTier { let tier_name = params.get("tiername").map(|s| s.to_string()).unwrap_or_default(); - let tier_config_mgr_handle = tier_config_mgr_from_context(); + let tier_config_mgr_handle = resolve_tier_config_handle(); let mut tier_config_mgr = tier_config_mgr_handle.write().await; //tier_config_mgr.reload(api); if let Err(err) = tier_config_mgr.edit(&tier_name, creds).await { @@ -375,7 +367,7 @@ impl Operation for ListTiers { ) .await?; - let tier_config_mgr_handle = tier_config_mgr_from_context(); + let tier_config_mgr_handle = resolve_tier_config_handle(); let tier_config_mgr = tier_config_mgr_handle.read().await; let tiers = tier_config_mgr.list_tiers(); @@ -431,7 +423,7 @@ impl Operation for RemoveTier { let tier_name = params.get("tiername").map(|s| s.to_string()).unwrap_or_default(); - let tier_config_mgr_handle = tier_config_mgr_from_context(); + let tier_config_mgr_handle = resolve_tier_config_handle(); let mut tier_config_mgr = tier_config_mgr_handle.write().await; //tier_config_mgr.reload(api); if let Err(err) = tier_config_mgr.remove(&tier_name, force).await { @@ -492,7 +484,7 @@ impl Operation for VerifyTier { ) .await?; - let tier_config_mgr_handle = tier_config_mgr_from_context(); + let tier_config_mgr_handle = resolve_tier_config_handle(); let mut tier_config_mgr = tier_config_mgr_handle.write().await; tier_config_mgr.verify(&query.tier.unwrap()).await; @@ -534,7 +526,7 @@ impl Operation for GetTierInfo { } }; - let tier_config_mgr_handle = tier_config_mgr_from_context(); + let tier_config_mgr_handle = resolve_tier_config_handle(); let tier_config_mgr = tier_config_mgr_handle.read().await; let info = tier_config_mgr.get(&query.tier.unwrap()); @@ -601,7 +593,7 @@ impl Operation for ClearTier { return Err(s3_error!(InvalidRequest, "get rand failed")); }; - let tier_config_mgr_handle = tier_config_mgr_from_context(); + let tier_config_mgr_handle = resolve_tier_config_handle(); let mut tier_config_mgr = tier_config_mgr_handle.write().await; //tier_config_mgr.reload(api); if let Err(err) = tier_config_mgr.clear_tier(force).await { diff --git a/rustfs/src/admin/handlers/trace.rs b/rustfs/src/admin/handlers/trace.rs index 777330782..22b4a4b4a 100644 --- a/rustfs/src/admin/handlers/trace.rs +++ b/rustfs/src/admin/handlers/trace.rs @@ -13,7 +13,7 @@ // limitations under the License. use crate::admin::router::Operation; -use crate::app::context::get_global_app_context; +use crate::app::context::resolve_endpoints_handle; use http::StatusCode; use hyper::Uri; use matchit::Params; @@ -43,7 +43,7 @@ impl Operation for Trace { let _trace_opts = extract_trace_options(&req.uri)?; // let (tx, rx) = mpsc::channel(10000); - let _peers = match get_global_app_context().and_then(|context| context.endpoints().handle()) { + let _peers = match resolve_endpoints_handle() { Some(ep) => PeerRestClient::new_clients(ep.clone()).await, None => (Vec::new(), Vec::new()), }; diff --git a/rustfs/src/app/context.rs b/rustfs/src/app/context.rs index b1df0b866..8280a4e5a 100644 --- a/rustfs/src/app/context.rs +++ b/rustfs/src/app/context.rs @@ -326,6 +326,40 @@ pub fn resolve_kms_runtime_service_manager() -> Option> { .or_else(|| default_kms_runtime_interface().service_manager()) } +/// Resolve bucket metadata handle using AppContext-first precedence. +pub fn resolve_bucket_metadata_handle() -> Option>> { + get_global_app_context() + .and_then(|context| context.bucket_metadata().handle()) + .or_else(|| default_bucket_metadata_interface().handle()) +} + +/// Resolve object store handle from AppContext. +pub fn resolve_object_store_handle() -> Option> { + get_global_app_context().map(|context| context.object_store()) +} + +/// Resolve endpoints using AppContext-first precedence. +pub fn resolve_endpoints_handle() -> Option { + get_global_app_context() + .and_then(|context| context.endpoints().handle()) + .or_else(|| default_endpoints_interface().handle()) +} + +/// Resolve tier config handle using AppContext-first precedence. +pub fn resolve_tier_config_handle() -> Arc> { + get_global_app_context() + .map(|context| context.tier_config().handle()) + .unwrap_or_else(|| default_tier_config_interface().handle()) +} + +/// Resolve server config using AppContext-first precedence. +pub fn resolve_server_config() -> Option { + match get_global_app_context() { + Some(context) => context.server_config().get(), + None => default_server_config_interface().get(), + } +} + pub fn default_bucket_metadata_interface() -> Arc { Arc::new(BucketMetadataHandle) } diff --git a/rustfs/src/server/audit.rs b/rustfs/src/server/audit.rs index c423ae087..98105be0a 100644 --- a/rustfs/src/server/audit.rs +++ b/rustfs/src/server/audit.rs @@ -12,16 +12,13 @@ // See the License for the specific language governing permissions and // limitations under the License. -use crate::app::context::{default_server_config_interface, get_global_app_context}; +use crate::app::context::resolve_server_config; use rustfs_audit::{AuditError, AuditResult, audit_system, init_audit_system, system::AuditSystemState}; use rustfs_config::DEFAULT_DELIMITER; use tracing::{info, warn}; fn server_config_from_context() -> Option { - match get_global_app_context() { - Some(context) => context.server_config().get(), - None => default_server_config_interface().get(), - } + resolve_server_config() } /// Start the audit system. diff --git a/rustfs/src/server/event.rs b/rustfs/src/server/event.rs index a3a22720d..ae84d5ce2 100644 --- a/rustfs/src/server/event.rs +++ b/rustfs/src/server/event.rs @@ -12,15 +12,12 @@ // See the License for the specific language governing permissions and // limitations under the License. -use crate::app::context::{default_server_config_interface, get_global_app_context}; +use crate::app::context::resolve_server_config; use rustfs_config::DEFAULT_DELIMITER; use tracing::{error, info, instrument, warn}; fn server_config_from_context() -> Option { - match get_global_app_context() { - Some(context) => context.server_config().get(), - None => default_server_config_interface().get(), - } + resolve_server_config() } /// Shuts down the event notifier system gracefully diff --git a/rustfs/src/storage/objects/put_object.rs b/rustfs/src/storage/objects/put_object.rs index 101d677ae..ba7b5b406 100644 --- a/rustfs/src/storage/objects/put_object.rs +++ b/rustfs/src/storage/objects/put_object.rs @@ -12,7 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -use crate::app::context::{default_bucket_metadata_interface, get_global_app_context}; +use crate::app::context::resolve_bucket_metadata_handle; use crate::error::ApiError; use crate::storage::concurrency::get_concurrency_manager; use crate::storage::helper::OperationHelper; @@ -53,9 +53,7 @@ use tokio_util::io::StreamReader; use tracing::{debug, error, instrument, warn}; fn bucket_metadata_for_quota() -> Option>> { - get_global_app_context() - .and_then(|context| context.bucket_metadata().handle()) - .or_else(|| default_bucket_metadata_interface().handle()) + resolve_bucket_metadata_handle() } impl Objects {