diff --git a/Cargo.lock b/Cargo.lock index d1517a0d2..c64aca54d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -26,7 +26,7 @@ checksum = "ac1f845298e95f983ff1944b728ae08b8cebab80d684f0a832ed0fc74dfa27e2" dependencies = [ "cfg-if", "cipher", - "cpufeatures", + "cpufeatures 0.2.12", ] [[package]] @@ -55,7 +55,7 @@ dependencies = [ "crucible-workspace-hack", "futures", "futures-core", - "rand 0.9.2", + "rand 0.10.0", "reqwest 0.13.2", "serde", "signal-hook", @@ -175,7 +175,7 @@ checksum = "3c3610892ee6e0cbce8ae2700349fcf8f98adb0dbfbee85aec3c9179d29cc072" dependencies = [ "base64ct", "blake2", - "cpufeatures", + "cpufeatures 0.2.12", "password-hash", ] @@ -665,6 +665,17 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" +[[package]] +name = "chacha20" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f8d983286843e49675a4b7a2d174efe136dc93a18d69130dd18198a6c167601" +dependencies = [ + "cfg-if", + "cpufeatures 0.3.0", + "rand_core 0.10.0", +] + [[package]] name = "chrono" version = "0.4.42" @@ -985,6 +996,15 @@ dependencies = [ "libc", ] +[[package]] +name = "cpufeatures" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b2a41393f66f16b0823bb79094d54ac5fbd34ab292ddafb9a0456ac9f87d201" +dependencies = [ + "libc", +] + [[package]] name = "crc32fast" version = "1.3.2" @@ -1100,8 +1120,8 @@ dependencies = [ "oximeter", "oximeter-producer", "proptest", - "rand 0.9.2", - "rand_chacha 0.9.0", + "rand 0.10.0", + "rand_chacha 0.10.0", "rayon", "reqwest 0.12.24", "reqwest 0.13.2", @@ -1287,8 +1307,8 @@ dependencies = [ "opentelemetry-jaeger", "oximeter", "oximeter-producer", - "rand 0.9.2", - "rand_chacha 0.9.0", + "rand 0.10.0", + "rand_chacha 0.10.0", "rangemap", "rayon", "repair-client", @@ -1374,7 +1394,7 @@ dependencies = [ "crucible-workspace-hack", "opentelemetry 0.31.0", "opentelemetry-jaeger", - "rand 0.9.2", + "rand 0.10.0", "tokio", "tracing-opentelemetry", "tracing-subscriber", @@ -1399,7 +1419,7 @@ dependencies = [ "futures-core", "hex", "httptest", - "rand 0.9.2", + "rand 0.10.0", "repair-client", "reqwest 0.13.2", "serde", @@ -1722,8 +1742,8 @@ dependencies = [ "omicron-common", "oximeter", "oximeter-producer", - "rand 0.9.2", - "rand_chacha 0.9.0", + "rand 0.10.0", + "rand_chacha 0.10.0", "reedline", "repair-client", "ringbuffer", @@ -2206,8 +2226,8 @@ dependencies = [ "expectorate", "openapi-lint", "openapiv3", - "rand 0.9.2", - "rand_chacha 0.9.0", + "rand 0.10.0", + "rand_chacha 0.10.0", "schemars", "semver 1.0.27", "serde", @@ -2769,6 +2789,20 @@ dependencies = [ "windows-targets 0.52.6", ] +[[package]] +name = "getrandom" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0de51e6874e94e7bf76d726fc5d13ba782deca734ff60d5bb2fb2607c7406555" +dependencies = [ + "cfg-if", + "libc", + "r-efi", + "rand_core 0.10.0", + "wasip2", + "wasip3", +] + [[package]] name = "git2" version = "0.20.2" @@ -3383,6 +3417,12 @@ dependencies = [ "zerovec", ] +[[package]] +name = "id-arena" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d3067d79b975e8844ca9eb072e16b31c3c1c36928edf9c6789548c524d0d954" + [[package]] name = "id-map" version = "0.1.0" @@ -3816,6 +3856,12 @@ version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" +[[package]] +name = "leb128fmt" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2" + [[package]] name = "libc" version = "0.2.177" @@ -4032,7 +4078,7 @@ dependencies = [ "crucible", "crucible-common", "crucible-workspace-hack", - "rand 0.9.2", + "rand 0.10.0", "statistical", "tokio", "uuid", @@ -5437,7 +5483,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d52cff9d1d4dee5fe6d03729099f4a310a41179e0a10dbf542039873f2e826fb" dependencies = [ "cfg-if", - "cpufeatures", + "cpufeatures 0.2.12", "opaque-debug", "universal-hash", ] @@ -5887,6 +5933,12 @@ dependencies = [ "proc-macro2", ] +[[package]] +name = "r-efi" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" + [[package]] name = "radium" version = "0.7.0" @@ -5933,6 +5985,17 @@ dependencies = [ "rand_core 0.9.3", ] +[[package]] +name = "rand" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc266eb313df6c5c09c1c7b1fbe2510961e5bcd3add930c1e31f7ed9da0feff8" +dependencies = [ + "chacha20", + "getrandom 0.4.2", + "rand_core 0.10.0", +] + [[package]] name = "rand_chacha" version = "0.1.1" @@ -5963,6 +6026,16 @@ dependencies = [ "rand_core 0.9.3", ] +[[package]] +name = "rand_chacha" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e6af7f3e25ded52c41df4e0b1af2d047e45896c2f3281792ed68a1c243daedb" +dependencies = [ + "ppv-lite86", + "rand_core 0.10.0", +] + [[package]] name = "rand_core" version = "0.3.1" @@ -5996,6 +6069,12 @@ dependencies = [ "getrandom 0.3.1", ] +[[package]] +name = "rand_core" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c8d0fd677905edcbeedbf2edb6494d676f0e98d54d5cf9bda0b061cb8fb8aba" + [[package]] name = "rand_hc" version = "0.1.0" @@ -7015,7 +7094,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" dependencies = [ "cfg-if", - "cpufeatures", + "cpufeatures 0.2.12", "digest", ] @@ -7026,7 +7105,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" dependencies = [ "cfg-if", - "cpufeatures", + "cpufeatures 0.2.12", "digest", ] @@ -8820,6 +8899,24 @@ dependencies = [ "wit-bindgen-rt", ] +[[package]] +name = "wasip2" +version = "1.0.2+wasi-0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9517f9239f02c069db75e65f174b3da828fe5f5b945c4dd26bd25d89c03ebcf5" +dependencies = [ + "wit-bindgen", +] + +[[package]] +name = "wasip3" +version = "0.4.0+wasi-0.3.0-rc-2026-01-06" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5428f8bf88ea5ddc08faddef2ac4a67e390b88186c703ce6dbd955e1c145aca5" +dependencies = [ + "wit-bindgen", +] + [[package]] name = "wasite" version = "0.1.0" @@ -8885,6 +8982,28 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "wasm-encoder" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "990065f2fe63003fe337b932cfb5e3b80e0b4d0f5ff650e6985b1048f62c8319" +dependencies = [ + "leb128fmt", + "wasmparser", +] + +[[package]] +name = "wasm-metadata" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb0e353e6a2fbdc176932bbaab493762eb1255a7900fe0fea1a2f96c296cc909" +dependencies = [ + "anyhow", + "indexmap", + "wasm-encoder", + "wasmparser", +] + [[package]] name = "wasm-streams" version = "0.4.0" @@ -8911,6 +9030,18 @@ dependencies = [ "web-sys", ] +[[package]] +name = "wasmparser" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47b807c72e1bac69382b3a6fb3dbe8ea4c0ed87ff5629b8685ae6b9a611028fe" +dependencies = [ + "bitflags 2.9.4", + "hashbrown 0.15.2", + "indexmap", + "semver 1.0.27", +] + [[package]] name = "web-sys" version = "0.3.85" @@ -9475,6 +9606,26 @@ version = "0.0.19" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d135d17ab770252ad95e9a872d365cf3090e3be864a34ab46f48555993efc904" +[[package]] +name = "wit-bindgen" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7249219f66ced02969388cf2bb044a09756a083d0fab1e566056b04d9fbcaa5" +dependencies = [ + "wit-bindgen-rust-macro", +] + +[[package]] +name = "wit-bindgen-core" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea61de684c3ea68cb082b7a88508a8b27fcc8b797d738bfc99a82facf1d752dc" +dependencies = [ + "anyhow", + "heck 0.5.0", + "wit-parser", +] + [[package]] name = "wit-bindgen-rt" version = "0.33.0" @@ -9484,6 +9635,74 @@ dependencies = [ "bitflags 2.9.4", ] +[[package]] +name = "wit-bindgen-rust" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7c566e0f4b284dd6561c786d9cb0142da491f46a9fbed79ea69cdad5db17f21" +dependencies = [ + "anyhow", + "heck 0.5.0", + "indexmap", + "prettyplease", + "syn 2.0.117", + "wasm-metadata", + "wit-bindgen-core", + "wit-component", +] + +[[package]] +name = "wit-bindgen-rust-macro" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c0f9bfd77e6a48eccf51359e3ae77140a7f50b1e2ebfe62422d8afdaffab17a" +dependencies = [ + "anyhow", + "prettyplease", + "proc-macro2", + "quote", + "syn 2.0.117", + "wit-bindgen-core", + "wit-bindgen-rust", +] + +[[package]] +name = "wit-component" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d66ea20e9553b30172b5e831994e35fbde2d165325bec84fc43dbf6f4eb9cb2" +dependencies = [ + "anyhow", + "bitflags 2.9.4", + "indexmap", + "log", + "serde", + "serde_derive", + "serde_json", + "wasm-encoder", + "wasm-metadata", + "wasmparser", + "wit-parser", +] + +[[package]] +name = "wit-parser" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ecc8ac4bc1dc3381b7f59c34f00b67e18f910c2c0f50015669dde7def656a736" +dependencies = [ + "anyhow", + "id-arena", + "indexmap", + "log", + "semver 1.0.27", + "serde", + "serde_derive", + "serde_json", + "unicode-xid", + "wasmparser", +] + [[package]] name = "writeable" version = "0.6.1" diff --git a/Cargo.toml b/Cargo.toml index 975b74343..a0f0ab2f3 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -88,8 +88,8 @@ progenitor = "0.13.0" progenitor-client = "0.13.0" proptest = "1.9.0" rayon = "1.11.0" -rand = { version = "0.9.2", features = [ "small_rng"] } -rand_chacha = "0.9.0" +rand = "0.10.0" +rand_chacha = "0.10.0" reedline = "0.43.0" rangemap = "1.7.0" reqwest = { version = "0.13", features = ["default", "blocking", "json", "stream"] } diff --git a/crutest/src/cli.rs b/crutest/src/cli.rs index fd651c71f..81ea7c8a1 100644 --- a/crutest/src/cli.rs +++ b/crutest/src/cli.rs @@ -260,7 +260,7 @@ async fn rand_write( /* * TODO: Allow the user to specify a seed here. */ - let mut rng = rand_chacha::ChaCha8Rng::from_os_rng(); + let mut rng = rand::make_rng::(); /* * Once we have our IO size, decide where the starting offset should @@ -913,7 +913,7 @@ async fn process_cli_command( } CliMessage::RandRead => { if let Some(di) = di_option { - let mut rng = rand_chacha::ChaCha8Rng::from_os_rng(); + let mut rng = rand::make_rng::(); let size = 1; let block_max = di.volume_info.total_blocks() - size + 1; let offset = rng.random_range(0..block_max); diff --git a/crutest/src/main.rs b/crutest/src/main.rs index 001794170..f1813bdfc 100644 --- a/crutest/src/main.rs +++ b/crutest/src/main.rs @@ -8,7 +8,6 @@ use human_bytes::human_bytes; use indicatif::{ProgressBar, ProgressStyle}; use oximeter::types::ProducerRegistry; use rand::prelude::*; -use rand_chacha::rand_core::SeedableRng; use serde::{Deserialize, Serialize}; use signal_hook::consts::signal::*; use signal_hook_tokio::Signals; @@ -2021,7 +2020,7 @@ async fn fill_sparse_workload( volume: &Volume, di: &mut DiskInfo, ) -> Result<()> { - let mut rng = rand_chacha::ChaCha8Rng::from_os_rng(); + let mut rng = rand::make_rng::(); let mut extent_block_start = 0; // We loop over all sub volumes, doing one write to each extent. @@ -2073,7 +2072,7 @@ async fn generic_workload( /* * TODO: Allow the user to specify a seed here. */ - let mut rng = rand_chacha::ChaCha8Rng::from_os_rng(); + let mut rng = rand::make_rng::(); let count_width = match wtq { WhenToQuit::Count { count } => count.to_string().len(), @@ -2249,7 +2248,7 @@ async fn yolo_workload( range: bool, ) -> Result<()> { // TODO: Allow the user to specify a seed here. - let mut rng = rand_chacha::ChaCha8Rng::from_os_rng(); + let mut rng = rand::make_rng::(); let total_blocks = di.volume_info.total_blocks(); @@ -2418,7 +2417,7 @@ async fn replay_workload( dsc_client: Client, ds_count: u32, ) -> Result<()> { - let mut rng = rand_chacha::ChaCha8Rng::from_os_rng(); + let mut rng = rand::make_rng::(); let mut generic_wtq = WhenToQuit::Count { count: 300 }; for c in 1.. { @@ -3013,7 +3012,7 @@ async fn dirty_workload( /* * TODO: Allow the user to specify a seed here. */ - let mut rng = rand_chacha::ChaCha8Rng::from_os_rng(); + let mut rng = rand::make_rng::(); /* * To store our write requests @@ -3150,7 +3149,7 @@ async fn rand_read_write_workload( RandReadWriteMode::Write => { let mut buf = BytesMut::new(); buf.resize(cfg.blocks_per_io * block_size, 0u8); - let mut rng = rand_chacha::ChaCha8Rng::from_os_rng(); + let mut rng = rand::make_rng::(); rng.fill_bytes(&mut buf); while !stop.load(Ordering::Acquire) { let offset = rng @@ -3164,7 +3163,7 @@ async fn rand_read_write_workload( } RandReadWriteMode::Read => { let mut buf = Buffer::new(cfg.blocks_per_io, block_size); - let mut rng = rand_chacha::ChaCha8Rng::from_os_rng(); + let mut rng = rand::make_rng::(); while !stop.load(Ordering::Acquire) { let offset = rng .random_range(0..=total_blocks - cfg.blocks_per_io); @@ -3314,7 +3313,7 @@ async fn bufferbloat_workload( let handle = tokio::spawn(async move { let mut buf = BytesMut::new(); buf.resize(cfg.blocks_per_io * block_size, 0u8); - let mut rng = rand_chacha::ChaCha8Rng::from_os_rng(); + let mut rng = rand::make_rng::(); rng.fill_bytes(&mut buf); while !stop.load(Ordering::Acquire) { let offset = @@ -3391,7 +3390,7 @@ async fn one_workload(volume: &Volume, di: &mut DiskInfo) -> Result<()> { /* * TODO: Allow the user to specify a seed here. */ - let mut rng = rand_chacha::ChaCha8Rng::from_os_rng(); + let mut rng = rand::make_rng::(); /* * Once we have our IO size, decide where the starting offset should @@ -3525,7 +3524,7 @@ async fn write_flush_read_workload( /* * TODO: Allow the user to specify a seed here. */ - let mut rng = rand_chacha::ChaCha8Rng::from_os_rng(); + let mut rng = rand::make_rng::(); let count_width = count.to_string().len(); let block_size = di.volume_info.block_size; @@ -3650,7 +3649,7 @@ async fn repair_workload( di: &mut DiskInfo, ) -> Result<()> { // TODO: Allow the user to specify a seed here. - let mut rng = rand_chacha::ChaCha8Rng::from_os_rng(); + let mut rng = rand::make_rng::(); // TODO: Allow user to request r/w/f percentage (how???) // We want at least one write, otherwise there will be nothing to @@ -3761,7 +3760,7 @@ async fn demo_workload( di: &mut DiskInfo, ) -> Result<()> { // TODO: Allow the user to specify a seed here. - let mut rng = rand_chacha::ChaCha8Rng::from_os_rng(); + let mut rng = rand::make_rng::(); // Because this workload issues a bunch of IO all at the same time, // we can't be sure the order will be preserved for our IOs. diff --git a/downstairs/src/dynamometer.rs b/downstairs/src/dynamometer.rs index 57b233e54..d04c4fe0e 100644 --- a/downstairs/src/dynamometer.rs +++ b/downstairs/src/dynamometer.rs @@ -35,7 +35,7 @@ pub fn dynamometer( // Fill test: write bytes in whole region - let mut rng = SmallRng::from_os_rng(); + let mut rng: SmallRng = rand::make_rng(); 'outer: loop { let block = (0..ddef.block_size() as usize) diff --git a/downstairs/src/extent_inner_sqlite.rs b/downstairs/src/extent_inner_sqlite.rs index 61b4964bd..c7b9e5223 100644 --- a/downstairs/src/extent_inner_sqlite.rs +++ b/downstairs/src/extent_inner_sqlite.rs @@ -1289,7 +1289,7 @@ mod test { use super::*; use bytes::{Bytes, BytesMut}; use crucible_common::BlockOffset; - use rand::RngCore; + use rand::Rng; use tempfile::tempdir; const IOV_MAX_TEST: usize = 1000; diff --git a/downstairs/src/lib.rs b/downstairs/src/lib.rs index 683e925a7..b541a0d3f 100644 --- a/downstairs/src/lib.rs +++ b/downstairs/src/lib.rs @@ -5253,7 +5253,7 @@ mod test { let mut random_data = vec![0; total_bytes as usize]; random_data.resize(total_bytes as usize, 0); - let mut rng = ChaCha20Rng::from_os_rng(); + let mut rng = rand::make_rng::(); rng.fill_bytes(&mut random_data); // write random_data to file @@ -5321,7 +5321,7 @@ mod test { let mut random_data = vec![0; total_bytes as usize]; random_data.resize(total_bytes as usize, 0); - let mut rng = ChaCha20Rng::from_os_rng(); + let mut rng = rand::make_rng::(); rng.fill_bytes(&mut random_data); // write random_data to file @@ -5403,7 +5403,7 @@ mod test { let mut random_data = vec![0; total_bytes as usize]; random_data.resize(total_bytes as usize, 0); - let mut rng = ChaCha20Rng::from_os_rng(); + let mut rng = rand::make_rng::(); rng.fill_bytes(&mut random_data); // write random_data to file @@ -5486,7 +5486,7 @@ mod test { let mut random_data = vec![0u8; total_bytes as usize]; random_data.resize(total_bytes as usize, 0u8); - let mut rng = ChaCha20Rng::from_os_rng(); + let mut rng = rand::make_rng::(); rng.fill_bytes(&mut random_data); // write random_data to file diff --git a/downstairs/src/region.rs b/downstairs/src/region.rs index 32b09aea0..cf9554960 100644 --- a/downstairs/src/region.rs +++ b/downstairs/src/region.rs @@ -1266,7 +1266,7 @@ pub(crate) mod test { use std::fs::rename; use std::path::PathBuf; - use rand::RngCore; + use rand::Rng; use tempfile::tempdir; use uuid::Uuid; diff --git a/dsc/src/main.rs b/dsc/src/main.rs index a5fd03f7e..f97689873 100644 --- a/dsc/src/main.rs +++ b/dsc/src/main.rs @@ -810,7 +810,7 @@ async fn do_dsc_work( work: DscCmd, action_tx_list: &[mpsc::Sender], ) { - let mut rng = rand_chacha::ChaCha8Rng::from_os_rng(); + let mut rng = rand_chacha::ChaCha8Rng::seed_from_u64(rand::random()); match work { DscCmd::Start(cid) => { @@ -979,7 +979,7 @@ async fn start_dsc( } } - let mut rng = rand_chacha::ChaCha8Rng::from_os_rng(); + let mut rng = rand_chacha::ChaCha8Rng::seed_from_u64(rand::random()); let mut timeout_deadline = Instant::now() + Duration::from_secs(5); let mut shutdown_sent = false; let mut random_restart = false; diff --git a/hammer/src/main.rs b/hammer/src/main.rs index 2cace893b..5fa6d84c8 100644 --- a/hammer/src/main.rs +++ b/hammer/src/main.rs @@ -129,7 +129,7 @@ async fn main() -> Result<()> { cpfs.push(crucible::CruciblePseudoFile::from(guest)?); } - use rand::Rng; + use rand::RngExt; let mut rng = rand::rng(); let rounds = 1500; diff --git a/measure_iops/src/main.rs b/measure_iops/src/main.rs index 6538d2c10..b329090d5 100644 --- a/measure_iops/src/main.rs +++ b/measure_iops/src/main.rs @@ -5,7 +5,7 @@ use std::sync::Arc; use anyhow::{Result, bail}; use clap::Parser; -use rand::Rng; +use rand::RngExt; use tokio::time::{Duration, Instant}; use uuid::Uuid; diff --git a/upstairs/src/buffer.rs b/upstairs/src/buffer.rs index 0fd3e48dc..cc054b534 100644 --- a/upstairs/src/buffer.rs +++ b/upstairs/src/buffer.rs @@ -374,7 +374,7 @@ impl UninitializedBuffer { #[cfg(test)] mod test { use super::*; - use rand::RngCore; + use rand::Rng; #[test] fn test_buffer_sane() { diff --git a/upstairs/src/pseudo_file.rs b/upstairs/src/pseudo_file.rs index 35f4e1e9f..93c00ec2c 100644 --- a/upstairs/src/pseudo_file.rs +++ b/upstairs/src/pseudo_file.rs @@ -379,7 +379,7 @@ impl CruciblePseudoFile { #[cfg(test)] mod test { use super::*; - use rand::Rng; + use rand::RngExt; #[tokio::test(flavor = "multi_thread", worker_threads = 2)] async fn test_pseudo_file_sane() -> Result<()> {