mirror of
https://github.com/rustfs/rustfs.git
synced 2026-07-26 16:28:15 +00:00
05833063c7
refactor(concurrency): remove zero-caller facade modules and fix no-default-features build (backlog#1025) The audit in rustfs/backlog#1010 (consistent with #805) established that most of crates/concurrency was a decorative facade with zero production callers; the real runtime concurrency control lives in rustfs/src/storage/*. This deletes the dead facades and keeps only what the workspace actually consumes. Deleted (zero callers verified by workspace-wide grep): - manager.rs: ConcurrencyManager, lifecycle start/stop, misleading 'started' lifecycle logs - config.rs: ConcurrencyConfig, ConcurrencyFeatures, from_env - timeout.rs: TimeoutManager, TimeoutGuard, TimeoutManagerPolicy - lock.rs: LockManager, LockScopeGuard, OptimizedLockGuard - scheduler.rs: SchedulerManager, SchedulerPolicy, IoStrategy - deadlock.rs facade: DeadlockManager, RequestTracker - backpressure.rs facade: BackpressureManager, BackpressurePipe - the prelude module, unused io-core re-exports, and all feature flags Kept (real callers in ecstore/heal/rustfs): - workload.rs admission contract types (unchanged) - workers.rs Workers pool (unchanged, retained per #4498) - GetObjectQueueSnapshot (moved from manager.rs to new queue.rs) - PipeBackpressurePolicy (used by rustfs/src/storage/backpressure.rs) - DeadlockMonitorPolicy (used by rustfs/src/storage/deadlock_detector.rs) - OperationProgress re-export (used by rustfs/src/storage/timeout_wrapper.rs) Removing the feature flags fixes the previously broken cargo check -p rustfs-concurrency --no-default-features (E0432). Docs and the logging guardrail file list are updated to match. Ref: rustfs/backlog#1025
85 lines
2.9 KiB
Rust
85 lines
2.9 KiB
Rust
// 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.
|
|
|
|
//! Disk permit queue snapshot for GetObject orchestration.
|
|
|
|
/// Snapshot of disk permit queue usage for GetObject orchestration.
|
|
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
|
|
pub struct GetObjectQueueSnapshot {
|
|
/// Total permits configured for disk reads.
|
|
pub total_permits: usize,
|
|
/// Permits currently in use.
|
|
pub permits_in_use: usize,
|
|
}
|
|
|
|
impl GetObjectQueueSnapshot {
|
|
/// Create a queue snapshot from total and available permits.
|
|
pub fn from_available_permits(total_permits: usize, available_permits: usize) -> Self {
|
|
Self {
|
|
total_permits,
|
|
permits_in_use: total_permits.saturating_sub(available_permits),
|
|
}
|
|
}
|
|
|
|
/// Return currently available permits.
|
|
pub fn permits_available(&self) -> usize {
|
|
self.total_permits.saturating_sub(self.permits_in_use)
|
|
}
|
|
|
|
/// Return queue utilization percentage in the 0-100 range.
|
|
pub fn utilization_percent(&self) -> f64 {
|
|
if self.total_permits == 0 {
|
|
0.0
|
|
} else {
|
|
(self.permits_in_use as f64 / self.total_permits as f64) * 100.0
|
|
}
|
|
}
|
|
|
|
/// Return whether the queue is considered congested.
|
|
pub fn is_congested(&self, threshold_percent: f64) -> bool {
|
|
self.utilization_percent() > threshold_percent
|
|
}
|
|
}
|
|
|
|
#[cfg(test)]
|
|
mod tests {
|
|
use super::*;
|
|
|
|
#[test]
|
|
fn test_queue_snapshot() {
|
|
let snapshot = GetObjectQueueSnapshot::from_available_permits(64, 16);
|
|
assert_eq!(snapshot.permits_in_use, 48);
|
|
assert_eq!(snapshot.permits_available(), 16);
|
|
assert!(snapshot.is_congested(70.0));
|
|
}
|
|
|
|
#[test]
|
|
fn test_queue_snapshot_clamps_over_available_permits() {
|
|
let snapshot = GetObjectQueueSnapshot::from_available_permits(64, 96);
|
|
assert_eq!(snapshot.permits_in_use, 0);
|
|
assert_eq!(snapshot.permits_available(), 64);
|
|
assert_eq!(snapshot.utilization_percent(), 0.0);
|
|
assert!(!snapshot.is_congested(0.0));
|
|
}
|
|
|
|
#[test]
|
|
fn test_queue_snapshot_handles_zero_total_permits() {
|
|
let snapshot = GetObjectQueueSnapshot::from_available_permits(0, 0);
|
|
assert_eq!(snapshot.permits_in_use, 0);
|
|
assert_eq!(snapshot.permits_available(), 0);
|
|
assert_eq!(snapshot.utilization_percent(), 0.0);
|
|
assert!(!snapshot.is_congested(0.0));
|
|
}
|
|
}
|