shuttle
A library for testing concurrent Rust code
0.9.3
5.1M downloads/mo
#4477 most downloaded on crates.io
awslabs/shuttle
What this package is like to depend on
Last release 3 days ago
20 Aug 2026
Release timing varies
gaps range from 8 days to 10 months
Nearly every release is documented
notes for 23 of 24 stable releases
Nothing withdrawn
no release was ever pulled
6 years old
24 releases · first in 2020
4 releases in the last 12 months
see the full history below
Release timeline
24 releases · Oct 2020 to Aug 2026Releases
latest 24-
0.9.320 Aug 2026Release notes
Open source →- Fix
BatchSemaphorewaking the wrong task when anAcquirefuture is polled by a task other than the one that created it (the motivating case is an in-flight acquire cached inside a longer-lived object, such as a tokioReceiverthat is moved between tasks). Waiters left behind by a cancelledAcquirewhose task has since finished are now also treated as stale instead of consuming permits or blocking a finished task. (#317) - Performance:
scheduleno longer iterates over tasks that have already finished. This does not change scheduling decisions. (#318) - Add READMEs for
shuttle-engine,shuttle-schedulers,shuttle-stdand the wrapper crates. Makeshuttle-async-stream-implpublishable. (#315) - Fix doc comment paths that got broken in the crate refactoring.
- Publish
shuttle-engine,shuttle-schedulersandshuttle-std0.1.1.
Release notes
Open source →- Fix
BatchSemaphorewaking the wrong task when anAcquirefuture is polled by a task other than the one that created it (the motivating case is an in-flight acquire cached inside a longer-lived object, such as a tokioReceiverthat is moved between tasks). Waiters left behind by a cancelledAcquirewhose task has since finished are now also treated as stale instead of consuming permits or blocking a finished task. (#317) - Performance:
scheduleno longer iterates over tasks that have already finished. This does not change scheduling decisions. (#318) - Add READMEs for
shuttle-engine,shuttle-schedulers,shuttle-stdand the wrapper crates. Makeshuttle-async-stream-implpublishable. (#315) - Fix doc comment paths that got broken in the crate refactoring.
- Publish
shuttle-engine,shuttle-schedulersandshuttle-std0.1.1.
- Fix
-
0.9.212 Aug 2026Release notes
Open source →- Add support for 128-bit atomics (
AtomicI128/AtomicU128) (#299) - Implement
DisplayforTaskIdto match tokio'stask::Id(#307) - Add support for task abort (#278)
- Refactor the
shuttlecrate into separate internal crates:shuttle-engine(core runtime and theSchedulertrait),shuttle-schedulers(built-in schedulers andcheck/replayhelpers), andshuttle-std(thestdreplacement primitives) (#286, #290, #292, #294). This is an internal reorganization and does not change theshuttlepublic API. - Publish
shuttle-std,shuttle-schedulersandshuttle-engine.
Release notes
Open source →- Add support for 128-bit atomics (
AtomicI128/AtomicU128) (#299) - Implement
DisplayforTaskIdto match tokio'stask::Id(#307) - Add support for task abort (#278)
- Refactor the
shuttlecrate into separate internal crates:shuttle-engine(core runtime and theSchedulertrait),shuttle-schedulers(built-in schedulers andcheck/replayhelpers), andshuttle-std(thestdreplacement primitives) (#286, #290, #292, #294). This is an internal reorganization and does not change theshuttlepublic API. - Publish
shuttle-std,shuttle-schedulersandshuttle-engine.
- Add support for 128-bit atomics (
-
0.9.121 Apr 2026 -
0.9.020 Apr 2026Release notes
Open source →- Fix:
JoinHandle<T>is nowSendandSynceven ifTis not. - Gate vector clocks behind the
vector-clocksfeature flag. (#187) - Fix:
Oncecan now be moved (#188 and #208) - Various performance improvements (#191, #211)
std::sync::{LockResult, PoisonError, TryLockError, TryLockResult}are now exported fromshuttle::sync(#198)- Task names are now logged in the step span (#206)
- Task backtraces are now printed on deadlock if the SHUTTLE_BACKTRACE environment variable is set (#205, #213)
- Spawn events are now traced at
DEBUG(down fromINFO) (#211) - Stable resource ids (#207)
UniformRandomWalkscheduler added (#200)- Panic path refactored. 1: Aborting panics should more often have their schedule serialized, 2: Schedule is no longer part of the panic message, 3: There will now be multiple schedules serialized on multiple panics, 4: if
Config::immediately_return_on_panicis set then we will return immediately on a failure and not finish unwinding the panic. (#202) - Change scheduling points to always precede operations (#216)
- Change the backend for the tasks to be the Corosensei crate instead of the generators crate (#204)
- Add
SHUTTLE_PERSIST_SEEDin the RandomScheduler to persist schedule before running the test (to be used for aborting tests) (#201) - Add
BatchSemaphore::close_no_scheduling_point(#227) - Add config for ungraceful shutdowns (#230)
- Add {RwLock, Mutex}::clear_poison (#233)
- Bump to rand 0.8.6 (#264)
Release notes
Open source →- Fix:
JoinHandle<T>is nowSendandSynceven ifTis not. - Gate vector clocks behind the
vector-clocksfeature flag. (#187) - Fix:
Oncecan now be moved (#188 and #208) - Various performance improvements (#191, #211)
std::sync::{LockResult, PoisonError, TryLockError, TryLockResult}are now exported fromshuttle::sync(#198)- Task names are now logged in the step span (#206)
- Task backtraces are now printed on deadlock if the SHUTTLE_BACKTRACE environment variable is set (#205, #213)
- Spawn events are now traced at
DEBUG(down fromINFO) (#211) - Stable resource ids (#207)
UniformRandomWalkscheduler added (#200)- Panic path refactored. 1: Aborting panics should more often have their schedule serialized, 2: Schedule is no longer part of the panic message, 3: There will now be multiple schedules serialized on multiple panics, 4: if
Config::immediately_return_on_panicis set then we will return immediately on a failure and not finish unwinding the panic. (#202) - Change scheduling points to always precede operations (#216)
- Change the backend for the tasks to be the Corosensei crate instead of the generators crate (#204)
- Add
SHUTTLE_PERSIST_SEEDin the RandomScheduler to persist schedule before running the test (to be used for aborting tests) (#201) - Add
BatchSemaphore::close_no_scheduling_point(#227) - Add config for ungraceful shutdowns (#230)
- Add {RwLock, Mutex}::clear_poison (#233)
- Bump to rand 0.8.6 (#264)
- Fix:
-
0.8.120 Jun 2025Release notes
Open source →- Fix bug in
BatchSemaphore(#167) - Fix bug in
RwLock(#170) - Add
current::reset_step_count(#175) - Add
spawn_local(#176) - Add
thread::scope(#181) - Add
AbortHandle(#182)
- Fix bug in
-
0.8.012 Oct 2024Release notes
Open source →- Add
BatchSemaphore(#151) block_onnow has one less thread switch point, which breaks schedules. (#155)ReplayScheduler::set_target_clockadded (#156)- Schedulers now receive references to
Tasks instead ofTaskIds (#156) - Expose
check_random_with_seed(#161) - Make
check_randomoptionally take a seed by providing the environment variableSHUTTLE_RANDOM_SEED(#161) - Shuttle Explorer extension (#163).
AnnotationSchedulerand annotated schedule support added under feature "annotation" (#163)
- Add
-
0.7.131 May 2024Release notes
Open source →- Implement
try_sendand iterators formpscchannels (#120) - Implement
get_mutforMutexandRwLock(#120)
- Implement
-
0.7.007 Mar 2024Release notes
Open source →- Add support for task labels. These replace task tags, which are deprecated and will be removed in a future release. (#138)
- In the meantime,
Tags are now implemented with a trait. This is a breaking change from 0.6.1. (#111) - Implement
is_finished()forfuture::JoinHandle(#118)
-
0.6.123 May 2023Release notes
Open source →- Add feature to tag tasks (#98)
- Add scheduler to check for uncontrolled nondeterminism (#96, #97)
- Support spurious wakeups for
thread::park(#101) - Support different leaders when
sync::Barrieris reused (#102) - Make
{Mutex, Condvar, RwLock}::newconst (#106) - Improve tracing spans (#99)
- Fix spurious deadlocks with
FuturesUnordered(#105) - Split schedule output over multiple lines (#103)
- Bump
futuresdependency (#107)
Release notes
Open source →- Add feature to tag tasks (#98)
- Add scheduler to check for uncontrolled nondeterminism (#96, #97)
- Support spurious wakeups for
thread::park(#101) - Support different leaders when
sync::Barrieris reused (#102) - Make
{Mutex, Condvar, RwLock}::newconst (#106) - Improve tracing spans (#99)
- Fix spurious deadlocks with
FuturesUnordered(#105) - Split schedule output over multiple lines (#103)
- Bump
futuresdependency (#107)
-
0.6.025 Jan 2023Release notes
Open source →This version renames the
silence_atomic_ordering_warningconfiguration option tosilence_warnings, as well as the corresponding environment variables, to enable future warnings to be controlled by the same mechanism.- Implement
lazy_staticsupport (#93)
Release notes
Open source →This version renames the
silence_atomic_ordering_warningconfiguration option tosilence_warnings, as well as the corresponding environment variables, to enable future warnings to be controlled by the same mechanism.- Implement
lazy_staticsupport (#93)
- Implement
-
0.5.023 Nov 2022Release notes
Open source →This version updates the embedded
randlibrary to v0.8. Tests that useshuttle::randwill need to update to the v0.8 interface ofrand, which included some breaking changes.Release notes
Open source →This version updates the embedded
randlibrary to v0.8. Tests that useshuttle::randwill need to update to the v0.8 interface ofrand, which included some breaking changes.- Update
randand other dependencies (#89) - Implement abort for
future::JoinHandle(#87) - Correctly handle the main thread's thread-local storage destructors (#88)
- Update
-
0.4.114 Nov 2022 -
0.4.029 Oct 2022 -
0.3.001 Sep 2022Release notes
Open source →Note that clients using async primitives provided by Shuttle (task
spawn,block_on,yield_now) will need to be updated due to the renaming of theasynchmodule tofuturein this release.- Rust 2021 conversion and dependency bumps (#76)
- Implement
thread::parkandthread::unpark(#77) - Implement
std::hint(#78) - Rename the
asynchmodule tofuture(#79)
-
0.2.007 Jul 2022Release notes
Open source →Note that failing test schedules created by versions of Shuttle before 0.2.0 will not successfully
replayon version 0.2.0, and vice versa, as the changes below affectMutexandRwLockscheduling decisions.- Implement
Mutex::try_lock(#71) - Implement
RwLock::{try_read, try_write}(#72) - Export a version of
std::sync::Weak(#69) - Provide better error messages for deadlocks caused by non-reentrant locking (#66)
- Implement
-
0.1.011 Apr 2022Release notes
Open source →- Implement
Condvar::wait_whileandCondvar::wait_timeout_while(#59) - Remove implicit
Sizedbounds onMutexandRwLock(#62) - Dependency updates (#58, #60)
- Implement
-
0.0.721 Sep 2021Release notes
Open source →- Fix a number of issues in support for async tasks (#50, #51, #52, #54)
- Improve error messages when using Shuttle primitives outside a Shuttle test (#42)
- Add support for thread local storage (the
thread_local!macro) (#43, #53) - Add support for
Oncecells (#49) - Simplify some dependencies to improve build times (#55)
- Move
context_switchesandmy_clockfunctions into a newcurrentmodule (#56)
-
0.0.608 Jul 2021Release notes
Open source →- Add support for
std::sync::atomic(#33) - Add
shuttle::context_switchesto get a logical clock for an execution (#37) - Track causality between threads (#38)
- Better handling for double panics and poisoned locks (#30, #40)
- Add option to not persist failures (#34)
- Add support for
-
0.0.511 Jun 2021Release notes
Open source →- Fix a performance regression with
tracingintroduced by #24 (#31) - Include default features for the
randcrate to fix compilation issues (#29)
- Fix a performance regression with
-
0.0.402 Jun 2021Release notes
Open source →- Add a timeout option to run tests for a fixed amount of time (#25)
- Include task ID in all
tracinglog output (#24) - Implement
thread::current(#23)
-
0.0.313 Apr 2021Release notes
Open source →- Update for Rust 1.51 (#11)
- Add option to bound how many steps a test runs on each iterations (#14)
- Remove option to configure the maximum number of threads/tasks (#16, #19)
- Make
yield_nowa hint to the scheduler to allow validating busy loops (#18) - Add
ReplayScheduler::new_from_file(#20)
-
0.0.219 Mar 2021Release notes
Open source →- Add Default impl to RwLock (#7)
- Add option to persist schedules to a file (#4)
-
0.0.103 Mar 2021 -
0.0.004 Oct 2020Nothing published for this version