Skip to main content

raftlog/
error.rs

1use prometrics;
2use std;
3use trackable::error::TrackableError;
4use trackable::error::{ErrorKind as TrackableErrorKind, ErrorKindExt};
5
6/// クレート固有の`Error`型.
7#[derive(Debug, Clone, TrackableError)]
8pub struct Error(TrackableError<ErrorKind>);
9impl From<std::io::Error> for Error {
10    fn from(f: std::io::Error) -> Self {
11        ErrorKind::Other.cause(f).into()
12    }
13}
14impl From<prometrics::Error> for Error {
15    fn from(f: prometrics::Error) -> Self {
16        ErrorKind::Other.cause(f).into()
17    }
18}
19
20/// 発生し得るエラーの種類.
21#[derive(Debug, Clone, Copy, PartialEq, Eq)]
22pub enum ErrorKind {
23    /// リーダのみが処理可能な操作が、リーダではないノードに対して行われた.
24    ///
25    /// このエラーを受け取った場合、利用者はリーダノードに対して、
26    /// 同じ要求をリトライすべきである.
27    NotLeader,
28
29    /// リソースに空きが無くて、要求を受け付けることができない.
30    ///
31    /// このエラーを受け取った場合、利用者はある程度時間を空ける、ないし、
32    /// 現在実行中の処理の完了を確認してから、同様の要求をリトライすべきである.
33    ///
34    /// 典型的には、あるスナップショットのインストール中に、
35    /// 別のスナップショットのインストールが要求された場合に、
36    /// このエラーが返される.
37    Busy,
38
39    /// 入力が不正.
40    ///
41    /// このエラーを受け取った場合、利用者は可能であれば、
42    /// 入力値を適切なものに修正して、同様の操作をリトライすることが望ましい.
43    InvalidInput,
44
45    /// 不整合な状態に陥った.
46    ///
47    /// プログラムのバグやI/O周りの重大な問題(e.g., データ改善)により、
48    /// 本来発生するはずのない状態が生じてしまった.
49    ///
50    /// このエラーを受け取った場合、利用者はそのノードの使用を停止して、
51    /// どのような問題が発生しているかを詳細に調査すべきである.
52    ///
53    /// もし使用を継続した場合には、最悪のケースでは、コミット済みのログ領域が
54    /// 別のエントリによって上書きされてしまうこともあり得る.
55    InconsistentState,
56
57    /// その他エラー.
58    ///
59    /// 主に`Io`トレイトの実装のために設けられたエラー区分.
60    ///
61    /// このエラーを受け取った場合、利用者はそのノードの使用を停止して、
62    /// どのような問題が発生しているかを詳細に調査すべきである.
63    Other,
64}
65impl TrackableErrorKind for ErrorKind {}