[][src]Struct raftlog::ReplicatedLog

pub struct ReplicatedLog<IO: Io> { /* fields omitted */ }

Raftアルゴリズムに基づく分散複製ログ.

利用者はpropose_commandメソッドを使って、コマンドをログに複製保存し、 発生するEventをハンドリングすることで、 整合性のある複製状態機械を実現することが可能となる.

ReplicatedLogStreamトレイトを実装しているが、 これは無限ストリームであり、エラー時を除いて終了することはない.

ただし、構成変更によりノードがクラスタから切り離された場合は、 最終的には、イベントが生成されることは無くなる. this.local_history().config().is_known_node()メソッドを使うことで、 クラスタ内に属しているかどうかは判定可能なので、利用者側が明示的に確認して、 不要になったReplicatedLogインスタンスを回収することは可能.

Methods

impl<IO: Io> ReplicatedLog<IO>[src]

pub fn new(
    node_id: NodeId,
    members: ClusterMembers,
    io: IO,
    metric_builder: &MetricBuilder
) -> Result<Self>
[src]

membersで指定されたクラスタに属するReplicatedLogのローカルインスタンス(ノード)を生成する.

ローカルノードのIDはnode_idで指定するが、これがmembersの含まれている必要は必ずしもない. 例えば、クラスタの構成変更に伴い、新規ノードを追加したい場合には、 membersに現行構成を指定することが望ましいが、このケースでは、 node_idmembersの中には含まれないことになる.

なお、ノードの再起動時を除いて、node_idには対象クラスタの歴史の中でユニークなIDを 割り当てるのが望ましい. (レアケースではあるが、新規追加ノードを、以前に存在したノードと誤認識されてしまうと、 分散ログの整合性が壊れてしまう危険性があるため)

また、以前のノードを再起動したい場合でも、もし永続ストレージが壊れている等の理由で、 前回の状態を正確に復元できないのであれば、 ノード名を変更して、新規ノード追加扱いにした方が安全である.

pub fn metrics(&self) -> &Arc<RaftlogMetrics>[src]

raftlog のメトリクスを返す。

pub fn propose_command(&mut self, command: Vec<u8>) -> Result<ProposalId>[src]

新しいコマンドを提案する.

提案が承認(コミット)された場合には、返り値のLogPositionを含む Event::Committedイベントが返される.

もし返り値のLogPositionとは分岐したEvent::Committedが返された場合には、 この提案が棄却されたことを示している.

Errors

非リーダノードに対して、このメソッドが実行された場合には、 ErrorKind::NotLeaderを理由としたエラーが返される.

pub fn propose_config(
    &mut self,
    new_members: ClusterMembers
) -> Result<ProposalId>
[src]

新しいクラスタ構成(新メンバ群)を提案する.

提案が承認(コミット)された場合には、返り値のLogPositionを含む Event::Committedイベントが返される. ただし、承認された場合であっても、それは新旧混合状態の構成が承認されただけであり、 新メンバのみの構成への移行完了を把握したい場合には、後続のコミットイベントの 追跡を行う必要がある.

もし返り値のLogPositionとは分岐したEvent::Committedが返された場合には、 この提案が棄却されたことを示している.

複数の構成変更を並行して実施することは可能だが、 その場合は、最後に提案されたものが最終的な構成として採用される.

Errors

非リーダノードに対して、このメソッドが実行された場合には、 ErrorKind::NotLeaderを理由としたエラーが返される.

pub fn heartbeat(&mut self) -> Result<SequenceNumber>[src]

強制的にハートビートメッセージ(i.e., AppendEntriesCall)をブロードキャストする.

返り値は、送信メッセージのシーケンス番号.

last_heartbeat_ackメソッドを用いることで、 このハートビートに対して、過半数以上の応答を得られた タイミングを把握することが可能.

また、リーダのコミットを即座にフォロワーに伝えたい場合にも、 このメソッドが活用可能。 (Event::Committedをリーダが生成した直後にheartbeatメソッドを呼び出せば良い)

なおノードの役割が非リーダに変わった場合には、 応答待機中のハートビートは全て破棄されるので注意が必要.

Errors

非リーダノードに対して、このメソッドが実行された場合には、 ErrorKind::NotLeaderを理由としたエラーが返される.

pub fn install_snapshot(
    &mut self,
    new_head: LogIndex,
    snapshot: Vec<u8>
) -> Result<()>
[src]

ローカルログにスナップショットをインストールする.

