Compare commits

...

1 Commits

Author SHA1 Message Date
overtrue d39211da40 test(io-schedule): drop 24 no-op serial markers from the IO scheduler unit tests
`serial_test`'s `#[serial]` does not serialize anything under nextest (the
authoritative runner executes every test in its own process), and it only has
an effect under the `cargo test` fallback. `storage::concurrency::io_schedule`
is the one remaining `#[serial]` hotspot in the `rustfs` crate whose tests
touch no process environment and no process-global mutable state:

  * `IoPriorityQueue` is instance-local (`Arc<Mutex<..>>` fields built by
    `IoPriorityQueue::new`); no static registry.
  * `IoStrategy::from_context_with_config` is a pure function of the
    caller-supplied `IoSchedulingContext` + `IoSchedulerConfig`. The tests
    pass `concurrent_requests` explicitly, so they never read the global
    `ACTIVE_GET_REQUESTS` counter.
  * `IoSchedulerConfig::default()` / `IoPriorityQueueConfig::default()` read
    `rustfs_config::DEFAULT_*` constants only. `IoPriorityQueueConfig::from_env`
    exists but no test calls it.
  * `IoPriority::from_size` and `IoLoadLevel::from_wait_duration` resolve their
    thresholds from compile-time constants.

The single exception, `test_multi_factor_strategy_compatibility_path`, calls
`IoStrategy::from_wait_duration`, which does load `ACTIVE_GET_REQUESTS` into
the returned `concurrent_requests` field — but that field is not asserted, and
the `buffer_size` it does assert derives only from the load level.

The rest of `storage::concurrency` keeps its markers: `manager.rs` and
`multi_factor_scheduler_integration_test.rs` mutate and read the process-global
`ACTIVE_GET_REQUESTS` / `ACTIVE_PUT_REQUESTS` counters (`track_request()`,
`PutObjectGuard`, `reset_active_put_requests()`), so their `#[serial]` group is
load-bearing for the fallback runner.

