Research across ractor, tokio, Erlang/OTP BEAM, Linux CFS, and libuv revealed that tick_all drained the entire mailbox per actor per tick, allowing one hot actor to starve all others on the same worker. - Add `actor_message_budget` to RuntimeConfig (default: 64 msgs/actor/tick) - Modify tick_all to break after budget messages, yielding to next actor - budget=0 restores unlimited (backward compatible) behavior - 3 new fairness tests validating hot-cold actor scenarios - New fairness benchmark group (cold_latency_under_pressure, throughput_by_budget) - Fix RuntimeConfig struct literals across workspace crates Inspired by BEAM's 4000-reduction budget and tokio's 128-op cooperative budget. All 45 tests pass (42 original + 3 new). Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1.4 KiB
1.4 KiB
Task Constraints (from user)
Scope of Study
- Broad survey: Not just Rust actor frameworks — include:
- Rust: ractor, actix, kameo, coerce, stakker, xactor, bastion
- Non-actor runtimes: tokio, C++ node/libuv event loop
- OS-level:
processscheduling/logic in operating systems - Classic actor systems: Erlang/OTP, Akka/Pekko (JVM)
- Any widely-used, well-reputed system
Priority & Approach
- Interleaved: Pick a topic → analyze competitors → benchmark swactor → improve → repeat
- Also improve testing methodology and coverage based on analysis
- Look at bug report histories of competitor projects for insights
- Behavioral tests only (Given/When/Then), no white-box/structural tests
Code Structure Rules
- src/ is frozen: No new files, no new modules, no structural changes. Only modify existing files in-place.
- No new dependencies on the root crate (swactor's Cargo.toml)
- May add new crates to
crates/but they must NOT be pulled intosrc/ - Cap at ~5 new crates — if approaching that, prune back
- Integration tests in
tests/, benchmarks inbenches/ - Benchmark execution capped at 2 minutes max
- All notes go in
CLAUDE/notes/ - Report architecture changes in
docs/
Commit Rules
- All
cargo testmust pass (including feature-gated) - Never skip/delete tests for active code
- If a fix takes >3 attempts, log and move on