Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Customize Checking

Override default checking thresholds for schedulers that tolerate higher imbalance, different gap thresholds, or relaxed event rates.

Scheduler-level overrides

Declare a scheduler with custom assertion overrides:

use ktstr::declare_scheduler;
use ktstr::prelude::*;

declare_scheduler!(RELAXED, {
    name = "relaxed",
    binary = "scx_relaxed",
    assert = Assert::NO_OVERRIDES
        .max_imbalance_ratio(5.0)    // tolerate 5:1 imbalance
        .max_fallback_rate(500.0)     // higher fallback rate ok
        .fail_on_stall(false),        // don't fail on stall
});

These overrides sit between Assert::default_checks() and per-test overrides in the merge chain.

Per-test overrides via #[ktstr_test]

#[ktstr_test(
    scheduler = RELAXED,
    not_starved = true,
    max_gap_ms = 5000,
    max_imbalance_ratio = 10.0,
    sustained_samples = 10,
)]
fn high_imbalance_test(ctx: &Ctx) -> Result<AssertResult> {
    // Inherits topology from RELAXED
    Ok(AssertResult::pass())
}

Understanding not_starved

not_starved = true enables starvation, fairness spread, and scheduling gap checks. Each threshold can be overridden independently. See Checking: Worker checks for details and default thresholds.

Merge order

Three-layer merge with last-Some-wins semantics. See Checking: Merge layers.

Using Assert directly in ops scenarios

fn my_scenario(ctx: &Ctx) -> Result<AssertResult> {
    let assertions = Assert::NO_OVERRIDES
        .check_not_starved()
        .max_gap_ms(3000);

    let steps = vec![/* ... */];
    execute_steps_with(ctx, steps, Some(&assertions))
}

execute_steps_with applies the given Assert for worker checks. execute_steps (without _with) passes None, falling back to ctx.assert (the merged three-layer config: default_checks -> scheduler -> per-test).

See Ops and Steps for the full step execution model.