Part of rustfs/backlog#1846 (T1, batch 3).
2026-08-19 10:36:12 +08:00
@@ -1766,11 +1766,9 @@ mod tests {
};
use rustfs_io_core::io_profile::{AccessPattern, StorageMedia};
use rustfs_io_metrics::bandwidth::{BandwidthSnapshot, BandwidthTier};
use serial_test::serial;
use std::time::Duration;
#[tokio::test]
#[serial]
async fn test_io_priority_queue_basic() {
let config = IoPriorityQueueConfig::default();
let queue = IoPriorityQueue::new(config);
@@ -1789,7 +1787,6 @@ mod tests {
}
#[tokio::test]
#[serial]
async fn test_io_priority_queue_dequeue_order() {
let config = IoPriorityQueueConfig::default();
let queue = IoPriorityQueue::new(config);
@@ -1817,7 +1814,6 @@ mod tests {
}
#[tokio::test]
#[serial]
async fn test_io_priority_queue_status() {
let config = IoPriorityQueueConfig::default();
let queue = IoPriorityQueue::new(config);
@@ -1835,7 +1831,6 @@ mod tests {
}
#[tokio::test]
#[serial]
async fn test_io_priority_queue_starvation_prevention() {
let config = IoPriorityQueueConfig {
starvation_threshold_secs: 1,
@@ -1859,7 +1854,6 @@ mod tests {
}
#[tokio::test]
#[serial]
async fn test_io_priority_from_size() {
// High priority: < 1MB
assert_eq!(IoPriority::from_size(100 * 1024), IoPriority::High);
@@ -1875,7 +1869,6 @@ mod tests {
}
#[tokio::test]
#[serial]
async fn test_io_load_level_from_wait_duration() {
use std::time::Duration;
@@ -1893,7 +1886,6 @@ mod tests {
}
#[tokio::test]
#[serial]
async fn test_io_scheduler_config_default() {
let config = IoSchedulerConfig::default();
@@ -1907,7 +1899,6 @@ mod tests {
}
#[tokio::test]
#[serial]
async fn test_io_scheduler_config_to_core_config() {
let config = IoSchedulerConfig::default();
let core = config.to_core_config();
@@ -1923,7 +1914,6 @@ mod tests {
}
#[tokio::test]
#[serial]
async fn test_io_priority_queue_config_to_core_config() {
let config = IoPriorityQueueConfig::default();
let core = config.to_core_config();
@@ -1935,7 +1925,6 @@ mod tests {
}
#[tokio::test]
#[serial]
async fn test_io_priority_queue_config_from_scheduler_config() {
let scheduler_config = IoSchedulerConfig {
queue_high_capacity: 128,
@@ -1958,7 +1947,6 @@ mod tests {
// ============================================
#[tokio::test]
#[serial]
async fn test_multi_factor_strategy_nvme_sequential_low_load() {
// NVMe + Sequential + Low load = maximum buffer size
let context = IoSchedulingContext {
@@ -1985,7 +1973,6 @@ mod tests {
}
#[tokio::test]
#[serial]
async fn test_multi_factor_strategy_hdd_random_high_load() {
// HDD + Random + High load = conservative buffer size
let context = IoSchedulingContext {
@@ -2012,7 +1999,6 @@ mod tests {
}
#[tokio::test]
#[serial]
async fn test_multi_factor_strategy_ssd_mixed_medium_load() {
// SSD + Mixed + Medium load = moderate buffer
let context = IoSchedulingContext {
@@ -2040,7 +2026,6 @@ mod tests {
}
#[tokio::test]
#[serial]
async fn test_multi_factor_strategy_critical_load_disables_features() {
// Any media + Critical load = minimal features
let context = IoSchedulingContext {
@@ -2065,7 +2050,6 @@ mod tests {
}
#[tokio::test]
#[serial]
async fn test_multi_factor_strategy_buffer_cap_enforcement() {
// Test that storage media caps are enforced
let context = IoSchedulingContext {
@@ -2090,7 +2074,6 @@ mod tests {
}
#[tokio::test]
#[serial]
async fn test_multi_factor_strategy_applies_sequential_hint_when_pattern_unknown() {
let context = IoSchedulingContext {
file_size: 2 * 1024 * 1024 * 1024, // 2GiB
@@ -2115,7 +2098,6 @@ mod tests {
}
#[tokio::test]
#[serial]
async fn test_multi_factor_strategy_bandwidth_low_reduces_buffer() {
// Low bandwidth should reduce buffer
let context = IoSchedulingContext {
@@ -2139,7 +2121,6 @@ mod tests {
}
#[tokio::test]
#[serial]
async fn test_multi_factor_strategy_high_concurrency_reduction() {
// High concurrency should reduce buffer
let context = IoSchedulingContext {
@@ -2162,7 +2143,6 @@ mod tests {
}
#[tokio::test]
#[serial]
async fn test_multi_factor_strategy_sequential_boost() {
// Sequential reads should get boost
let sequential_context = IoSchedulingContext {
@@ -2204,7 +2184,6 @@ mod tests {
}
#[tokio::test]
#[serial]
async fn test_multi_factor_strategy_unknown_media_conservative() {
// Unknown media should be conservative
let context = IoSchedulingContext {
@@ -2230,7 +2209,6 @@ mod tests {
}
#[tokio::test]
#[serial]
async fn test_multi_factor_strategy_priority_classification() {
// Test priority classification based on file size
let small_context = IoSchedulingContext {
@@ -2277,7 +2255,6 @@ mod tests {
}
#[tokio::test]
#[serial]
async fn test_multi_factor_strategy_readahead_decision_matrix() {
// Test readahead enable/disable logic
let configs = vec![
@@ -2363,7 +2340,6 @@ mod tests {
}
#[tokio::test]
#[serial]
async fn test_multi_factor_strategy_buffer_multiplier_stages() {
// Test that all multiplier stages are applied
let context = IoSchedulingContext {
@@ -2398,7 +2374,6 @@ mod tests {
}
#[tokio::test]
#[serial]
async fn test_multi_factor_strategy_compatibility_path() {
// Test that compatibility path (from_wait_duration) still works
let wait_duration = Duration::from_millis(50);