refactor: centralize root runtime sources (#3846)

This commit is contained in:
Zhengchao An
2026-06-25 13:19:52 +08:00
committed by GitHub
parent 1c4bcd4372
commit 46fa28f542
21 changed files with 148 additions and 49 deletions
+24 -6
View File
@@ -5,9 +5,9 @@ Status values: `[ ]` not started, `[~]` in progress, `[x]` complete, `[!]` block
## Current Context ## Current Context
- Issue: [`rustfs/backlog#660`](https://github.com/rustfs/backlog/issues/660) - Issue: [`rustfs/backlog#660`](https://github.com/rustfs/backlog/issues/660)
- Branch: `overtrue/arch-admin-runtime-sources-batch` - Branch: `overtrue/arch-root-runtime-sources-batch`
- 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`. - 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`.
- Based on: `origin/main` after PR #3843. - Based on: stacked on PR #3845 head while PR #3845 is pending.
- PR type for this branch: `consumer-migration` - PR type for this branch: `consumer-migration`
- Runtime behavior changes: none. - Runtime behavior changes: none.
- Rust code changes: route replication pool, outbound TLS generation, runtime - Rust code changes: route replication pool, outbound TLS generation, runtime
@@ -45,7 +45,7 @@ Status values: `[ ]` not started, `[~]` in progress, `[x]` complete, `[!]` block
readiness-time, observability, metrics, buffer, and TLS runtime source readiness-time, observability, metrics, buffer, and TLS runtime source
helpers, plus server readiness/audit/event/module-switch runtime source helpers, plus server readiness/audit/event/module-switch runtime source
helpers, storage request/RPC/SSE runtime source helpers, and admin helpers, storage request/RPC/SSE runtime source helpers, and admin
handler/service/router runtime source helpers, handler/service/router runtime source helpers, plus root auth/init/config/protocol/workload, app usecase, and storage node-service runtime source helpers,
through AppContext-first or owner-crate resolver boundaries. through AppContext-first or owner-crate resolver boundaries.
- CI/script changes: lock completed owner and test/fuzz boundaries against - CI/script changes: lock completed owner and test/fuzz boundaries against
bare/glob imports, scattered raw ECStore facade subpaths, and startup bare/glob imports, scattered raw ECStore facade subpaths, and startup
@@ -56,8 +56,8 @@ Status values: `[ ]` not started, `[~]` in progress, `[x]` complete, `[!]` block
event-bridge thin module regressions, plus IAM runtime-source bypasses; event-bridge thin module regressions, plus IAM runtime-source bypasses;
accept the reviewed AppContext resolver reverse dependencies in the layer accept the reviewed AppContext resolver reverse dependencies in the layer
baseline, and block direct admin AppContext resolver consumers outside the baseline, and block direct admin AppContext resolver consumers outside the
admin runtime-source boundary. admin runtime-source boundary, and block root, app usecase, and storage direct AppContext resolver consumers outside their runtime-source boundaries.
- Docs changes: record the API-136 through API-205 owner facade and lifecycle - Docs changes: record the API-136 through API-206 owner facade and lifecycle
runtime-source cleanup. runtime-source cleanup.
## Phase 0 Tasks ## Phase 0 Tasks
@@ -4954,6 +4954,21 @@ Status values: `[ ]` not started, `[~]` in progress, `[x]` complete, `[!]` block
layer guards, diff hygiene, residual direct AppContext scan, Rust risk layer guards, diff hygiene, residual direct AppContext scan, Rust risk
scan, fast PR gate, and full PR gate before PR. scan, fast PR gate, and full PR gate before PR.
- [x] `API-206` Centralize root, app, and storage RPC runtime source readers.
- Do: route root auth/init/config/protocol/workload consumers, app usecase
consumers, and storage node-service runtime resolver consumers through
root, app, or storage runtime-source boundaries.
- Acceptance: migrated root/app/storage consumers no longer import AppContext
resolvers directly, and migration rules reject reintroducing those direct
resolver reads outside the owner runtime-source modules.
- Must preserve: request credential lookup, IAM readiness checks, update and
notification startup behavior, runtime region and buffer config lookup,
workload admission replication status, S3 Select DB lookup, app-context
object-store/notification resolution, and node-service IAM/lock behavior.
- Verification: focused RustFS compile/tests, formatting, migration and layer
guards, diff hygiene, residual direct AppContext scan, Rust risk scan, fast
PR gate, and full PR gate before PR.
## Next PRs ## Next PRs
1. `consumer-migration`: continue reducing direct global reads behind AppContext resolver boundaries. 1. `consumer-migration`: continue reducing direct global reads behind AppContext resolver boundaries.
@@ -4962,6 +4977,9 @@ Status values: `[ ]` not started, `[~]` in progress, `[x]` complete, `[!]` block
| Expert | Status | Notes | | Expert | Status | Notes |
|---|---|---| |---|---|---|
| Quality/architecture | pass | API-206 keeps root, app usecase, and storage node-service AppContext resolver consumers behind owner runtime-source boundaries and adds regression guards. |
| Migration preservation | pass | Request credentials, IAM readiness, startup notify/region, buffer config, workload admission, S3 Select, app-context object-store/notify, and node-service IAM/lock behavior preserve existing semantics. |
| Testing/verification | pass | Focused RustFS compile/tests, formatting, migration/layer guards, residual scan, fast PR gate, and full PR gate are planned before PR. |
| Quality/architecture | pass | API-205 keeps direct admin AppContext resolver consumers behind the admin runtime-source boundary and adds a guard against regressions. | | Quality/architecture | pass | API-205 keeps direct admin AppContext resolver consumers behind the admin runtime-source boundary and adds a guard against regressions. |
| Migration preservation | pass | Admin auth, IAM readiness, KMS manager fallback, site replication TLS, config publication, and object-store resolver behavior preserve existing semantics. | | Migration preservation | pass | Admin auth, IAM readiness, KMS manager fallback, site replication TLS, config publication, and object-store resolver behavior preserve existing semantics. |
| Testing/verification | pass | Focused admin compile/tests, formatting, migration/layer guards, residual scan, fast PR gate, and full PR gate are planned before PR. | | Testing/verification | pass | Focused admin compile/tests, formatting, migration/layer guards, residual scan, fast PR gate, and full PR gate are planned before PR. |
+1 -1
View File
@@ -19,7 +19,7 @@ use super::EndpointServerPools;
use super::get_server_info; use super::get_server_info;
use super::{PoolDecommissionInfo, PoolStatus, RebalStatus, get_total_usable_capacity, get_total_usable_capacity_free}; use super::{PoolDecommissionInfo, PoolStatus, RebalStatus, get_total_usable_capacity, get_total_usable_capacity_free};
use super::{apply_bucket_usage_memory_overlay, load_data_usage_from_backend}; use super::{apply_bucket_usage_memory_overlay, load_data_usage_from_backend};
use crate::app::context::{ use crate::app::runtime_sources::{
AppContext, get_global_app_context, resolve_endpoints_handle, resolve_object_store_handle_for_context, AppContext, get_global_app_context, resolve_endpoints_handle, resolve_object_store_handle_for_context,
}; };
use crate::capacity::resolve_admin_used_capacity; use crate::capacity::resolve_admin_used_capacity;
+1 -1
View File
@@ -38,7 +38,7 @@ use super::{
use crate::admin::handlers::site_replication::{ use crate::admin::handlers::site_replication::{
site_replication_bucket_meta_hook, site_replication_delete_bucket_hook, site_replication_make_bucket_hook, site_replication_bucket_meta_hook, site_replication_delete_bucket_hook, site_replication_make_bucket_hook,
}; };
use crate::app::context::{ use crate::app::runtime_sources::{
AppContext, get_global_app_context, resolve_encryption_service, resolve_notification_system, AppContext, get_global_app_context, resolve_encryption_service, resolve_notification_system,
resolve_notify_interface_for_context, resolve_object_store_handle_for_context, resolve_notify_interface_for_context, resolve_object_store_handle_for_context,
}; };
@@ -21,7 +21,7 @@ use super::{
}; };
use super::{multipart_usecase::DefaultMultipartUsecase, object_usecase::DefaultObjectUsecase}; use super::{multipart_usecase::DefaultMultipartUsecase, object_usecase::DefaultObjectUsecase};
use crate::app::bucket_usecase::DefaultBucketUsecase; use crate::app::bucket_usecase::DefaultBucketUsecase;
use crate::app::context::resolve_tier_config_handle; use crate::app::runtime_sources::resolve_tier_config_handle;
use crate::storage::ecfs::FS; use crate::storage::ecfs::FS;
use crate::storage::{ use crate::storage::{
StorageObjectInfo as ObjectInfo, StorageObjectOptions as ObjectOptions, StoragePutObjReader as PutObjReader, StorageObjectInfo as ObjectInfo, StorageObjectOptions as ObjectOptions, StoragePutObjReader as PutObjReader,
+1
View File
@@ -20,6 +20,7 @@ pub mod bucket_usecase;
pub mod context; pub mod context;
pub mod multipart_usecase; pub mod multipart_usecase;
pub mod object_usecase; pub mod object_usecase;
pub(crate) mod runtime_sources;
mod select_object; mod select_object;
#[cfg(test)] #[cfg(test)]
+1 -1
View File
@@ -30,8 +30,8 @@ use super::{
replication::{get_must_replicate_options, must_replicate, schedule_replication}, replication::{get_must_replicate_options, must_replicate, schedule_replication},
versioning_sys::BucketVersioningSys, versioning_sys::BucketVersioningSys,
}; };
use crate::app::context::{AppContext, get_global_app_context, resolve_object_store_handle_for_context};
use crate::app::object_usecase::{build_put_like_object_lock_metadata, validate_existing_object_lock_for_write}; use crate::app::object_usecase::{build_put_like_object_lock_metadata, validate_existing_object_lock_for_write};
use crate::app::runtime_sources::{AppContext, get_global_app_context, resolve_object_store_handle_for_context};
use crate::capacity::record_capacity_write; use crate::capacity::record_capacity_write;
use crate::error::ApiError; use crate::error::ApiError;
use crate::storage::access::has_bypass_governance_header; use crate::storage::access::has_bypass_governance_header;
+1 -1
View File
@@ -44,7 +44,7 @@ use super::{
tagging::decode_tags, tagging::decode_tags,
versioning_sys::BucketVersioningSys, versioning_sys::BucketVersioningSys,
}; };
use crate::app::context::{ use crate::app::runtime_sources::{
AppContext, get_global_app_context, resolve_expiry_state_handle, resolve_notify_interface_for_context, AppContext, get_global_app_context, resolve_expiry_state_handle, resolve_notify_interface_for_context,
resolve_object_store_handle_for_context, resolve_object_store_handle_for_context,
}; };
+22
View File
@@ -0,0 +1,22 @@
// Copyright 2024 RustFS Team
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
pub(crate) use crate::app::context::{
AppContext, get_global_app_context, resolve_encryption_service, resolve_endpoints_handle, resolve_expiry_state_handle,
resolve_notification_system, resolve_notify_interface_for_context, resolve_object_store_handle_for_context,
resolve_s3select_db,
};
#[cfg(test)]
pub(crate) use crate::app::context::resolve_tier_config_handle;
+1 -1
View File
@@ -1,4 +1,4 @@
use crate::app::context::resolve_s3select_db; use crate::app::runtime_sources::resolve_s3select_db;
use crate::error::ApiError; use crate::error::ApiError;
use crate::storage::options::get_opts; use crate::storage::options::get_opts;
use crate::storage::request_context::spawn_traced; use crate::storage::request_context::spawn_traced;
+3 -3
View File
@@ -12,7 +12,7 @@
// See the License for the specific language governing permissions and // See the License for the specific language governing permissions and
// limitations under the License. // limitations under the License.
use crate::app::context::resolve_action_credentials; use crate::runtime_sources::resolve_action_credentials;
use http::HeaderMap; use http::HeaderMap;
use http::Uri; use http::Uri;
use rustfs_credentials::Credentials; use rustfs_credentials::Credentials;
@@ -186,7 +186,7 @@ impl S3Auth for IAMAuth {
return Ok(key); return Ok(key);
} }
if let Ok(iam_store) = crate::app::context::resolve_ready_iam_handle() { if let Ok(iam_store) = crate::runtime_sources::resolve_ready_iam_handle() {
// Use check_key instead of get_user to ensure user is loaded from disk if not in cache // 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. // 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. // check_key will automatically attempt to load the user from disk if not found in cache.
@@ -341,7 +341,7 @@ pub async fn check_key_valid(session_token: &str, access_key: &str) -> S3Result<
let sys_cred = cred.clone(); let sys_cred = cred.clone();
if !constant_time_eq(&cred.access_key, access_key) { if !constant_time_eq(&cred.access_key, access_key) {
let Ok(iam_store) = crate::app::context::resolve_ready_iam_handle() else { let Ok(iam_store) = crate::runtime_sources::resolve_ready_iam_handle() else {
return Err(S3Error::with_message( return Err(S3Error::with_message(
S3ErrorCode::InternalError, S3ErrorCode::InternalError,
format!("check_key_valid {:?}", IamError::IamSysNotInitialized), format!("check_key_valid {:?}", IamError::IamSysNotInitialized),
+1 -1
View File
@@ -19,7 +19,7 @@
//! configuration, and dependencies. //! configuration, and dependencies.
use super::{InfoOpts, InfoType}; use super::{InfoOpts, InfoType};
use crate::app::context::resolve_buffer_config; use crate::runtime_sources::resolve_buffer_config;
use crate::version::build; use crate::version::build;
use rustfs_credentials::Masked; use rustfs_credentials::Masked;
use serde::Serialize; use serde::Serialize;
+1 -1
View File
@@ -12,7 +12,7 @@
// See the License for the specific language governing permissions and // See the License for the specific language governing permissions and
// limitations under the License. // limitations under the License.
use crate::app::context::{resolve_notify_interface, resolve_region}; use crate::runtime_sources::{resolve_notify_interface, resolve_region};
use crate::server::ShutdownHandle; use crate::server::ShutdownHandle;
use crate::storage::{ use crate::storage::{
get_bucket_notification_config, process_lambda_configurations, process_queue_configurations, process_topic_configurations, get_bucket_notification_config, process_lambda_configurations, process_queue_configurations, process_topic_configurations,
+1
View File
@@ -68,6 +68,7 @@ pub mod profiling;
#[cfg(any(feature = "ftps", feature = "webdav", feature = "sftp"))] #[cfg(any(feature = "ftps", feature = "webdav", feature = "sftp"))]
pub mod protocols; pub mod protocols;
pub mod runtime_capabilities; pub mod runtime_capabilities;
pub(crate) mod runtime_sources;
pub mod server; pub mod server;
pub(crate) mod startup_audit; pub(crate) mod startup_audit;
pub(crate) mod startup_auth; pub(crate) mod startup_auth;
+1 -1
View File
@@ -12,7 +12,7 @@
// See the License for the specific language governing permissions and // See the License for the specific language governing permissions and
// limitations under the License. // limitations under the License.
use crate::app::context::resolve_action_credentials; use crate::runtime_sources::resolve_action_credentials;
use crate::storage::ecfs::FS; use crate::storage::ecfs::FS;
use http::{HeaderMap, Method}; use http::{HeaderMap, Method};
use percent_encoding::{AsciiSet, CONTROLS, utf8_percent_encode}; use percent_encoding::{AsciiSet, CONTROLS, utf8_percent_encode};
+20
View File
@@ -0,0 +1,20 @@
// Copyright 2024 RustFS Team
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
use crate::app::context;
pub(crate) use context::{
AppContext, resolve_action_credentials, resolve_buffer_config, resolve_notify_interface, resolve_ready_iam_handle,
resolve_region, resolve_replication_pool_handle,
};
+1 -1
View File
@@ -12,7 +12,7 @@
// See the License for the specific language governing permissions and // See the License for the specific language governing permissions and
// limitations under the License. // limitations under the License.
use crate::app::context::AppContext; use crate::runtime_sources::AppContext;
use crate::server::{ServiceStateManager, publish_ready_when_runtime_ready}; use crate::server::{ServiceStateManager, publish_ready_when_runtime_ready};
use crate::storage::ECStore; use crate::storage::ECStore;
use rustfs_common::{GlobalReadiness, SystemStage}; use rustfs_common::{GlobalReadiness, SystemStage};
+15 -17
View File
@@ -23,9 +23,7 @@ use crate::admin::service::{
config::{reload_dynamic_config_runtime_state, reload_runtime_config_snapshot}, config::{reload_dynamic_config_runtime_state, reload_runtime_config_snapshot},
site_replication::reload_site_replication_runtime_state, site_replication::reload_site_replication_runtime_state,
}; };
use crate::app::context::{ use crate::storage::runtime_sources;
AppContext, get_global_app_context, resolve_iam_handle, resolve_lock_client, resolve_object_store_handle_for_context,
};
use bytes::Bytes; use bytes::Bytes;
use futures::Stream; use futures::Stream;
use futures_util::future::join_all; use futures_util::future::join_all;
@@ -175,7 +173,7 @@ mod metrics;
pub struct NodeService { pub struct NodeService {
local_peer: LocalPeerS3Client, local_peer: LocalPeerS3Client,
context: Option<Arc<AppContext>>, context: Option<Arc<runtime_sources::AppContext>>,
} }
impl std::fmt::Debug for NodeService { impl std::fmt::Debug for NodeService {
@@ -188,19 +186,19 @@ impl std::fmt::Debug for NodeService {
} }
pub fn make_server() -> NodeService { pub fn make_server() -> NodeService {
let context = get_global_app_context(); let context = runtime_sources::get_global_app_context();
make_server_for_context(context) make_server_for_context(context)
} }
pub fn make_server_for_context(context: Option<Arc<AppContext>>) -> NodeService { pub fn make_server_for_context(context: Option<Arc<runtime_sources::AppContext>>) -> NodeService {
let local_peer = LocalPeerS3Client::new(None, None); let local_peer = LocalPeerS3Client::new(None, None);
NodeService { local_peer, context } NodeService { local_peer, context }
} }
impl NodeService { impl NodeService {
fn resolve_object_store(&self) -> Option<Arc<crate::app::ECStore>> { fn resolve_object_store(&self) -> Option<Arc<crate::app::ECStore>> {
let context = self.context.clone().or_else(get_global_app_context); let context = self.context.clone().or_else(runtime_sources::get_global_app_context);
resolve_object_store_handle_for_context(context.as_deref()) runtime_sources::object_store_handle_for_context(context.as_deref())
} }
async fn find_disk(&self, disk_path: &str) -> Option<DiskStore> { async fn find_disk(&self, disk_path: &str) -> Option<DiskStore> {
@@ -213,7 +211,7 @@ impl NodeService {
/// Get the lock client, returning an error if not initialized /// Get the lock client, returning an error if not initialized
fn get_lock_client(&self) -> Result<Arc<dyn LockClient>, Status> { fn get_lock_client(&self) -> Result<Arc<dyn LockClient>, Status> {
resolve_lock_client() runtime_sources::lock_client()
.ok_or_else(|| Status::internal("Lock client not initialized. Please ensure storage is initialized first.")) .ok_or_else(|| Status::internal("Lock client not initialized. Please ensure storage is initialized first."))
} }
} }
@@ -672,7 +670,7 @@ impl Node for NodeService {
})); }));
} }
let Some(iam_sys) = resolve_iam_handle() else { let Some(iam_sys) = runtime_sources::iam_handle() else {
return Ok(Response::new(DeletePolicyResponse { return Ok(Response::new(DeletePolicyResponse {
success: false, success: false,
error_info: Some("errServerNotInitialized".to_string()), error_info: Some("errServerNotInitialized".to_string()),
@@ -701,7 +699,7 @@ impl Node for NodeService {
error_info: Some("policy name is missing".to_string()), error_info: Some("policy name is missing".to_string()),
})); }));
} }
let Some(iam_sys) = resolve_iam_handle() else { let Some(iam_sys) = runtime_sources::iam_handle() else {
return Ok(Response::new(LoadPolicyResponse { return Ok(Response::new(LoadPolicyResponse {
success: false, success: false,
error_info: Some("errServerNotInitialized".to_string()), error_info: Some("errServerNotInitialized".to_string()),
@@ -740,7 +738,7 @@ impl Node for NodeService {
})); }));
}; };
let is_group = request.is_group; let is_group = request.is_group;
let Some(iam_sys) = resolve_iam_handle() else { let Some(iam_sys) = runtime_sources::iam_handle() else {
return Ok(Response::new(LoadPolicyMappingResponse { return Ok(Response::new(LoadPolicyMappingResponse {
success: false, success: false,
error_info: Some("errServerNotInitialized".to_string()), error_info: Some("errServerNotInitialized".to_string()),
@@ -768,7 +766,7 @@ impl Node for NodeService {
error_info: Some("access_key name is missing".to_string()), error_info: Some("access_key name is missing".to_string()),
})); }));
} }
let Some(iam_sys) = resolve_iam_handle() else { let Some(iam_sys) = runtime_sources::iam_handle() else {
return Ok(Response::new(DeleteUserResponse { return Ok(Response::new(DeleteUserResponse {
success: false, success: false,
error_info: Some("errServerNotInitialized".to_string()), error_info: Some("errServerNotInitialized".to_string()),
@@ -800,7 +798,7 @@ impl Node for NodeService {
error_info: Some("access_key name is missing".to_string()), error_info: Some("access_key name is missing".to_string()),
})); }));
} }
let Some(iam_sys) = resolve_iam_handle() else { let Some(iam_sys) = runtime_sources::iam_handle() else {
return Ok(Response::new(DeleteServiceAccountResponse { return Ok(Response::new(DeleteServiceAccountResponse {
success: false, success: false,
error_info: Some("errServerNotInitialized".to_string()), error_info: Some("errServerNotInitialized".to_string()),
@@ -830,7 +828,7 @@ impl Node for NodeService {
})); }));
} }
let Some(iam_sys) = resolve_iam_handle() else { let Some(iam_sys) = runtime_sources::iam_handle() else {
return Ok(Response::new(LoadUserResponse { return Ok(Response::new(LoadUserResponse {
success: false, success: false,
error_info: Some("errServerNotInitialized".to_string()), error_info: Some("errServerNotInitialized".to_string()),
@@ -866,7 +864,7 @@ impl Node for NodeService {
})); }));
} }
let Some(iam_sys) = resolve_iam_handle() else { let Some(iam_sys) = runtime_sources::iam_handle() else {
return Ok(Response::new(LoadServiceAccountResponse { return Ok(Response::new(LoadServiceAccountResponse {
success: false, success: false,
error_info: Some("errServerNotInitialized".to_string()), error_info: Some("errServerNotInitialized".to_string()),
@@ -897,7 +895,7 @@ impl Node for NodeService {
})); }));
} }
let Some(iam_sys) = resolve_iam_handle() else { let Some(iam_sys) = runtime_sources::iam_handle() else {
return Ok(Response::new(LoadGroupResponse { return Ok(Response::new(LoadGroupResponse {
success: false, success: false,
error_info: Some("errServerNotInitialized".to_string()), error_info: Some("errServerNotInitialized".to_string()),
+15
View File
@@ -19,12 +19,19 @@ use rustfs_credentials::Credentials;
use rustfs_iam::{error::Result as IamResult, store::object::ObjectStore, sys::IamSys}; use rustfs_iam::{error::Result as IamResult, store::object::ObjectStore, sys::IamSys};
use rustfs_io_metrics::{PerformanceMetrics, internode_metrics::InternodeMetrics}; use rustfs_io_metrics::{PerformanceMetrics, internode_metrics::InternodeMetrics};
use rustfs_kms::ObjectEncryptionService; use rustfs_kms::ObjectEncryptionService;
use rustfs_lock::LockClient;
use std::sync::Arc; use std::sync::Arc;
pub(crate) use context::{AppContext, get_global_app_context};
pub(crate) fn object_store_handle() -> Option<Arc<ECStore>> { pub(crate) fn object_store_handle() -> Option<Arc<ECStore>> {
context::resolve_object_store_handle() context::resolve_object_store_handle()
} }
pub(crate) fn object_store_handle_for_context(context: Option<&AppContext>) -> Option<Arc<ECStore>> {
context::resolve_object_store_handle_for_context(context)
}
pub(crate) fn buffer_config() -> RustFSBufferConfig { pub(crate) fn buffer_config() -> RustFSBufferConfig {
context::resolve_buffer_config() context::resolve_buffer_config()
} }
@@ -60,3 +67,11 @@ pub(crate) fn region() -> Option<s3s::region::Region> {
pub(crate) fn ready_iam_handle() -> IamResult<Arc<IamSys<ObjectStore>>> { pub(crate) fn ready_iam_handle() -> IamResult<Arc<IamSys<ObjectStore>>> {
context::resolve_ready_iam_handle() context::resolve_ready_iam_handle()
} }
pub(crate) fn iam_handle() -> Option<Arc<IamSys<ObjectStore>>> {
context::resolve_iam_handle()
}
pub(crate) fn lock_client() -> Option<Arc<dyn LockClient>> {
context::resolve_lock_client()
}
+1 -1
View File
@@ -12,7 +12,7 @@
// See the License for the specific language governing permissions and // See the License for the specific language governing permissions and
// limitations under the License. // limitations under the License.
use crate::app::context::resolve_replication_pool_handle; use crate::runtime_sources::resolve_replication_pool_handle;
use crate::storage::{bucket_metadata_runtime_initialized, replication_queue_current_count}; use crate::storage::{bucket_metadata_runtime_initialized, replication_queue_current_count};
use rustfs_concurrency::{ use rustfs_concurrency::{
AdmissionState, WorkloadAdmissionRegistrySnapshot, WorkloadAdmissionSnapshot, WorkloadAdmissionSnapshotProvider, AdmissionState, WorkloadAdmissionRegistrySnapshot, WorkloadAdmissionSnapshot, WorkloadAdmissionSnapshotProvider,
@@ -157,6 +157,9 @@ RUSTFS_STARTUP_RUNTIME_SOURCE_BYPASS_HITS_FILE="${TMP_DIR}/rustfs_startup_runtim
RUSTFS_SERVER_RUNTIME_SOURCE_BYPASS_HITS_FILE="${TMP_DIR}/rustfs_server_runtime_source_bypass_hits.txt" RUSTFS_SERVER_RUNTIME_SOURCE_BYPASS_HITS_FILE="${TMP_DIR}/rustfs_server_runtime_source_bypass_hits.txt"
RUSTFS_STORAGE_RUNTIME_SOURCE_BYPASS_HITS_FILE="${TMP_DIR}/rustfs_storage_runtime_source_bypass_hits.txt" RUSTFS_STORAGE_RUNTIME_SOURCE_BYPASS_HITS_FILE="${TMP_DIR}/rustfs_storage_runtime_source_bypass_hits.txt"
RUSTFS_ADMIN_RUNTIME_SOURCE_BYPASS_HITS_FILE="${TMP_DIR}/rustfs_admin_runtime_source_bypass_hits.txt" RUSTFS_ADMIN_RUNTIME_SOURCE_BYPASS_HITS_FILE="${TMP_DIR}/rustfs_admin_runtime_source_bypass_hits.txt"
RUSTFS_APP_CONTEXT_DIRECT_BYPASS_HITS_FILE="${TMP_DIR}/rustfs_app_context_direct_bypass_hits.txt"
RUSTFS_APP_USECASE_RUNTIME_SOURCE_BYPASS_HITS_FILE="${TMP_DIR}/rustfs_app_usecase_runtime_source_bypass_hits.txt"
RUSTFS_STORAGE_DIRECT_APP_CONTEXT_BYPASS_HITS_FILE="${TMP_DIR}/rustfs_storage_direct_app_context_bypass_hits.txt"
awk ' awk '
/^## PR Types$/ { /^## PR Types$/ {
@@ -1383,6 +1386,38 @@ if [[ -s "$RUSTFS_ADMIN_RUNTIME_SOURCE_BYPASS_HITS_FILE" ]]; then
report_failure "RustFS admin runtime source reads must stay behind rustfs/src/admin/runtime_sources.rs: $(paste -sd '; ' "$RUSTFS_ADMIN_RUNTIME_SOURCE_BYPASS_HITS_FILE")" report_failure "RustFS admin runtime source reads must stay behind rustfs/src/admin/runtime_sources.rs: $(paste -sd '; ' "$RUSTFS_ADMIN_RUNTIME_SOURCE_BYPASS_HITS_FILE")"
fi fi
(
cd "$ROOT_DIR"
rg -n --with-filename 'crate::app::context::|use crate::app::context' rustfs/src --glob '*.rs' |
rg -v '^rustfs/src/app/context' |
rg -v '(^rustfs/src/[^/]*runtime_sources\.rs:|/runtime_sources\.rs:)' || true
) >"$RUSTFS_APP_CONTEXT_DIRECT_BYPASS_HITS_FILE"
if [[ -s "$RUSTFS_APP_CONTEXT_DIRECT_BYPASS_HITS_FILE" ]]; then
report_failure "RustFS AppContext resolver reads must stay behind context or runtime_sources modules: $(paste -sd '; ' "$RUSTFS_APP_CONTEXT_DIRECT_BYPASS_HITS_FILE")"
fi
(
cd "$ROOT_DIR"
rg -n --with-filename 'crate::app::context::|use crate::app::context' rustfs/src/app --glob '*.rs' |
rg -v '^rustfs/src/app/context' |
rg -v '^rustfs/src/app/runtime_sources\.rs:' || true
) >"$RUSTFS_APP_USECASE_RUNTIME_SOURCE_BYPASS_HITS_FILE"
if [[ -s "$RUSTFS_APP_USECASE_RUNTIME_SOURCE_BYPASS_HITS_FILE" ]]; then
report_failure "RustFS app usecase runtime source reads must stay behind rustfs/src/app/runtime_sources.rs: $(paste -sd '; ' "$RUSTFS_APP_USECASE_RUNTIME_SOURCE_BYPASS_HITS_FILE")"
fi
(
cd "$ROOT_DIR"
rg -n --with-filename 'crate::app::context::|use crate::app::context' rustfs/src/storage --glob '*.rs' |
rg -v '^rustfs/src/storage/runtime_sources\.rs:' || true
) >"$RUSTFS_STORAGE_DIRECT_APP_CONTEXT_BYPASS_HITS_FILE"
if [[ -s "$RUSTFS_STORAGE_DIRECT_APP_CONTEXT_BYPASS_HITS_FILE" ]]; then
report_failure "RustFS storage runtime source reads must stay behind rustfs/src/storage/runtime_sources.rs: $(paste -sd '; ' "$RUSTFS_STORAGE_DIRECT_APP_CONTEXT_BYPASS_HITS_FILE")"
fi
( (
cd "$ROOT_DIR" cd "$ROOT_DIR"
rg -n --with-filename 'rustfs_ecstore::api::' \ rg -n --with-filename 'rustfs_ecstore::api::' \
+1 -12
View File
@@ -39,31 +39,20 @@ dep|rustfs/src/app/multipart_usecase.rs|app->interface|crate::storage::s3_api::m
dep|rustfs/src/app/multipart_usecase.rs|app->interface|crate::storage::s3_api::multipart::parse_upload_part_number dep|rustfs/src/app/multipart_usecase.rs|app->interface|crate::storage::s3_api::multipart::parse_upload_part_number
dep|rustfs/src/app/object_usecase.rs|app->interface|crate::storage::ecfs dep|rustfs/src/app/object_usecase.rs|app->interface|crate::storage::ecfs
dep|rustfs/src/app/object_usecase.rs|app->interface|crate::storage::s3_api::multipart::parse_list_parts_params dep|rustfs/src/app/object_usecase.rs|app->interface|crate::storage::s3_api::multipart::parse_list_parts_params
dep|rustfs/src/auth.rs|infra->app|crate::app::context::resolve_action_credentials
dep|rustfs/src/config/info.rs|infra->app|crate::app::context::resolve_buffer_config
dep|rustfs/src/init.rs|infra->app|crate::app::context::resolve_notify_interface
dep|rustfs/src/init.rs|infra->app|crate::app::context::resolve_region
dep|rustfs/src/init.rs|infra->interface|crate::admin dep|rustfs/src/init.rs|infra->interface|crate::admin
dep|rustfs/src/protocols/client.rs|infra->app|crate::app::context::resolve_action_credentials
dep|rustfs/src/protocols/client.rs|infra->interface|crate::storage::ecfs::FS dep|rustfs/src/protocols/client.rs|infra->interface|crate::storage::ecfs::FS
dep|rustfs/src/runtime_sources.rs|infra->app|crate::app::context
dep|rustfs/src/server/http.rs|infra->interface|crate::admin dep|rustfs/src/server/http.rs|infra->interface|crate::admin
dep|rustfs/src/server/layer.rs|infra->interface|crate::admin::console::is_console_path dep|rustfs/src/server/layer.rs|infra->interface|crate::admin::console::is_console_path
dep|rustfs/src/server/layer.rs|infra->interface|crate::admin::handlers::health::HealthProbe dep|rustfs/src/server/layer.rs|infra->interface|crate::admin::handlers::health::HealthProbe
dep|rustfs/src/server/layer.rs|infra->interface|crate::admin::handlers::health::build_health_response_parts dep|rustfs/src/server/layer.rs|infra->interface|crate::admin::handlers::health::build_health_response_parts
dep|rustfs/src/server/runtime_sources.rs|infra->app|crate::app::context dep|rustfs/src/server/runtime_sources.rs|infra->app|crate::app::context
dep|rustfs/src/startup_iam.rs|infra->app|crate::app::context::AppContext
dep|rustfs/src/storage/ecfs_extend.rs|infra->interface|crate::storage::ecfs::ListObjectUnorderedQuery dep|rustfs/src/storage/ecfs_extend.rs|infra->interface|crate::storage::ecfs::ListObjectUnorderedQuery
dep|rustfs/src/storage/ecfs_test.rs|infra->interface|crate::storage::ecfs::FS dep|rustfs/src/storage/ecfs_test.rs|infra->interface|crate::storage::ecfs::FS
dep|rustfs/src/storage/ecfs_test.rs|infra->interface|crate::storage::ecfs::validate_object_lock_configuration_input dep|rustfs/src/storage/ecfs_test.rs|infra->interface|crate::storage::ecfs::validate_object_lock_configuration_input
dep|rustfs/src/storage/ecfs_test.rs|infra->interface|crate::storage::s3_api::common::rustfs_initiator dep|rustfs/src/storage/ecfs_test.rs|infra->interface|crate::storage::s3_api::common::rustfs_initiator
dep|rustfs/src/storage/ecfs_test.rs|infra->interface|crate::storage::s3_api::common::rustfs_owner dep|rustfs/src/storage/ecfs_test.rs|infra->interface|crate::storage::s3_api::common::rustfs_owner
dep|rustfs/src/storage/runtime_sources.rs|infra->app|crate::app::context dep|rustfs/src/storage/runtime_sources.rs|infra->app|crate::app::context
dep|rustfs/src/storage/rpc/node_service.rs|infra->app|crate::app::context::AppContext
dep|rustfs/src/storage/rpc/node_service.rs|infra->app|crate::app::context::get_global_app_context
dep|rustfs/src/storage/rpc/node_service.rs|infra->app|crate::app::context::resolve_iam_handle
dep|rustfs/src/storage/rpc/node_service.rs|infra->app|crate::app::context::resolve_lock_client
dep|rustfs/src/storage/rpc/node_service.rs|infra->app|crate::app::context::resolve_object_store_handle_for_context
dep|rustfs/src/storage/rpc/node_service.rs|infra->interface|crate::admin::service::config::reload_dynamic_config_runtime_state dep|rustfs/src/storage/rpc/node_service.rs|infra->interface|crate::admin::service::config::reload_dynamic_config_runtime_state
dep|rustfs/src/storage/rpc/node_service.rs|infra->interface|crate::admin::service::config::reload_runtime_config_snapshot dep|rustfs/src/storage/rpc/node_service.rs|infra->interface|crate::admin::service::config::reload_runtime_config_snapshot
dep|rustfs/src/storage/rpc/node_service.rs|infra->interface|crate::admin::service::site_replication::reload_site_replication_runtime_state dep|rustfs/src/storage/rpc/node_service.rs|infra->interface|crate::admin::service::site_replication::reload_site_replication_runtime_state
dep|rustfs/src/workload_admission.rs|infra->app|crate::app::context::resolve_replication_pool_handle