Skip to main content

ErasureCoding

Struct ErasureCoding 

Source
pub struct ErasureCoding;
Expand description

Erasure coding abstraction.

Supports creation of parity shards and recovery of missing data.

Erasure coding processes each 64-byte block of shards independently from other blocks, so large shards are split into narrower columns that are processed one by one, which keeps the working set in CPU cache and is much faster than processing whole shards at once. With parallel feature enabled, par_* methods additionally process columns concurrently.

Implementations§

Source§

impl ErasureCoding

Source

pub fn new() -> Self

Create new erasure coding instance

Source

pub fn extend<const NUM_SHARDS: usize, const SHARD_BYTES: usize>( &self, source: &[[u8; SHARD_BYTES]; NUM_SHARDS], parity: &mut [[u8; SHARD_BYTES]; NUM_SHARDS], ) -> Result<(), ErasureCodingError>

Extend contiguously stored source shards with parity shards

Source

pub fn par_extend<const NUM_SHARDS: usize, const SHARD_BYTES: usize>( &self, source: &[[u8; SHARD_BYTES]; NUM_SHARDS], parity: &mut [[u8; SHARD_BYTES]; NUM_SHARDS], ) -> Result<(), ErasureCodingError>

Parallel version of Self::extend().

Columns of large shards are processed using up to 4 threads, which is beneficial when erasure coding is the only thing running. Prefer Self::extend() when calling from code that is already parallel to avoid contention.

Small shards (like many record chunks) are not split into columns and are processed by a single thread, the same way as Self::extend() does.

Source

pub fn extend_scattered<const NUM_SHARDS: usize, const SHARD_BYTES: usize, SourceShard, ParityShard>( &self, source: [SourceShard; NUM_SHARDS], parity: [ParityShard; NUM_SHARDS], ) -> Result<(), ErasureCodingError>
where SourceShard: AsRef<[u8; SHARD_BYTES]>, ParityShard: AsMut<[u8; SHARD_BYTES]>,

Extend source shards with parity shards, where shards are not stored contiguously

Source

pub fn par_extend_scattered<const NUM_SHARDS: usize, const SHARD_BYTES: usize, SourceShard, ParityShard>( &self, source: [SourceShard; NUM_SHARDS], parity: [ParityShard; NUM_SHARDS], ) -> Result<(), ErasureCodingError>
where SourceShard: AsRef<[u8; SHARD_BYTES]>, ParityShard: AsMut<[u8; SHARD_BYTES]>,

Parallel version of Self::extend_scattered().

Columns of large shards are processed using up to 4 threads, which is beneficial when erasure coding is the only thing running. Prefer Self::extend_scattered() when calling from code that is already parallel to avoid contention.

Small shards (like many record chunks) are not split into columns and are processed by a single thread, the same way as Self::extend_scattered() does.

Source

pub fn recover_source<const NUM_SHARDS: usize, const SHARD_BYTES: usize>( &self, source: &mut [[u8; SHARD_BYTES]; NUM_SHARDS], parity: &[[u8; SHARD_BYTES]; NUM_SHARDS], present: &ShardsPresent<NUM_SHARDS>, ) -> Result<(), ErasureCodingError>

Recover missing source shards in place, with everything stored contiguously.

Parity shards are inputs only, missing ones are simply not used. Prefer this over Self::recover_all() when parity shards are not needed.

Source

pub fn par_recover_source<const NUM_SHARDS: usize, const SHARD_BYTES: usize>( &self, source: &mut [[u8; SHARD_BYTES]; NUM_SHARDS], parity: &[[u8; SHARD_BYTES]; NUM_SHARDS], present: &ShardsPresent<NUM_SHARDS>, ) -> Result<(), ErasureCodingError>

Parallel version of Self::recover_source().

Columns of large shards are processed using up to 4 threads, which is beneficial when erasure coding is the only thing running. Prefer Self::recover_source() when calling from code that is already parallel to avoid contention.

Small shards (like many record chunks) are not split into columns and are processed by a single thread, the same way as Self::recover_source() does.

Source

