From c6e34c57564dbe26e5d58d6a27fa0cdc2c3a75ca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cyryl=20P=C5=82otnicki?= Date: Sat, 15 May 2021 20:10:26 +0100 Subject: [PATCH] wip on error correction --- .build.yml | 2 +- Cargo.lock | 19 ++++--------------- Cargo.toml | 2 +- src/index/io.rs | 2 +- src/io/error_correcting_encoder.rs | 20 +++++++++----------- 5 files changed, 16 insertions(+), 29 deletions(-) diff --git a/.build.yml b/.build.yml index 55108f4..b7be321 100644 --- a/.build.yml +++ b/.build.yml @@ -3,7 +3,7 @@ sources: - git@git.sr.ht:~cyplo/bakare secrets: - - b7161fff-05f4-4470-b4a1-57bd67dede23 + - 6c23a8c1-7a30-4a7e-b3b7-0171e898a7d3 - 996295b0-681c-49e8-8774-1be2f3e0bfe9 environment: diff --git a/Cargo.lock b/Cargo.lock index a14b5ed..dd8dd98 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -41,7 +41,7 @@ dependencies = [ "proptest", "rand 0.8.3", "rayon", - "reed-solomon-erasure", + "reed-solomon", "rust-crypto", "serde", "serde_cbor", @@ -642,15 +642,10 @@ dependencies = [ ] [[package]] -name = "reed-solomon-erasure" -version = "4.0.2" +name = "reed-solomon" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a415a013dd7c5d4221382329a5a3482566da675737494935cbbbcdec04662f9d" -dependencies = [ - "cc", - "libc", - "smallvec", -] +checksum = "13de68c877a77f35885442ac72c8beb7c2f0b09380c43b734b9d63d1db69ee54" [[package]] name = "regex-syntax" @@ -773,12 +768,6 @@ dependencies = [ "opaque-debug", ] -[[package]] -name = "smallvec" -version = "1.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe0f37c9e8f3c5a4a66ad655a93c74daac4ad00c441533bf5c6e7990bb42604e" - [[package]] name = "syn" version = "1.0.60" diff --git a/Cargo.toml b/Cargo.toml index 5a6f17e..4a32b2d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -19,7 +19,7 @@ log = "0.4" nix = "0.19" rand = "0.8" rayon = "1.5" -reed-solomon-erasure = { version = "4.0", features = ["simd-accel"] } +reed-solomon = "0.2" rust-crypto = "0.2" serde = { version = "1.0", features = ["derive"] } serde_cbor = "0.11" diff --git a/src/index/io.rs b/src/index/io.rs index f5af465..77f2e0f 100644 --- a/src/index/io.rs +++ b/src/index/io.rs @@ -74,7 +74,7 @@ impl Index { { let mut file = index_file_path.create_file()?; - file.write_all(encoded).context("writing index to disk")?; + file.write_all(&encoded).context("writing index to disk")?; file.flush()?; } diff --git a/src/io/error_correcting_encoder.rs b/src/io/error_correcting_encoder.rs index 595899c..b09c502 100644 --- a/src/io/error_correcting_encoder.rs +++ b/src/io/error_correcting_encoder.rs @@ -1,18 +1,17 @@ +use std::io::Read; + use anyhow::Result; +use reed_solomon::Encoder; -pub fn encode(bytes: &[u8]) -> Result<&[u8]> { - // find number of shards and parity blocks - // encode checksum with each block - // when decoding, remove blocks with invalid checksum +const ECC_LENGTH: usize = 8; - Ok(bytes) +pub fn encode(bytes: &[u8]) -> Result> { + let encoder = Encoder::new(ECC_LENGTH); + let encoded = encoder.encode(bytes); + Ok(encoded.bytes().collect::, _>>()?) } pub fn decode(bytes: &[u8]) -> Result<&[u8]> { - // find number of shards and parity blocks - // encode checksum with each block - // when decoding, remove blocks with invalid checksum - Ok(bytes) } @@ -20,7 +19,6 @@ mod must { use anyhow::Result; use rand::{thread_rng, Rng, RngCore}; - use vfs::{MemoryFS, VfsPath}; use super::{decode, encode}; @@ -35,7 +33,7 @@ mod must { let corrupt_byte_index = rand::thread_rng().gen_range::(0..size); let mut corrupted: [u8; 32] = [0; 32]; - corrupted.copy_from_slice(encoded); + corrupted.copy_from_slice(&encoded); corrupted[corrupt_byte_index] = rand::thread_rng().gen::(); let decoded = decode(&corrupted)?;