From 826b98674cb42fd4fa267965a0d22b3504de48eb Mon Sep 17 00:00:00 2001 From: Akira Hayakawa Date: Fri, 2 Jan 2026 12:36:03 +0900 Subject: [PATCH 1/3] Add uninit test file to test check command --- writeboost-cli/Cargo.toml | 3 +- writeboost-cli/data/sample.cache.uninit | 0 writeboost-cli/src/sub/check/mod.rs | 102 +++++++++++++++++------- 3 files changed, 77 insertions(+), 28 deletions(-) create mode 100644 writeboost-cli/data/sample.cache.uninit diff --git a/writeboost-cli/Cargo.toml b/writeboost-cli/Cargo.toml index 8309c04..dab20b7 100644 --- a/writeboost-cli/Cargo.toml +++ b/writeboost-cli/Cargo.toml @@ -8,4 +8,5 @@ edition = "2024" anyhow = "1" byteorder = "1" clap = { version = "4", features = ["derive"] } -crc = "3" \ No newline at end of file +crc = "3" +thiserror = "2.0.17" \ No newline at end of file diff --git a/writeboost-cli/data/sample.cache.uninit b/writeboost-cli/data/sample.cache.uninit new file mode 100644 index 0000000..e69de29 diff --git a/writeboost-cli/src/sub/check/mod.rs b/writeboost-cli/src/sub/check/mod.rs index 7934e4e..13c68ce 100644 --- a/writeboost-cli/src/sub/check/mod.rs +++ b/writeboost-cli/src/sub/check/mod.rs @@ -11,34 +11,26 @@ fn checksum(data: &[u8]) -> u32 { CASTAGNOLI.checksum(data) } -#[cfg(test)] -mod tests { - use super::*; - - #[test] - fn test_checksum() { - let buf = vec![0; 4096 - 512]; - assert_eq!(checksum(&buf), 143703573); - } -} - -#[derive(Args)] -#[command(about = "Check if the segment is broken")] -pub struct CommandArgs { - #[arg(help = "Path to the cache device")] - cachedev: String, - #[arg(help = "Segment id")] - segid: i32, +#[derive(thiserror::Error, Debug)] +enum CheckError { + #[error("segment is not initialized")] + NotInitialized, + #[error( + "segment {seg_id} is broken. checksum: computed={computed_checksum}, expected={expected_checksum}" + )] + CacheBlockBroken { + seg_id: i32, + computed_checksum: u32, + expected_checksum: u32, + }, } -pub fn run(args: CommandArgs) { - let devname: String = args.cachedev; - let id = args.segid; +fn do_check(devname: &str, seg_id: i32) -> Result<(), CheckError> { let cache_dev = CacheDevice::new(devname.to_owned()); let mut f = File::open(&devname).expect(&format!("Device {} not found", &devname)); - let start_byte: u64 = (cache_dev.calc_segment_start(id) as u64) << 9; + let start_byte: u64 = (cache_dev.calc_segment_start(seg_id) as u64) << 9; f.seek(SeekFrom::Start(start_byte)).unwrap(); let header = { @@ -48,7 +40,7 @@ pub fn run(args: CommandArgs) { }; if header.uninitialized() { - std::process::exit(0); + return Err(CheckError::NotInitialized); } let computed = { @@ -59,9 +51,65 @@ pub fn run(args: CommandArgs) { }; if computed != header.checksum { - panic!( - "Checksum is broken. computed={}, expected={}", - computed, header.checksum - ); + return Err(CheckError::CacheBlockBroken { + seg_id, + computed_checksum: computed, + expected_checksum: header.checksum, + }); + } + + Ok(()) +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_checksum() { + let buf = vec![0; 4096 - 512]; + assert_eq!(checksum(&buf), 143703573); + } + + #[test] + fn test_check() { + let devname = "data/sample.cache.226"; + let seg_id = 1; + let res = do_check(&devname, seg_id); + assert!(res.is_ok()); + } + + #[test] + fn test_uninitialized() { + let devname = "data/sample.cache.uninit"; + let seg_id = 0; + let res = do_check(&devname, seg_id); + assert!(matches!(res, Err(CheckError::NotInitialized))); + } +} + +#[derive(Args)] +#[command(about = "Check if the segment is broken")] +pub struct CommandArgs { + #[arg(help = "Path to the cache device")] + cachedev: String, + #[arg(help = "Segment id")] + segid: i32, +} + +pub fn run(args: CommandArgs) { + let devname: String = args.cachedev; + let id = args.segid; + + match do_check(&devname, id) { + Ok(()) => {} + Err(CheckError::NotInitialized) => { + // Since segments are zero-ed out at formatting, + // if the segment is all zeros, it is considered still unused. + eprintln!("segment is not initialized"); + } + Err(e) => { + panic!("{e}") + } } } From 7e49e9248e870dc688e010f3790ac1daa378c0ae Mon Sep 17 00:00:00 2001 From: Akira Hayakawa Date: Fri, 2 Jan 2026 12:37:28 +0900 Subject: [PATCH 2/3] fix CI --- .github/workflows/{CI.yaml => CI.yml} | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) rename .github/workflows/{CI.yaml => CI.yml} (60%) diff --git a/.github/workflows/CI.yaml b/.github/workflows/CI.yml similarity index 60% rename from .github/workflows/CI.yaml rename to .github/workflows/CI.yml index 587426a..dd44cbe 100644 --- a/.github/workflows/CI.yaml +++ b/.github/workflows/CI.yml @@ -10,9 +10,7 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - - name: Build Docker Image - run: make docker-build - name: Compile - run: ./dev cargo build + run: cargo build - name: Test - run: ./dev cargo test \ No newline at end of file + run: cargo test \ No newline at end of file From a307996a76a339c8e939aafe9970cfec66ad78aa Mon Sep 17 00:00:00 2001 From: Akira Hayakawa Date: Fri, 2 Jan 2026 12:39:08 +0900 Subject: [PATCH 3/3] Remove docker stuffs --- Dockerfile | 18 ------------------ dev | 1 - docker-compose.yml | 6 ------ 3 files changed, 25 deletions(-) delete mode 100644 Dockerfile delete mode 100755 dev delete mode 100644 docker-compose.yml diff --git a/Dockerfile b/Dockerfile deleted file mode 100644 index 26d1a77..0000000 --- a/Dockerfile +++ /dev/null @@ -1,18 +0,0 @@ -FROM 'quay.io/centos/centos:stream8' - -RUN yum install -y sudo gcc -RUN yum install -y iputils bind-utils make - -ARG USER -ARG UID -RUN groupadd ${USER} -RUN useradd -d /home/${USER} -m -s /bin/bash -u ${UID} -g ${USER} ${USER} -USER ${USER} - -RUN curl https://sh.rustup.rs -sSf >> ${HOME}/rustup.rs -RUN sh ${HOME}/rustup.rs -y -RUN echo $HOME -ENV PATH=/home/${USER}/.cargo/bin:$PATH -RUN echo $PATH - -WORKDIR '/work' \ No newline at end of file diff --git a/dev b/dev deleted file mode 100755 index 764264b..0000000 --- a/dev +++ /dev/null @@ -1 +0,0 @@ -docker-compose run dev $@ \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml deleted file mode 100644 index 220aebb..0000000 --- a/docker-compose.yml +++ /dev/null @@ -1,6 +0,0 @@ -version: '3' -services: - dev: - image: wbtools:dev - volumes: - - .:/work \ No newline at end of file