pub fn recover_source_scattered<const NUM_SHARDS: usize, const SHARD_BYTES: usize, SourceShard, ParityShard>( &self, source: [SourceShard; NUM_SHARDS], source_present: &ShardsBitmap<NUM_SHARDS>, parity: [Option<ParityShard>; NUM_SHARDS], ) -> Result<(), ErasureCodingError>
where SourceShard: AsMut<[u8; SHARD_BYTES]>, ParityShard: AsRef<[u8; SHARD_BYTES]>,

Recover missing source shards in place, where shards are not stored contiguously.

Parity shards are inputs only, so missing ones simply have no memory.

Source

pub fn par_recover_source_scattered<const NUM_SHARDS: usize, const SHARD_BYTES: usize, SourceShard, ParityShard>( &self, source: [SourceShard; NUM_SHARDS], source_present: &ShardsBitmap<NUM_SHARDS>, parity: [Option<ParityShard>; NUM_SHARDS], ) -> Result<(), ErasureCodingError>
where SourceShard: AsMut<[u8; SHARD_BYTES]>, ParityShard: AsRef<[u8; SHARD_BYTES]>,

Parallel version of Self::recover_source_scattered().

Columns of large shards are processed using up to 4 threads, which is beneficial when erasure coding is the only thing running. Prefer Self::recover_source_scattered() when calling from code that is already parallel to avoid contention.

Small shards (like many record chunks) are not split into columns and are processed by a single thread, the same way as Self::recover_source_scattered() does.

Source

pub fn recover_all<const NUM_SHARDS: usize, const SHARD_BYTES: usize>( &self, source: &mut [[u8; SHARD_BYTES]; NUM_SHARDS], parity: &mut [[u8; SHARD_BYTES]; NUM_SHARDS], present: &ShardsPresent<NUM_SHARDS>, ) -> Result<(), ErasureCodingError>

Recover missing source and parity shards in place, with everything stored contiguously.

Use Self::recover_source() instead if parity shards are not needed.

Source

pub fn par_recover_all<const NUM_SHARDS: usize, const SHARD_BYTES: usize>( &self, source: &mut [[u8; SHARD_BYTES]; NUM_SHARDS], parity: &mut [[u8; SHARD_BYTES]; NUM_SHARDS], present: &ShardsPresent<NUM_SHARDS>, ) -> Result<(), ErasureCodingError>

Parallel version of Self::recover_all().

Columns of large shards are processed using up to 4 threads, which is beneficial when erasure coding is the only thing running. Prefer Self::recover_all() when calling from code that is already parallel to avoid contention.

Small shards (like many record chunks) are not split into columns and are processed by a single thread, the same way as Self::recover_all() does.

Source

pub fn recover_all_scattered<const NUM_SHARDS: usize, const SHARD_BYTES: usize, SourceShard, ParityShard>( &self, source: [SourceShard; NUM_SHARDS], parity: [ParityShard; NUM_SHARDS], present: &ShardsPresent<NUM_SHARDS>, ) -> Result<(), ErasureCodingError>
where SourceShard: AsMut<[u8; SHARD_BYTES]>, ParityShard: AsMut<[u8; SHARD_BYTES]>,

Recover missing source and parity shards in place, where shards are not stored contiguously

Source

pub fn par_recover_all_scattered<const NUM_SHARDS: usize, const SHARD_BYTES: usize, SourceShard, ParityShard>( &self, source: [SourceShard; NUM_SHARDS], parity: [ParityShard; NUM_SHARDS], present: &ShardsPresent<NUM_SHARDS>, ) -> Result<(), ErasureCodingError>
where SourceShard: AsMut<[u8; SHARD_BYTES]>, ParityShard: AsMut<[u8; SHARD_BYTES]>,

Parallel version of Self::recover_all_scattered().

Columns of large shards are processed using up to 4 threads, which is beneficial when erasure coding is the only thing running. Prefer Self::recover_all_scattered() when calling from code that is already parallel to avoid contention.

Small shards (like many record chunks) are not split into columns and are processed by a single thread, the same way as Self::recover_all_scattered() does.

Trait Implementations§

Source§

impl Clone for ErasureCoding

Source§

fn clone(&self) -> Self

Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for ErasureCoding

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for ErasureCoding

Source§

fn default() -> Self

Returns the “default value” for a type. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ

Converts self into a Left variant of Either<Self, Self> if into_left is true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
where F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> if into_left(&self) returns true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
§

impl<T> Pointable for T

§

const ALIGN: usize

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = !

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, !>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.