mirror of
https://github.com/aljazceru/turso.git
synced 2025-12-26 12:34:22 +01:00
It was mentioned in https://github.com/tursodatabase/turso/pull/3720 that adding Miri support for `turso_stress` would be useful. And, that a bash script to start Miri with the right config would be a big help. Notable changes: - `antithesis_sdk`'s default features are disabled at the workspace level, and only enabled as needed with the `antithesis` feature flag in the various turso crates. Miri needs the noop version of `antithesis_sdk` to run `turso_stress`, and feature unification previously prevented this. I'm not able to ensure locally that all the Antithesis stuff is still happy with these changes. - Bash script to run `turso_stress` - this is barebones for now, see below - Bash script to run `simulator` - this passes any args to the `cargo run` invocation inside, intercepting `--seed` if it's present, and generating one from `/dev/random` if it's not. The seed is passed to both Miri and the simulator to keep the overall execution reproducible. (I checked this with a simple case) - A `const fn`, `normal_or_miri` to supply different defaults in things like CLI args for normal operation and Miri, since it's so slow. (An idea I stole from tokio.) Right now the relevant values are 100x smaller for Miri, although Miri is probably 1000 to 10,000x slower overall from a rough estimation. Caught UB from running `turso_stress` with Miri: - An unsafe cast of a `*u8` to `*u32` inside the BTree implementation resulted in the `*u32` making an unaligned read: `read()` -> `read_unaligned()` fixes this Future work - Making `turso_stress` reproducible under Miri: - Right now `turso_stress` is plugged in to Antithesis, which is great! But, `antithesis_sdk`'s noop mode (`default-features = false`) turns `antithesis_sdk::random::get_random()` into `rand::random<u64>()`, which isn't seedable/reproducible. It's more work than I wanted to take on in this PR, but I'd like to instead conditionally replace `get_random` with a seedable `ChaCha8Rng` like in the simulator, if Miri is being used. Comment: - On a machine without all necessary dependencies, running the bash scripts fails in a way that cargo prompts you through installing the nightly toolchain, Miri, etc. until it works - Below is a snippet of the output from Miri on the Btree alignment issue. Because turso_stress isn't yet deterministic/reproducible under Miri, I can't always reproduce it. (It doesn't always happen like the ones in my last MR) ``` error: Undefined Behavior: accessing memory based on pointer with alignment 1, but alignment 4 is required --> /home/rwp/git/turso/core/storage/btree.rs:2860:50 | 2860 | let mut pgno: u32 = unsafe { right_pointer.cast::<u32>().read().swap_bytes() }; | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Undefined Behavior occurred here | = help: this indicates a bug in the program: it performed an invalid operation, and caused Undefined Behavior = help: see https://doc.rust-lang.org/nightly/reference/behavior-considered-undefined.html for further information ``` Closes #3790