1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
//! Canny Lump Storage.
//!
//! `cannyls`は、予測可能なレイテンシの提供を目的として設計された、ローカル用のkey-valueストレージ.
//!
//! # 特徴
//!
//! - 128bitのIDを有する[lump]群を保持するためのストレージ(ローカルKVS)
//!   - メモリ使用量を抑えるために固定長のIDを採用
//! - (主に)HTTPのGET/PUT/DELETE相当の操作を[lump]に対して実行可能
//! - 各操作には[deadline]という時間軸ベースの優先順位を指定可能
//! - 一つの物理デバイス(e.g., HDD)に対して、一つの[device]管理スレッドが割り当てられて、リクエストがスケジューリングされる
//!   - 一つの物理デバイスに対するI/O命令は、全てこの管理スレッド上で直列化されて処理される
//!   - **直列化** という特性上、HDDと相性が良い (逆にSSDの場合には性能が活用しきれない可能性がある)
//! - キャッシュ層を備えず、各操作で発行されるディスクI/O回数が(ほぼ)正確に予測可能:
//!   - GET/DELETE: 一回
//!   - PUT: 最大二回
//!   - ※ 実際にはバックグランド処理(e.g., GC)用のI/Oが発行されることがあるので、上記の値は償却された回数となる
//! - "lusf"という[ストレージフォーマット(v1.0)][format]を定義および使用している
//! - 最大で512TBの容量の物理デバイス(e.g., HDD)をサポート
//! - 冗長化やデータの整合性保証等は行わない
//!
//! # モジュールの依存関係
//!
//! ```text
//! device => storage => nvm
//! ```
//!
//! - [device]モジュール:
//!   - 主に[Device]構造体を提供
//!   - `cannyls`の利用者が直接触るのはこの構造体
//!   - [Storage]を制御するための管理スレッドを起動し、それに対するリクエスト群のスケジューリング等を担当する
//! - [storage]モジュール:
//!   - 主に[Storage]構造体を提供
//!   - [nvm]を永続化層として利用し、その上に[ストレージフォーマット(v1.0)][format]を実装している
//! - [nvm]モジュール:
//!   - 主に[NonVolatileMemory]トレイトとその実装である[FileNvm]を提供
//!   - [storage]に対して永続化層を提供するのが目的
//!   - 現時点では未実装だが、ブロックデバイスを直接操作する[NonVolatileMemory]実装を用意することで、
//!     OS層を完全にバイパスすることも可能
//!
//! # アーキテクチャの詳細
//!
//! [Wiki]を参照のこと。
//!
//! [lump]: ./lump/index.html
//! [deadline]: ./deadline/index.html
//! [device]: ./device/index.html
//! [Device]: ./device/struct.Device.html
//! [storage]: ./storage/index.html
//! [Storage]: ./storage/struct.Storage.html
//! [nvm]: ./nvm/index.html
//! [NonVolatileMemory]: ./nvm/trait.NonVolatileMemory.html
//! [FileNvm]: ./nvm/struct.FileNvm.html
//! [format]: https://github.com/frugalos/cannyls/wiki/Storage-Format
//! [Wiki]: https://github.com/frugalos/cannyls/wiki/
#![warn(missing_docs)]
extern crate adler32;
extern crate byteorder;
extern crate fibers;
#[cfg(test)]
extern crate fibers_global;
extern crate futures;
extern crate libc;
extern crate prometrics;
#[cfg(test)]
extern crate tempdir;
#[macro_use]
extern crate trackable;
extern crate uuid;

pub use error::{Error, ErrorKind};

macro_rules! track_io {
    ($expr:expr) => {
        $expr.map_err(|e: ::std::io::Error| track!(::Error::from(e)))
    };
}

pub mod block;
pub mod deadline;
pub mod device;
pub mod lump;
pub mod metrics;
pub mod nvm;
pub mod storage;

mod error;

/// crate固有の`Result`型.
pub type Result<T> = std::result::Result<T, Error>;