new_headが新しいローカルログの先頭位置となり、 snapshotはその地点までのコマンド群が適用済みの状態機械のスナップショット、となる.

Errors

既にローカルログに対するスナップショットのインストールが進行中の場合には、 ErrorKind::Busyを理由としてエラーが返される.

また現在のログの先頭よりも前の地点のスナップショットをインストールしようとした場合には、 ErrorKind::InvalidInputを理由としたエラーが返される.

pub fn start_election(&mut self)[src]

新しい選挙を開始する.

何らかの手段で現在のリーダのダウンを検知した場合に呼び出される.

pub fn local_node(&self) -> &Node[src]

ローカルノードの情報を返す.

pub fn local_history(&self) -> &LogHistory[src]

ローカルログの履歴を返す.

pub fn proposal_queue_len(&self) -> usize[src]

ローカルログへの書き込み待ちの状態の提案群の数を返す.

この値は、ローカルストレージの詰まり具合を把握するために有用である.

「ローカルログへは追記完了 and コミット待ち」の個数は 知りたい場合にはlocal_historyメソッド経由で取得可能.

ローカルノードが非リーダである場合には、常に0が返される.

pub fn is_snapshot_installing(&self) -> bool[src]

スナップショットをインストール中の場合にはtrueを返す.

このメソッドがtrueを返している間は、 新しいスナップショットのインストールを行うことはできない.

pub fn last_heartbeat_ack(&self) -> SequenceNumber[src]

過半数以上の応答を得られた最新のハートビート(i.e., AppendEntriesCall) のシーケンス番号を返す.

この値は、同じ選挙期間に関しては減少することはないことが保証されている.

注意

ハートビートを行うのはリーダノードのみなので、それ以外のノードに関しては、 このメソッドが返す値は意味を持たない.

pub fn cluster_config(&self) -> &ClusterConfig[src]

現在のクラスタ構成を返す.

pub fn io(&self) -> &IO[src]

I/O実装に対する参照を返す.

pub unsafe fn io_mut(&mut self) -> &mut IO[src]

I/O実装に対する破壊的な参照を返す.

Safety

破壊的な操作は、Raftの管理外の挙動となり、 整合性を崩してしまう可能性もあるので、 注意を喚起する意味でunsafeと設定されている.

Trait Implementations

impl<IO: Io> Stream for ReplicatedLog<IO>[src]

type Item = Event

The type of item this stream will yield on success.

type Error = Error

The type of error this stream may generate.

Auto Trait Implementations

impl<IO> RefUnwindSafe for ReplicatedLog<IO> where
    IO: RefUnwindSafe,
    <IO as Io>::LoadBallot: RefUnwindSafe,
    <IO as Io>::LoadLog: RefUnwindSafe,
    <IO as Io>::SaveBallot: RefUnwindSafe,
    <IO as Io>::SaveLog: RefUnwindSafe,
    <IO as Io>::Timeout: RefUnwindSafe

impl<IO> Send for ReplicatedLog<IO> where
    IO: Send,
    <IO as Io>::LoadBallot: Send,
    <IO as Io>::LoadLog: Send,
    <IO as Io>::SaveBallot: Send,
    <IO as Io>::SaveLog: Send,
    <IO as Io>::Timeout: Send

impl<IO> Sync for ReplicatedLog<IO> where
    IO: Sync,
    <IO as Io>::LoadBallot: Sync,
    <IO as Io>::LoadLog: Sync,
    <IO as Io>::SaveBallot: Sync,
    <IO as Io>::SaveLog: Sync,
    <IO as Io>::Timeout: Sync

impl<IO> Unpin for ReplicatedLog<IO> where
    IO: Unpin,
    <IO as Io>::LoadBallot: Unpin,
    <IO as Io>::LoadLog: Unpin,
    <IO as Io>::SaveBallot: Unpin,
    <IO as Io>::SaveLog: Unpin,
    <IO as Io>::Timeout: Unpin

impl<IO> UnwindSafe for ReplicatedLog<IO> where
    IO: UnwindSafe,
    <IO as Io>::LoadBallot: UnwindSafe,
    <IO as Io>::LoadLog: RefUnwindSafe + UnwindSafe,
    <IO as Io>::SaveBallot: UnwindSafe,
    <IO as Io>::SaveLog: UnwindSafe,
    <IO as Io>::Timeout: UnwindSafe

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> From<T> for T[src]

impl<T, U> Into<U> for T where
    U: From<T>, 
[src]

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

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

The type returned in the event of a conversion error.