3 stable releases
Uses old Rust 2015
| 1.0.2 | Oct 12, 2018 |
|---|---|
| 1.0.1 | Oct 2, 2018 |
| 1.0.0 | Sep 27, 2018 |
#1933 in Encoding
39 downloads per month
Used in 2 crates
(via frugalos_segment)
28KB
386 lines
ecpool
This crate provides thread pool (ErasureCoderPool) for managing executions of erasure coding.
ecpool also provides ErasureCode trait defines erasure coding interface
and of which implemtations can be executed via ErasureCoderPool.
There are some built-in implementations of the trait:
LibErasureCoder:- This implementation uses
liberasurecodecrate that is a wrapper for openstack/liberasurecode library. - It is highly optimized and stable but only available in Unix environments.
- This implementation uses
ReplicaCoder:- This implementation simply replicates the input data.
- It is provided for example and testing purposes only and not intended to use in production.
Build Prerequisites
It is required to install openstack/liberasurecode and its dependencies by executing the following commands before building this crate:
$ git clone https://github.com/frugalos/liberasurecode
$ cd liberasurecode && sudo ./install_deps.sh
Examples
Basic usage:
use ecpool::replica::ReplicaCoder;
use ecpool::{ErrorKind, ErasureCoderPool};
use std::num::NonZeroUsize;
use std::result::Result;
use trackable::error::{Failure, Failed};
// Creates a pool
let data_fragments = NonZeroUsize::new(4).ok_or_else(|| Failure::from(Failed))?;
let parity_fragments = NonZeroUsize::new(2).ok_or_else(|| Failure::from(Failed))?;
let coder = ErasureCoderPool::new(ReplicaCoder::new(data_fragments, parity_fragments));
// Encodes
let data = vec![0, 1, 2, 3];
let encoded = fibers_global::execute(coder.encode(data.clone()))?;
// Decodes
assert_eq!(
Some(&data),
fibers_global::execute(coder.decode(encoded[0..].to_vec()))
.as_ref()
.ok()
);
assert_eq!(
Some(&data),
fibers_global::execute(coder.decode(encoded[1..].to_vec()))
.as_ref()
.ok()
);
assert_eq!(
Some(&data),
fibers_global::execute(coder.decode(encoded[2..].to_vec()))
.as_ref()
.ok()
);
assert_eq!(
Err(ErrorKind::InvalidInput),
fibers_global::execute(coder.decode(encoded[3..].to_vec())).map_err(|e| *e.kind())
);
Dependencies
~3MB
~67K SLoC