From 8c9d0cbe8e26a7b5a8b9fd740ccad1c7dbcb83e2 Mon Sep 17 00:00:00 2001 From: John Vandenberg Date: Mon, 15 Dec 2025 20:54:23 +0800 Subject: [PATCH 1/2] feat: Add miri testing support Signed-off-by: John Vandenberg --- .cargo/config.toml | 3 + .dockerignore | 24 ++++++ .github/workflows/miri.yml | 70 +++++++++++++++++ Cargo.toml | 2 +- Dockerfile.miri | 21 +++++ docker-compose.yaml | 17 ++++ foyer-common/src/runtime.rs | 8 +- foyer-memory/src/cache.rs | 5 ++ foyer-memory/src/eviction/lru.rs | 1 + foyer-memory/src/raw.rs | 5 ++ foyer-storage/Cargo.toml | 6 +- foyer-storage/src/engine/block/buffer.rs | 16 +++- foyer-storage/src/engine/block/engine.rs | 11 +++ foyer-storage/src/engine/block/eviction.rs | 2 + foyer-storage/src/engine/block/scanner.rs | 2 + foyer-storage/src/engine/block/tombstone.rs | 1 + foyer-storage/src/filter.rs | 1 + foyer-storage/src/io/bytes.rs | 6 ++ foyer-storage/src/io/device/file.rs | 22 ++++-- foyer-storage/src/io/device/fs.rs | 15 +++- foyer-storage/src/io/device/statistics.rs | 23 +++++- foyer-storage/src/io/device/throttle.rs | 2 + foyer-storage/src/io/engine/mod.rs | 9 ++- foyer-storage/src/store.rs | 5 +- foyer-storage/tests/storage_fuzzy_test.rs | 6 ++ foyer/Cargo.toml | 9 ++- foyer/src/hybrid/cache.rs | 86 +++++++++++++++++++++ foyer/src/lib.rs | 3 +- foyer/tests/hybrid_cache_fuzzy_test.rs | 2 + 29 files changed, 354 insertions(+), 29 deletions(-) create mode 100644 .dockerignore create mode 100644 .github/workflows/miri.yml create mode 100644 Dockerfile.miri diff --git a/.cargo/config.toml b/.cargo/config.toml index 952355e2..2961078a 100644 --- a/.cargo/config.toml +++ b/.cargo/config.toml @@ -3,3 +3,6 @@ rustflags = ["--cfg", "tokio_unstable"] [alias] x = "run --package xtask --" + +[env] +MIRIFLAGS = "-Zmiri-disable-isolation" diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 00000000..70bb2527 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,24 @@ +# Build artifacts +target/ +!target/CACHEDIR.TAG + +# IDE +.vscode/ +.idea/ + +# Git +.git/ +.gitignore + +# Logs +*.log + +# Documentation build +website/node_modules/ +website/build/ + +# Miri clone (if present) +miri/ + +# macOS +.DS_Store diff --git a/.github/workflows/miri.yml b/.github/workflows/miri.yml new file mode 100644 index 00000000..6d7bad58 --- /dev/null +++ b/.github/workflows/miri.yml @@ -0,0 +1,70 @@ +name: "Miri" + +on: + push: + branches: + - "main" + - "forks/*" + - release-*.* + pull_request: + branches: + - "main" + - "v*.*.*-rc" + - release-*.* + schedule: + # Run weekly on Monday at 00:00 UTC + - cron: '0 0 * * 1' + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }}-${{ github.event_name }} + cancel-in-progress: ${{ github.event_name == 'pull_request' }} + +env: + RUST_TOOLCHAIN_NIGHTLY: nightly-2025-02-20 + CARGO_TERM_COLOR: always + CACHE_KEY_SUFFIX: 20251109 + +jobs: + miri-test: + name: miri test + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + persist-credentials: false + + - name: Install rust toolchain + uses: dtolnay/rust-toolchain@master + with: + toolchain: ${{ env.RUST_TOOLCHAIN_NIGHTLY }} + components: miri + + - name: Cache Cargo home + uses: actions/cache@v4 + id: cache + with: + path: | + ~/.cargo/bin/ + ~/.cargo/registry/index/ + ~/.cargo/registry/cache/ + ~/.cargo/git/db/ + key: ${{ runner.os }}-${{ runner.arch }}-cargo-${{ hashFiles('**/Cargo.toml') }}-${{ env.CACHE_KEY_SUFFIX }}-miri-isolated + + - name: Setup miri + env: + RUST_TOOLCHAIN_NIGHTLY: ${{ env.RUST_TOOLCHAIN_NIGHTLY }} + run: | + cargo +$RUST_TOOLCHAIN_NIGHTLY miri setup + + # Run with stricter miri flags (isolation enabled, more checking) + - name: Run isolated miri tests (strict mode) + env: + RUST_BACKTRACE: 1 + RUST_TOOLCHAIN_NIGHTLY: ${{ env.RUST_TOOLCHAIN_NIGHTLY }} + timeout-minutes: 10 + run: | + cargo +$RUST_TOOLCHAIN_NIGHTLY miri test -p foyer-common --no-default-features + cargo +$RUST_TOOLCHAIN_NIGHTLY miri test -p foyer-memory --no-default-features --features test_utils + cargo +$RUST_TOOLCHAIN_NIGHTLY miri test -p foyer-storage --no-default-features --features test_utils + cargo +$RUST_TOOLCHAIN_NIGHTLY miri test -p foyer --no-default-features --features test_utils diff --git a/Cargo.toml b/Cargo.toml index cf3129e5..69cee3bd 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -48,7 +48,7 @@ fastrace-opentelemetry = "0.14" foyer = { version = "0.22.0-dev", path = "foyer" } foyer-common = { version = "0.22.0-dev", path = "foyer-common" } foyer-memory = { version = "0.22.0-dev", path = "foyer-memory" } -foyer-storage = { version = "0.22.0-dev", path = "foyer-storage" } +foyer-storage = { version = "0.22.0-dev", path = "foyer-storage", default-features = false } fs4 = { version = "0.13", default-features = false } futures-core = { version = "0.3" } futures-util = { version = "0.3", default-features = false, features = ["std"] } diff --git a/Dockerfile.miri b/Dockerfile.miri new file mode 100644 index 00000000..ec2e3b7c --- /dev/null +++ b/Dockerfile.miri @@ -0,0 +1,21 @@ +# Dockerfile for running miri tests on Linux +# Miri's tokio support requires Linux (epoll shims only, not macOS kqueue) + +FROM rust:latest + +# Nightly toolchain version for miri +ARG NIGHTLY_VERSION=nightly-2025-02-20 + +# Install specific nightly toolchain and miri components +RUN rustup toolchain install ${NIGHTLY_VERSION} && \ + rustup component add --toolchain ${NIGHTLY_VERSION} miri rust-src && \ + cargo +${NIGHTLY_VERSION} miri setup + +# Set miri flags for testing +ENV MIRIFLAGS="-Zmiri-disable-isolation" + +# Set working directory +WORKDIR /workspace + +# Default command: run all miri tests +CMD ["sh", "-c", "cargo +${NIGHTLY_VERSION} miri test -p foyer --no-default-features"] diff --git a/docker-compose.yaml b/docker-compose.yaml index cd124874..da567a88 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -1,4 +1,21 @@ services: + # Miri testing service for Linux (tokio support via epoll shims) + # Note: macOS tokio is not supported by miri - use Linux container for testing + miri: + build: + context: . + dockerfile: Dockerfile.miri + volumes: + - .:/workspace + environment: + # Optional: Add miri flags for stricter checking + # MIRIFLAGS: "-Zmiri-strict-provenance -Zmiri-symbolic-alignment-check" + - RUST_BACKTRACE=1 + command: cargo +nightly miri test -p foyer --lib --no-default-features + + # Monitoring stack services (for performance profiling and metrics) + # node-exporter collects system-level metrics (CPU, memory, disk, network) + # Used by Prometheus for monitoring foyer-bench and other performance tests node-exporter: image: prom/node-exporter:latest container_name: node-exporter diff --git a/foyer-common/src/runtime.rs b/foyer-common/src/runtime.rs index c16da2c9..b02c89fd 100644 --- a/foyer-common/src/runtime.rs +++ b/foyer-common/src/runtime.rs @@ -94,7 +94,7 @@ impl SingletonHandle { /// /// # Examples /// - /// ``` + /// ```ignore (miri) /// use tokio::runtime::Runtime; /// /// # fn dox() { @@ -122,7 +122,7 @@ impl SingletonHandle { /// /// # Examples /// - /// ``` + /// ```ignore (miri) /// use tokio::runtime::Runtime; /// /// # fn dox() { @@ -173,7 +173,7 @@ impl SingletonHandle { /// /// # Examples /// - /// ``` + /// ```ignore (miri) /// use tokio::runtime::Runtime; /// /// // Create the runtime @@ -190,7 +190,7 @@ impl SingletonHandle { /// /// Or using `Handle::current`: /// - /// ``` + /// ```ignore (miri) /// use tokio::runtime::Handle; /// /// #[tokio::main] diff --git a/foyer-memory/src/cache.rs b/foyer-memory/src/cache.rs index 3adddff8..e3b3659f 100644 --- a/foyer-memory/src/cache.rs +++ b/foyer-memory/src/cache.rs @@ -1257,26 +1257,31 @@ mod tests { } #[tokio::test] + #[cfg_attr(miri, ignore = "hangs under miri - needs investigation")] async fn test_fifo_cache() { case(fifo()).await } #[tokio::test] + #[cfg_attr(miri, ignore = "hangs under miri - needs investigation")] async fn test_lru_cache() { case(lru()).await } #[tokio::test] + #[cfg_attr(miri, ignore = "hangs under miri - needs investigation")] async fn test_lfu_cache() { case(lfu()).await } #[tokio::test] + #[cfg_attr(miri, ignore = "hangs under miri - needs investigation")] async fn test_s3fifo_cache() { case(s3fifo()).await } #[tokio::test] + #[cfg_attr(miri, ignore = "hangs under miri - needs investigation")] async fn test_sieve_cache() { case(sieve()).await } diff --git a/foyer-memory/src/eviction/lru.rs b/foyer-memory/src/eviction/lru.rs index fe255a24..b44c3e6f 100644 --- a/foyer-memory/src/eviction/lru.rs +++ b/foyer-memory/src/eviction/lru.rs @@ -212,6 +212,7 @@ where (false, false) => unsafe { self.list.remove_from_ptr(Arc::as_ptr(record)) }, }; + #[cfg(not(miri))] strict_assert!(!state.link.is_linked()); record.set_in_eviction(false); diff --git a/foyer-memory/src/raw.rs b/foyer-memory/src/raw.rs index e3223abe..b5e2828c 100644 --- a/foyer-memory/src/raw.rs +++ b/foyer-memory/src/raw.rs @@ -1807,6 +1807,7 @@ mod tests { } #[test_log::test] + #[cfg_attr(miri, ignore = "takes longer than 30 minutes")] fn test_fifo_cache_fuzzy() { let cache: RawCache, ModHasher, HashTableIndexer<_>> = RawCache::new(RawCacheConfig { @@ -1824,6 +1825,7 @@ mod tests { } #[test_log::test] + #[cfg_attr(miri, ignore = "takes longer than 30 minutes")] fn test_s3fifo_cache_fuzzy() { let cache: RawCache, ModHasher, HashTableIndexer<_>> = RawCache::new(RawCacheConfig { @@ -1841,6 +1843,7 @@ mod tests { } #[test_log::test] + #[cfg_attr(miri, ignore = "takes longer than 30 minutes")] fn test_lru_cache_fuzzy() { let cache: RawCache, ModHasher, HashTableIndexer<_>> = RawCache::new(RawCacheConfig { @@ -1858,6 +1861,7 @@ mod tests { } #[test_log::test] + #[cfg_attr(miri, ignore = "takes longer than 30 minutes")] fn test_lfu_cache_fuzzy() { let cache: RawCache, ModHasher, HashTableIndexer<_>> = RawCache::new(RawCacheConfig { @@ -1875,6 +1879,7 @@ mod tests { } #[test_log::test] + #[cfg_attr(miri, ignore = "takes longer than 30 minutes")] fn test_sieve_cache_fuzzy() { let cache: RawCache, ModHasher, HashTableIndexer<_>> = RawCache::new(RawCacheConfig { diff --git a/foyer-storage/Cargo.toml b/foyer-storage/Cargo.toml index c649c852..d0526b5d 100644 --- a/foyer-storage/Cargo.toml +++ b/foyer-storage/Cargo.toml @@ -13,8 +13,8 @@ readme = { workspace = true } exclude.workspace = true [features] -default = [] -serde = ["dep:serde"] +default = ["fastant"] +serde = ["dep:serde", "foyer-common/serde"] clap = ["dep:clap"] tracing = ["dep:fastrace", "foyer-common/tracing", "foyer-memory/tracing"] nightly = ["allocator-api2/nightly", "hashbrown/nightly"] @@ -31,7 +31,7 @@ anyhow = { workspace = true } bytes = { workspace = true } clap = { workspace = true, optional = true } equivalent = { workspace = true } -fastant = { workspace = true, features = ["atomic"] } +fastant = { workspace = true, features = ["atomic"], optional = true } fastrace = { workspace = true, optional = true } foyer-common = { workspace = true } foyer-memory = { workspace = true } diff --git a/foyer-storage/src/engine/block/buffer.rs b/foyer-storage/src/engine/block/buffer.rs index efa00cec..768349b1 100644 --- a/foyer-storage/src/engine/block/buffer.rs +++ b/foyer-storage/src/engine/block/buffer.rs @@ -496,6 +496,8 @@ mod tests { const KB: usize = 1024; #[test_log::test] + #[cfg_attr(all(miri, not(target_os = "linux")), ignore = "requires Linux for tokio+miri")] + #[cfg_attr(all(miri, target_os = "linux"), ignore = "issue 1223")] fn test_blob_index_serde() { let mut bi = BlobIndex::new(IoSliceMut::new(PAGE * 2)); let indices = (0..bi.capacity() / 2) @@ -519,6 +521,8 @@ mod tests { } #[test_log::test] + #[cfg_attr(all(miri, not(target_os = "linux")), ignore = "requires Linux for tokio+miri")] + #[cfg_attr(all(miri, target_os = "linux"), ignore = "issue 1223")] fn test_buffer() { const BLOCK_SIZE: usize = 16 * KB; const BLOB_INDEX_SIZE: usize = 4 * KB; @@ -678,6 +682,8 @@ mod tests { } #[test_log::test] + #[cfg_attr(all(miri, not(target_os = "linux")), ignore = "requires Linux for tokio+miri")] + #[cfg_attr(all(miri, target_os = "linux"), ignore = "issue 1223")] fn test_split_block_last_entry() { const KB: usize = 1 << 10; @@ -689,7 +695,15 @@ mod tests { let mut ctx = SplitCtx::new(BLOCK_SIZE, BLOB_INDEX_SIZE); ctx.current_blob_block_offset = 40 * KB; ctx.current_part_blob_offset = 16 * KB; - ctx.current_blob_index.count = ctx.current_blob_index.capacity() - 1; + // Fill the index with dummy entries to match the count we're setting + for _ in 0..ctx.current_blob_index.capacity() - 1 { + ctx.current_blob_index.write(&BlobEntryIndex { + hash: u64::MAX, + sequence: u64::MAX, + offset: 0, + len: 0, + }); + } let shared_io_slice = IoSliceMut::new(BATCH_SIZE).into_io_slice(); let batch = Splitter::split( diff --git a/foyer-storage/src/engine/block/engine.rs b/foyer-storage/src/engine/block/engine.rs index b4a7755c..f6156933 100644 --- a/foyer-storage/src/engine/block/engine.rs +++ b/foyer-storage/src/engine/block/engine.rs @@ -981,6 +981,8 @@ mod tests { } #[test_log::test(tokio::test)] + #[cfg_attr(all(miri, not(target_os = "linux")), ignore = "requires Linux for tokio+miri")] + #[cfg_attr(all(miri, target_os = "linux"), ignore = "deadlocks under miri")] async fn test_store_enqueue_lookup_recovery() { let dir = tempfile::tempdir().unwrap(); @@ -1076,6 +1078,8 @@ mod tests { } #[test_log::test(tokio::test)] + #[cfg_attr(all(miri, not(target_os = "linux")), ignore = "requires Linux for tokio+miri")] + #[cfg_attr(all(miri, target_os = "linux"), ignore = "deadlocks under miri")] async fn test_store_delete_recovery() { let dir = tempfile::tempdir().unwrap(); @@ -1135,6 +1139,8 @@ mod tests { } #[test_log::test(tokio::test)] + #[cfg_attr(all(miri, not(target_os = "linux")), ignore = "requires Linux for tokio+miri")] + #[cfg_attr(all(miri, target_os = "linux"), ignore = "deadlocks under miri")] async fn test_store_destroy_recovery() { let dir = tempfile::tempdir().unwrap(); @@ -1211,6 +1217,8 @@ mod tests { // } #[test_log::test(tokio::test)] + #[cfg_attr(all(miri, not(target_os = "linux")), ignore = "requires Linux for tokio+miri")] + #[cfg_attr(all(miri, target_os = "linux"), ignore = "deadlocks under miri")] async fn test_store_reinsertion() { let dir = tempfile::tempdir().unwrap(); @@ -1320,6 +1328,8 @@ mod tests { } #[test_log::test(tokio::test)] + #[cfg_attr(all(miri, not(target_os = "linux")), ignore = "requires Linux for tokio+miri")] + #[cfg_attr(all(miri, target_os = "linux"), ignore = "occasionally deadlocks under miri")] async fn test_store_magic_checksum_mismatch() { let dir = tempfile::tempdir().unwrap(); @@ -1359,6 +1369,7 @@ mod tests { } #[test_log::test(tokio::test)] + #[cfg_attr(all(miri, not(target_os = "linux")), ignore = "requires Linux for tokio+miri")] async fn test_aggregated_device() { let dir = tempfile::tempdir().unwrap(); diff --git a/foyer-storage/src/engine/block/eviction.rs b/foyer-storage/src/engine/block/eviction.rs index 4a7f9db6..04808d33 100644 --- a/foyer-storage/src/engine/block/eviction.rs +++ b/foyer-storage/src/engine/block/eviction.rs @@ -199,6 +199,7 @@ mod tests { use crate::{engine::block::manager::Block, io::device::noop::NoopPartition, IoEngineBuilder, NoopIoEngineBuilder}; #[test_log::test(tokio::test)] + #[cfg_attr(all(miri, not(target_os = "linux")), ignore = "requires Linux for tokio+miri")] async fn test_fifo_picker() { let mut picker = FifoPicker::new(0.1); let mock_io_engine = NoopIoEngineBuilder.build().await.unwrap(); @@ -277,6 +278,7 @@ mod tests { } #[test_log::test(tokio::test)] + #[cfg_attr(all(miri, not(target_os = "linux")), ignore = "requires Linux for tokio+miri")] async fn test_invalid_ratio_picker() { let mut picker = InvalidRatioPicker::new(0.5); picker.init(&(0..10).collect_vec(), 10); diff --git a/foyer-storage/src/engine/block/scanner.rs b/foyer-storage/src/engine/block/scanner.rs index ea5e3e6a..62d0417a 100644 --- a/foyer-storage/src/engine/block/scanner.rs +++ b/foyer-storage/src/engine/block/scanner.rs @@ -131,6 +131,8 @@ mod tests { } #[test_log::test(tokio::test)] + #[cfg_attr(all(miri, not(target_os = "linux")), ignore = "requires Linux for tokio+miri")] + #[cfg_attr(all(miri, target_os = "linux"), ignore = "issue 1223")] async fn test_block_scanner() { const BLOB_INDEX_SIZE: usize = 4 * KB; const BLOB_INDEX_CAPACITY: usize = diff --git a/foyer-storage/src/engine/block/tombstone.rs b/foyer-storage/src/engine/block/tombstone.rs index 15fe674d..1b00cee5 100644 --- a/foyer-storage/src/engine/block/tombstone.rs +++ b/foyer-storage/src/engine/block/tombstone.rs @@ -256,6 +256,7 @@ mod tests { }; #[test_log::test(tokio::test)] + #[cfg_attr(all(miri, not(target_os = "linux")), ignore = "requires Linux for tokio+miri")] async fn test_tombstone_log() { let dir = tempdir().unwrap(); diff --git a/foyer-storage/src/filter.rs b/foyer-storage/src/filter.rs index 996020ab..62d815d1 100644 --- a/foyer-storage/src/filter.rs +++ b/foyer-storage/src/filter.rs @@ -164,6 +164,7 @@ mod tests { use crate::Throttle; #[test] + #[cfg_attr(all(miri, not(target_os = "linux")), ignore = "requires Linux for tokio+miri")] fn test_estimated_size_condition() { let condition = EstimatedSize::new(10..20); let statistics = Arc::new(Statistics::new(Throttle::default())); diff --git a/foyer-storage/src/io/bytes.rs b/foyer-storage/src/io/bytes.rs index 350277bd..6cc229e8 100644 --- a/foyer-storage/src/io/bytes.rs +++ b/foyer-storage/src/io/bytes.rs @@ -64,6 +64,11 @@ unsafe impl Sync for Raw {} impl Raw { /// Allocate an 4K-aligned [`Raw`] with **AT LEAST** `capacity` bytes. + /// + /// # Safety + /// + /// The returned buffer contains uninitialized memory. Callers must initialize + /// the memory before reading from it to avoid undefined behavior. pub fn new(capacity: usize) -> Self { let capacity = bits::align_up(PAGE, capacity); let layout = unsafe { Layout::from_size_align_unchecked(capacity, PAGE) }; @@ -371,6 +376,7 @@ mod tests { use super::*; #[test] + #[cfg_attr(all(miri, not(target_os = "linux")), ignore = "requires Linux for tokio+miri")] fn test_dyn() { let raw = Raw::new(4096); let _: Box = Box::new(raw.clone()); diff --git a/foyer-storage/src/io/device/file.rs b/foyer-storage/src/io/device/file.rs index cb0116a5..e06188d3 100644 --- a/foyer-storage/src/io/device/file.rs +++ b/foyer-storage/src/io/device/file.rs @@ -13,12 +13,16 @@ // limitations under the License. use std::{ - fs::{create_dir_all, File, OpenOptions}, + fs::{File, OpenOptions}, path::{Path, PathBuf}, sync::{Arc, RwLock}, }; +#[cfg(not(miri))] +use std::fs::create_dir_all; + use foyer_common::error::{Error, Result}; +#[cfg(not(miri))] use fs4::free_space; use crate::{ @@ -81,11 +85,17 @@ impl DeviceBuilder for FileDeviceBuilder { let align_v = |value: usize, align: usize| value - (value % align); - let capacity = self.capacity.unwrap_or({ - // Create an empty directory before to get free space. - let dir = self.path.parent().expect("path must point to a file").to_path_buf(); - create_dir_all(&dir).unwrap(); - free_space(&dir).unwrap() as usize / 10 * 8 + let capacity = self.capacity.unwrap_or_else(|| { + #[cfg(miri)] + panic!("capacity must be explicitly provided when running under miri (statvfs not supported)"); + + #[cfg(not(miri))] + { + // Create an empty directory before to get free space. + let dir = self.path.parent().expect("path must point to a file").to_path_buf(); + create_dir_all(&dir).unwrap(); + free_space(&dir).unwrap() as usize / 10 * 8 + } }); let capacity = align_v(capacity, PAGE); diff --git a/foyer-storage/src/io/device/fs.rs b/foyer-storage/src/io/device/fs.rs index afefe979..e8bbbba3 100644 --- a/foyer-storage/src/io/device/fs.rs +++ b/foyer-storage/src/io/device/fs.rs @@ -19,6 +19,7 @@ use std::{ }; use foyer_common::error::{Error, Result}; +#[cfg(not(miri))] use fs4::free_space; use crate::{ @@ -81,10 +82,16 @@ impl DeviceBuilder for FsDeviceBuilder { let align_v = |value: usize, align: usize| value - value % align; - let capacity = self.capacity.unwrap_or({ - // Create an empty directory before to get free space. - create_dir_all(&self.dir).unwrap(); - free_space(&self.dir).unwrap() as usize / 10 * 8 + let capacity = self.capacity.unwrap_or_else(|| { + #[cfg(miri)] + panic!("capacity must be explicitly provided when running under miri (statvfs not supported)"); + + #[cfg(not(miri))] + { + // Create an empty directory before to get free space. + create_dir_all(&self.dir).unwrap(); + free_space(&self.dir).unwrap() as usize / 10 * 8 + } }); let capacity = align_v(capacity, PAGE); diff --git a/foyer-storage/src/io/device/statistics.rs b/foyer-storage/src/io/device/statistics.rs index f712341e..cae82fbd 100644 --- a/foyer-storage/src/io/device/statistics.rs +++ b/foyer-storage/src/io/device/statistics.rs @@ -17,16 +17,24 @@ use std::{ time::Duration, }; +#[cfg(feature = "fastant")] use fastant::{Atomic, Instant}; +#[cfg(not(feature = "fastant"))] +use std::{sync::RwLock, time::Instant}; use crate::Throttle; +#[cfg(feature = "fastant")] +type AtomicInstant = Atomic; +#[cfg(not(feature = "fastant"))] +type AtomicInstant = RwLock; + #[derive(Debug)] struct Metric { value: AtomicUsize, throttle: f64, quota: AtomicIsize, - update: Atomic, + update: AtomicInstant, } impl Metric { @@ -35,7 +43,10 @@ impl Metric { value: AtomicUsize::new(0), throttle, quota: AtomicIsize::new(0), + #[cfg(feature = "fastant")] update: Atomic::new(Instant::now()), + #[cfg(not(feature = "fastant"))] + update: RwLock::new(Instant::now()), } } @@ -61,14 +72,24 @@ impl Metric { } let now = Instant::now(); + + #[cfg(feature = "fastant")] let update = self.update.load(Ordering::Relaxed); + #[cfg(not(feature = "fastant"))] + let update = *self.update.read().unwrap(); let dur = now.duration_since(update).as_secs_f64(); let fill = dur * self.throttle; let quota = f64::min(self.throttle, self.quota.load(Ordering::Relaxed) as f64 + fill); + #[cfg(feature = "fastant")] self.update.store(now, Ordering::Relaxed); + #[cfg(not(feature = "fastant"))] + { + *self.update.write().unwrap() = now; + } + self.quota.store(quota as isize, Ordering::Relaxed); if quota >= 0.0 { diff --git a/foyer-storage/src/io/device/throttle.rs b/foyer-storage/src/io/device/throttle.rs index 6c1809f8..7641891c 100644 --- a/foyer-storage/src/io/device/throttle.rs +++ b/foyer-storage/src/io/device/throttle.rs @@ -137,6 +137,7 @@ mod tests { use super::*; #[test] + #[cfg_attr(all(miri, not(target_os = "linux")), ignore = "requires Linux for tokio+miri")] fn test_throttle_default() { assert!(matches!( Throttle::new(), @@ -151,6 +152,7 @@ mod tests { } #[test] + #[cfg_attr(all(miri, not(target_os = "linux")), ignore = "requires Linux for tokio+miri")] fn test_iops_counter_from_str() { assert!(matches!(IopsCounter::from_str("PerIo"), Ok(IopsCounter::PerIo))); assert!(matches!(IopsCounter::from_str(" PerIo "), Ok(IopsCounter::PerIo))); diff --git a/foyer-storage/src/io/engine/mod.rs b/foyer-storage/src/io/engine/mod.rs index 1590e538..e8eec6dd 100644 --- a/foyer-storage/src/io/engine/mod.rs +++ b/foyer-storage/src/io/engine/mod.rs @@ -117,8 +117,6 @@ mod tests { use tempfile::tempdir; use super::*; - #[cfg(target_os = "linux")] - use crate::io::engine::uring::UringIoEngineBuilder; use crate::io::{ bytes::IoSliceMut, device::{file::FileDeviceBuilder, Device, DeviceBuilder}, @@ -152,11 +150,16 @@ mod tests { } #[test_log::test(tokio::test)] + #[cfg_attr(all(miri, not(target_os = "linux")), ignore = "requires Linux for tokio+miri")] async fn test_io_engine() { + let dir = tempdir().unwrap(); - #[cfg(target_os = "linux")] + // io-uring not supported under miri + #[cfg(all(not(miri), target_os = "linux"))] { + use crate::io::engine::uring::UringIoEngineBuilder; + let path = dir.path().join("test_file_1"); let device = build_test_file_device(&path).unwrap(); let engine = UringIoEngineBuilder::new() diff --git a/foyer-storage/src/store.rs b/foyer-storage/src/store.rs index 61cecf03..d6a77f19 100644 --- a/foyer-storage/src/store.rs +++ b/foyer-storage/src/store.rs @@ -32,7 +32,7 @@ use foyer_common::{ use foyer_memory::{Cache, Piece}; use tokio::runtime::Handle; -#[cfg(feature = "test_utils")] +#[cfg(any(test, feature = "test_utils"))] use crate::test_utils::*; use crate::{ compress::Compression, @@ -581,6 +581,7 @@ mod tests { }; #[tokio::test] + #[cfg_attr(all(miri, not(target_os = "linux")), ignore = "requires Linux for tokio+miri")] async fn test_build_with_unaligned_buffer_pool_size() { let dir = tempfile::tempdir().unwrap(); let metrics = Arc::new(Metrics::noop()); @@ -604,6 +605,8 @@ mod tests { } #[tokio::test] + #[cfg_attr(all(miri, not(target_os = "linux")), ignore = "requires Linux for tokio+miri")] + #[cfg_attr(all(miri, target_os = "linux"), ignore = "issue 1223")] async fn test_entry_hash_collision() { let dir = tempfile::tempdir().unwrap(); let metrics = Arc::new(Metrics::noop()); diff --git a/foyer-storage/tests/storage_fuzzy_test.rs b/foyer-storage/tests/storage_fuzzy_test.rs index 7d05adec..c3b84cef 100644 --- a/foyer-storage/tests/storage_fuzzy_test.rs +++ b/foyer-storage/tests/storage_fuzzy_test.rs @@ -117,6 +117,8 @@ fn basic( ) } +#[cfg_attr(all(miri, not(target_os = "linux")), ignore = "requires Linux for tokio+miri")] +#[cfg_attr(all(miri, target_os = "linux"), ignore = "deadlocks under miri")] #[test_log::test(tokio::test)] async fn test_direct_fs_store() { let tempdir = tempfile::tempdir().unwrap(); @@ -130,6 +132,8 @@ async fn test_direct_fs_store() { test_store(memory, builder, recorder).await; } +#[cfg_attr(all(miri, not(target_os = "linux")), ignore = "requires Linux for tokio+miri")] +#[cfg_attr(all(miri, target_os = "linux"), ignore = "deadlocks under miri")] #[test_log::test(tokio::test)] async fn test_direct_fs_store_zstd() { let tempdir = tempfile::tempdir().unwrap(); @@ -145,6 +149,8 @@ async fn test_direct_fs_store_zstd() { test_store(memory, builder, recorder).await; } +#[cfg_attr(all(miri, not(target_os = "linux")), ignore = "requires Linux for tokio+miri")] +#[cfg_attr(all(miri, target_os = "linux"), ignore = "deadlocks under miri")] #[test_log::test(tokio::test)] async fn test_direct_fs_store_lz4() { let tempdir = tempfile::tempdir().unwrap(); diff --git a/foyer/Cargo.toml b/foyer/Cargo.toml index d476c2ff..cc825efc 100644 --- a/foyer/Cargo.toml +++ b/foyer/Cargo.toml @@ -21,7 +21,8 @@ rustdoc-args = ["--cfg", "docsrs"] development = ["chrono"] [features] -default = [] +default = ["fastant"] +fastant = ["foyer-storage/fastant"] clap = ["foyer-storage/clap"] serde = ["foyer-common/serde", "foyer-storage/serde"] nightly = ["foyer-storage/nightly", "foyer-memory/nightly"] @@ -45,7 +46,7 @@ equivalent = { workspace = true } fastrace = { workspace = true, optional = true } foyer-common = { workspace = true } foyer-memory = { workspace = true } -foyer-storage = { workspace = true } +foyer-storage = { workspace = true, default-features = false } futures-util = { workspace = true } mea = { workspace = true } mixtrics = { workspace = true } @@ -78,8 +79,8 @@ tokio = { workspace = true, features = [ [dev-dependencies] anyhow = { workspace = true } chrono = { workspace = true } -foyer = { path = ".", features = ["test_utils"] } -foyer-storage = { workspace = true, features = ["test_utils"] } +foyer = { path = ".", default-features = false, features = ["test_utils"] } +foyer-storage = { workspace = true, default-features = false, features = ["test_utils"] } rand = { workspace = true } tempfile = { workspace = true } test-log = { workspace = true, features = ["trace", "color"] } diff --git a/foyer/src/hybrid/cache.rs b/foyer/src/hybrid/cache.rs index a4b25678..2c0b411c 100644 --- a/foyer/src/hybrid/cache.rs +++ b/foyer/src/hybrid/cache.rs @@ -1083,6 +1083,14 @@ mod tests { } #[test_log::test(tokio::test)] + #[cfg_attr( + all(miri, feature = "fastant"), + ignore = "uses fastant crate with inline assembly (CPUID) not supported by miri" + )] + #[cfg_attr( + all(miri, not(feature = "fastant"), not(target_os = "linux")), + ignore = "requires Linux for tokio+miri" + )] async fn test_hybrid_cache() { let dir = tempfile::tempdir().unwrap(); @@ -1118,6 +1126,14 @@ mod tests { } #[test_log::test(tokio::test)] + #[cfg_attr( + all(miri, feature = "fastant"), + ignore = "uses fastant crate with inline assembly (CPUID) not supported by miri" + )] + #[cfg_attr( + all(miri, not(feature = "fastant"), not(target_os = "linux")), + ignore = "requires Linux for tokio+miri" + )] async fn test_hybrid_cache_writer() { let dir = tempfile::tempdir().unwrap(); @@ -1152,6 +1168,15 @@ mod tests { } #[test_log::test(tokio::test)] + #[cfg_attr( + all(miri, feature = "fastant"), + ignore = "uses fastant crate with inline assembly (CPUID) not supported by miri" + )] + #[cfg_attr( + all(miri, not(feature = "fastant"), not(target_os = "linux")), + ignore = "requires Linux for tokio+miri" + )] + #[cfg_attr(all(miri, target_os = "linux"), ignore = "issue 1223")] async fn test_hybrid_fetch_with_cache_location() { // Test hybrid cache that write disk cache on eviction. @@ -1262,6 +1287,15 @@ mod tests { } #[test_log::test(tokio::test)] + #[cfg_attr( + all(miri, feature = "fastant"), + ignore = "uses fastant crate with inline assembly (CPUID) not supported by miri" + )] + #[cfg_attr( + all(miri, not(feature = "fastant"), not(target_os = "linux")), + ignore = "requires Linux for tokio+miri" + )] + #[cfg_attr(all(miri, target_os = "linux"), ignore = "issue 1223")] async fn test_hybrid_insert_with_cache_location() { // Test hybrid cache that write disk cache on eviction. @@ -1348,6 +1382,15 @@ mod tests { } #[test_log::test(tokio::test)] + #[cfg_attr( + all(miri, feature = "fastant"), + ignore = "uses fastant crate with inline assembly (CPUID) not supported by miri" + )] + #[cfg_attr( + all(miri, not(feature = "fastant"), not(target_os = "linux")), + ignore = "requires Linux for tokio+miri" + )] + #[cfg_attr(all(miri, target_os = "linux"), ignore = "issue 1223")] async fn test_hybrid_read_throttled() { // Test hybrid cache that write disk cache on insertion. @@ -1437,6 +1480,15 @@ mod tests { } #[test_log::test(tokio::test)] + #[cfg_attr( + all(miri, feature = "fastant"), + ignore = "uses fastant crate with inline assembly (CPUID) not supported by miri" + )] + #[cfg_attr( + all(miri, not(feature = "fastant"), not(target_os = "linux")), + ignore = "requires Linux for tokio+miri" + )] + #[cfg_attr(all(miri, target_os = "linux"), ignore = "issue 1223")] async fn test_flush_on_close() { // check without flush on close @@ -1463,6 +1515,15 @@ mod tests { } #[test_log::test(tokio::test)] + #[cfg_attr( + all(miri, feature = "fastant"), + ignore = "uses fastant crate with inline assembly (CPUID) not supported by miri" + )] + #[cfg_attr( + all(miri, not(feature = "fastant"), not(target_os = "linux")), + ignore = "requires Linux for tokio+miri" + )] + #[cfg_attr(all(miri, target_os = "linux"), ignore = "issue 1223")] async fn test_load_after_recovery() { let open = |dir| async move { HybridCacheBuilder::new() @@ -1493,6 +1554,14 @@ mod tests { } #[test_log::test(tokio::test)] + #[cfg_attr( + all(miri, feature = "fastant"), + ignore = "uses fastant crate with inline assembly (CPUID) not supported by miri" + )] + #[cfg_attr( + all(miri, not(feature = "fastant"), not(target_os = "linux")), + ignore = "requires Linux for tokio+miri" + )] async fn test_concurrent_get_and_fetch() { let dir = tempfile::tempdir().unwrap(); @@ -1524,6 +1593,15 @@ mod tests { } #[test_log::test(tokio::test)] + #[cfg_attr( + all(miri, feature = "fastant"), + ignore = "uses fastant crate with inline assembly (CPUID) not supported by miri" + )] + #[cfg_attr( + all(miri, not(feature = "fastant"), not(target_os = "linux")), + ignore = "requires Linux for tokio+miri" + )] + #[cfg_attr(all(miri, target_os = "linux"), ignore = "issue 1223")] async fn test_entry_location() { // Test hybrid cache that write disk cache on eviction. @@ -1574,6 +1652,14 @@ mod tests { } #[test_log::test(tokio::test)] + #[cfg_attr( + all(miri, feature = "fastant"), + ignore = "uses fastant crate with inline assembly (CPUID) not supported by miri" + )] + #[cfg_attr( + all(miri, not(feature = "fastant"), not(target_os = "linux")), + ignore = "requires Linux for tokio+miri" + )] async fn test_hybrid_cache_fetch_error_downcast() { #[derive(Debug, Clone, PartialEq, Eq)] struct TestError(String); diff --git a/foyer/src/lib.rs b/foyer/src/lib.rs index 2996e1d4..2994d5cb 100644 --- a/foyer/src/lib.rs +++ b/foyer/src/lib.rs @@ -12,7 +12,8 @@ // See the License for the specific language governing permissions and // limitations under the License. -#![doc = include_str!(concat!(env!("OUT_DIR"), "/foyer-docs.md"))] +#![cfg_attr(miri, doc = "foyer under miri")] +#![cfg_attr(not(miri), doc = include_str!(concat!(env!("OUT_DIR"), "/foyer-docs.md")))] #![cfg_attr(feature = "nightly", feature(allocator_api))] #![cfg_attr(docsrs, feature(doc_cfg))] diff --git a/foyer/tests/hybrid_cache_fuzzy_test.rs b/foyer/tests/hybrid_cache_fuzzy_test.rs index 9cc42d81..ceb8325b 100644 --- a/foyer/tests/hybrid_cache_fuzzy_test.rs +++ b/foyer/tests/hybrid_cache_fuzzy_test.rs @@ -103,6 +103,8 @@ impl RecentEvictionQueue { } } +#[cfg_attr(all(miri, not(target_os = "linux")), ignore = "requires Linux for tokio+miri")] +#[cfg_attr(all(miri, target_os = "linux"), ignore = "takes more than 30 minutes under miri")] #[test_log::test(tokio::test)] async fn test_concurrent_insert_disk_cache_and_fetch() { let dir = tempfile::tempdir().unwrap(); From 405bc3bbf576677a6fb95353e2e0660e7decd251 Mon Sep 17 00:00:00 2001 From: John Vandenberg Date: Tue, 16 Dec 2025 10:03:01 +0800 Subject: [PATCH 2/2] improve fastant selection Signed-off-by: John Vandenberg --- .github/workflows/miri.yml | 5 +- Dockerfile.miri | 2 +- docker-compose.yaml | 2 +- foyer-bench/src/main.rs | 2 +- foyer-storage/Cargo.toml | 6 +- foyer-storage/src/io/device/statistics.rs | 20 ++--- foyer-storage/src/io/engine/mod.rs | 1 - foyer/Cargo.toml | 3 +- foyer/src/hybrid/cache.rs | 90 +++-------------------- 9 files changed, 29 insertions(+), 102 deletions(-) diff --git a/.github/workflows/miri.yml b/.github/workflows/miri.yml index 6d7bad58..37e29a24 100644 --- a/.github/workflows/miri.yml +++ b/.github/workflows/miri.yml @@ -64,7 +64,4 @@ jobs: RUST_TOOLCHAIN_NIGHTLY: ${{ env.RUST_TOOLCHAIN_NIGHTLY }} timeout-minutes: 10 run: | - cargo +$RUST_TOOLCHAIN_NIGHTLY miri test -p foyer-common --no-default-features - cargo +$RUST_TOOLCHAIN_NIGHTLY miri test -p foyer-memory --no-default-features --features test_utils - cargo +$RUST_TOOLCHAIN_NIGHTLY miri test -p foyer-storage --no-default-features --features test_utils - cargo +$RUST_TOOLCHAIN_NIGHTLY miri test -p foyer --no-default-features --features test_utils + cargo +$RUST_TOOLCHAIN_NIGHTLY miri test --features test_utils --workspace --exclude foyer-bench diff --git a/Dockerfile.miri b/Dockerfile.miri index ec2e3b7c..556c8d94 100644 --- a/Dockerfile.miri +++ b/Dockerfile.miri @@ -18,4 +18,4 @@ ENV MIRIFLAGS="-Zmiri-disable-isolation" WORKDIR /workspace # Default command: run all miri tests -CMD ["sh", "-c", "cargo +${NIGHTLY_VERSION} miri test -p foyer --no-default-features"] +CMD ["sh", "-c", "cargo +${NIGHTLY_VERSION} miri test --features test_utils --workspace --exclude foyer-bench"] diff --git a/docker-compose.yaml b/docker-compose.yaml index da567a88..229427aa 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -11,7 +11,7 @@ services: # Optional: Add miri flags for stricter checking # MIRIFLAGS: "-Zmiri-strict-provenance -Zmiri-symbolic-alignment-check" - RUST_BACKTRACE=1 - command: cargo +nightly miri test -p foyer --lib --no-default-features + command: cargo +nightly miri test --features test_utils --workspace --exclude foyer-bench # Monitoring stack services (for performance profiling and metrics) # node-exporter collects system-level metrics (CPU, memory, disk, network) diff --git a/foyer-bench/src/main.rs b/foyer-bench/src/main.rs index 40b4b462..9bf718a6 100644 --- a/foyer-bench/src/main.rs +++ b/foyer-bench/src/main.rs @@ -430,7 +430,7 @@ fn setup() { console_subscriber::init(); } -#[cfg(feature = "tracing")] +#[cfg(all(feature = "tracing", not(feature = "tokio-console")))] fn setup() { use fastrace::collector::Config; let reporter = fastrace_jaeger::JaegerReporter::new("127.0.0.1:6831".parse().unwrap(), "foyer-bench").unwrap(); diff --git a/foyer-storage/Cargo.toml b/foyer-storage/Cargo.toml index d0526b5d..15acb9f8 100644 --- a/foyer-storage/Cargo.toml +++ b/foyer-storage/Cargo.toml @@ -13,7 +13,7 @@ readme = { workspace = true } exclude.workspace = true [features] -default = ["fastant"] +default = [] serde = ["dep:serde", "foyer-common/serde"] clap = ["dep:clap"] tracing = ["dep:fastrace", "foyer-common/tracing", "foyer-memory/tracing"] @@ -31,7 +31,6 @@ anyhow = { workspace = true } bytes = { workspace = true } clap = { workspace = true, optional = true } equivalent = { workspace = true } -fastant = { workspace = true, features = ["atomic"], optional = true } fastrace = { workspace = true, optional = true } foyer-common = { workspace = true } foyer-memory = { workspace = true } @@ -73,6 +72,9 @@ tokio = { workspace = true, features = [ "fs", ] } +[target.'cfg(not(miri))'.dependencies] +fastant = { workspace = true, features = ["atomic"] } + [target.'cfg(target_os = "linux")'.dependencies] core_affinity = { workspace = true } io-uring = { workspace = true } diff --git a/foyer-storage/src/io/device/statistics.rs b/foyer-storage/src/io/device/statistics.rs index cae82fbd..51101c14 100644 --- a/foyer-storage/src/io/device/statistics.rs +++ b/foyer-storage/src/io/device/statistics.rs @@ -17,16 +17,16 @@ use std::{ time::Duration, }; -#[cfg(feature = "fastant")] +#[cfg(not(miri))] use fastant::{Atomic, Instant}; -#[cfg(not(feature = "fastant"))] +#[cfg(miri)] use std::{sync::RwLock, time::Instant}; use crate::Throttle; -#[cfg(feature = "fastant")] +#[cfg(not(miri))] type AtomicInstant = Atomic; -#[cfg(not(feature = "fastant"))] +#[cfg(miri)] type AtomicInstant = RwLock; #[derive(Debug)] @@ -43,9 +43,9 @@ impl Metric { value: AtomicUsize::new(0), throttle, quota: AtomicIsize::new(0), - #[cfg(feature = "fastant")] + #[cfg(not(miri))] update: Atomic::new(Instant::now()), - #[cfg(not(feature = "fastant"))] + #[cfg(miri)] update: RwLock::new(Instant::now()), } } @@ -73,9 +73,9 @@ impl Metric { let now = Instant::now(); - #[cfg(feature = "fastant")] + #[cfg(not(miri))] let update = self.update.load(Ordering::Relaxed); - #[cfg(not(feature = "fastant"))] + #[cfg(miri)] let update = *self.update.read().unwrap(); let dur = now.duration_since(update).as_secs_f64(); @@ -83,9 +83,9 @@ impl Metric { let quota = f64::min(self.throttle, self.quota.load(Ordering::Relaxed) as f64 + fill); - #[cfg(feature = "fastant")] + #[cfg(not(miri))] self.update.store(now, Ordering::Relaxed); - #[cfg(not(feature = "fastant"))] + #[cfg(miri)] { *self.update.write().unwrap() = now; } diff --git a/foyer-storage/src/io/engine/mod.rs b/foyer-storage/src/io/engine/mod.rs index e8eec6dd..d7a4f8b2 100644 --- a/foyer-storage/src/io/engine/mod.rs +++ b/foyer-storage/src/io/engine/mod.rs @@ -152,7 +152,6 @@ mod tests { #[test_log::test(tokio::test)] #[cfg_attr(all(miri, not(target_os = "linux")), ignore = "requires Linux for tokio+miri")] async fn test_io_engine() { - let dir = tempdir().unwrap(); // io-uring not supported under miri diff --git a/foyer/Cargo.toml b/foyer/Cargo.toml index cc825efc..8c3a69aa 100644 --- a/foyer/Cargo.toml +++ b/foyer/Cargo.toml @@ -21,8 +21,7 @@ rustdoc-args = ["--cfg", "docsrs"] development = ["chrono"] [features] -default = ["fastant"] -fastant = ["foyer-storage/fastant"] +default = [] clap = ["foyer-storage/clap"] serde = ["foyer-common/serde", "foyer-storage/serde"] nightly = ["foyer-storage/nightly", "foyer-memory/nightly"] diff --git a/foyer/src/hybrid/cache.rs b/foyer/src/hybrid/cache.rs index 2c0b411c..4e7dd28c 100644 --- a/foyer/src/hybrid/cache.rs +++ b/foyer/src/hybrid/cache.rs @@ -1083,14 +1083,7 @@ mod tests { } #[test_log::test(tokio::test)] - #[cfg_attr( - all(miri, feature = "fastant"), - ignore = "uses fastant crate with inline assembly (CPUID) not supported by miri" - )] - #[cfg_attr( - all(miri, not(feature = "fastant"), not(target_os = "linux")), - ignore = "requires Linux for tokio+miri" - )] + #[cfg_attr(all(miri, not(target_os = "linux")), ignore = "requires Linux for tokio+miri")] async fn test_hybrid_cache() { let dir = tempfile::tempdir().unwrap(); @@ -1126,14 +1119,7 @@ mod tests { } #[test_log::test(tokio::test)] - #[cfg_attr( - all(miri, feature = "fastant"), - ignore = "uses fastant crate with inline assembly (CPUID) not supported by miri" - )] - #[cfg_attr( - all(miri, not(feature = "fastant"), not(target_os = "linux")), - ignore = "requires Linux for tokio+miri" - )] + #[cfg_attr(all(miri, not(target_os = "linux")), ignore = "requires Linux for tokio+miri")] async fn test_hybrid_cache_writer() { let dir = tempfile::tempdir().unwrap(); @@ -1168,14 +1154,7 @@ mod tests { } #[test_log::test(tokio::test)] - #[cfg_attr( - all(miri, feature = "fastant"), - ignore = "uses fastant crate with inline assembly (CPUID) not supported by miri" - )] - #[cfg_attr( - all(miri, not(feature = "fastant"), not(target_os = "linux")), - ignore = "requires Linux for tokio+miri" - )] + #[cfg_attr(all(miri, not(target_os = "linux")), ignore = "requires Linux for tokio+miri")] #[cfg_attr(all(miri, target_os = "linux"), ignore = "issue 1223")] async fn test_hybrid_fetch_with_cache_location() { // Test hybrid cache that write disk cache on eviction. @@ -1287,14 +1266,7 @@ mod tests { } #[test_log::test(tokio::test)] - #[cfg_attr( - all(miri, feature = "fastant"), - ignore = "uses fastant crate with inline assembly (CPUID) not supported by miri" - )] - #[cfg_attr( - all(miri, not(feature = "fastant"), not(target_os = "linux")), - ignore = "requires Linux for tokio+miri" - )] + #[cfg_attr(all(miri, not(target_os = "linux")), ignore = "requires Linux for tokio+miri")] #[cfg_attr(all(miri, target_os = "linux"), ignore = "issue 1223")] async fn test_hybrid_insert_with_cache_location() { // Test hybrid cache that write disk cache on eviction. @@ -1382,14 +1354,7 @@ mod tests { } #[test_log::test(tokio::test)] - #[cfg_attr( - all(miri, feature = "fastant"), - ignore = "uses fastant crate with inline assembly (CPUID) not supported by miri" - )] - #[cfg_attr( - all(miri, not(feature = "fastant"), not(target_os = "linux")), - ignore = "requires Linux for tokio+miri" - )] + #[cfg_attr(all(miri, not(target_os = "linux")), ignore = "requires Linux for tokio+miri")] #[cfg_attr(all(miri, target_os = "linux"), ignore = "issue 1223")] async fn test_hybrid_read_throttled() { // Test hybrid cache that write disk cache on insertion. @@ -1480,14 +1445,7 @@ mod tests { } #[test_log::test(tokio::test)] - #[cfg_attr( - all(miri, feature = "fastant"), - ignore = "uses fastant crate with inline assembly (CPUID) not supported by miri" - )] - #[cfg_attr( - all(miri, not(feature = "fastant"), not(target_os = "linux")), - ignore = "requires Linux for tokio+miri" - )] + #[cfg_attr(all(miri, not(target_os = "linux")), ignore = "requires Linux for tokio+miri")] #[cfg_attr(all(miri, target_os = "linux"), ignore = "issue 1223")] async fn test_flush_on_close() { // check without flush on close @@ -1515,14 +1473,7 @@ mod tests { } #[test_log::test(tokio::test)] - #[cfg_attr( - all(miri, feature = "fastant"), - ignore = "uses fastant crate with inline assembly (CPUID) not supported by miri" - )] - #[cfg_attr( - all(miri, not(feature = "fastant"), not(target_os = "linux")), - ignore = "requires Linux for tokio+miri" - )] + #[cfg_attr(all(miri, not(target_os = "linux")), ignore = "requires Linux for tokio+miri")] #[cfg_attr(all(miri, target_os = "linux"), ignore = "issue 1223")] async fn test_load_after_recovery() { let open = |dir| async move { @@ -1554,14 +1505,7 @@ mod tests { } #[test_log::test(tokio::test)] - #[cfg_attr( - all(miri, feature = "fastant"), - ignore = "uses fastant crate with inline assembly (CPUID) not supported by miri" - )] - #[cfg_attr( - all(miri, not(feature = "fastant"), not(target_os = "linux")), - ignore = "requires Linux for tokio+miri" - )] + #[cfg_attr(all(miri, not(target_os = "linux")), ignore = "requires Linux for tokio+miri")] async fn test_concurrent_get_and_fetch() { let dir = tempfile::tempdir().unwrap(); @@ -1593,14 +1537,7 @@ mod tests { } #[test_log::test(tokio::test)] - #[cfg_attr( - all(miri, feature = "fastant"), - ignore = "uses fastant crate with inline assembly (CPUID) not supported by miri" - )] - #[cfg_attr( - all(miri, not(feature = "fastant"), not(target_os = "linux")), - ignore = "requires Linux for tokio+miri" - )] + #[cfg_attr(all(miri, not(target_os = "linux")), ignore = "requires Linux for tokio+miri")] #[cfg_attr(all(miri, target_os = "linux"), ignore = "issue 1223")] async fn test_entry_location() { // Test hybrid cache that write disk cache on eviction. @@ -1652,14 +1589,7 @@ mod tests { } #[test_log::test(tokio::test)] - #[cfg_attr( - all(miri, feature = "fastant"), - ignore = "uses fastant crate with inline assembly (CPUID) not supported by miri" - )] - #[cfg_attr( - all(miri, not(feature = "fastant"), not(target_os = "linux")), - ignore = "requires Linux for tokio+miri" - )] + #[cfg_attr(all(miri, not(target_os = "linux")), ignore = "requires Linux for tokio+miri")] async fn test_hybrid_cache_fetch_error_downcast() { #[derive(Debug, Clone, PartialEq, Eq)] struct TestError(String);