Skip to main content

MultiRaft

Struct MultiRaft 

Source
pub struct MultiRaft { /* private fields */ }
Expand description

Multi-Raft coordinator managing multiple Raft groups on a single node.

This coordinator:

  • Manages all Raft groups hosted on this node
  • Batches heartbeats across groups sharing the same leader
  • Routes incoming RPCs to the correct group
  • Collects Ready output from all groups for the caller to execute

Implementations§

Source§

impl MultiRaft

Source

pub fn propose_conf_change( &mut self, group_id: u64, change: &ConfChange, ) -> Result<(u64, u64)>

Propose a configuration change to a Raft group.

The change is serialized into the group’s Raft log as a regular entry with a distinguishing prefix byte. It replicates through the normal AppendEntries path and is applied by every follower replica when the entry commits (see apply_conf_change).

§Single-voter vs. multi-voter groups

Single-voter groups commit inside node.propose itself (see nodedb_raft::node::RaftNode::propose single-voter branch). In that case the commit has already happened by the time we return, so we safely apply the change inline: any caller that reads routing immediately after the propose sees the final state.

Multi-voter groups commit asynchronously once enough followers have replicated the entry. The apply then happens on the tick loop after it observes the updated commit_index. We MUST NOT inline-apply in that case — if the leader steps down before replication completes, a new leader may truncate the log entry and the local state would be permanently ahead of the committed state with no rollback path. Callers that need to wait for the apply should poll the routing table (see raft_loop::join::wait_for_routing_contains_learner).

Returns (group_id, log_index) on success.

Source

pub fn apply_conf_change( &mut self, group_id: u64, change: &ConfChange, ) -> Result<()>

Apply a committed configuration change to this node’s view of the given Raft group.

This is called from the tick loop for every committed entry detected as a conf-change (via ConfChange::from_entry_data). It must be idempotent with respect to no-op changes so replaying the log after a crash does not double-apply.

Source§

impl MultiRaft

Source

pub fn new(node_id: u64, routing: RoutingTable, data_dir: PathBuf) -> Self

Source

pub fn with_election_timeout(self, min: Duration, max: Duration) -> Self

Configure election timeout range.

Source

pub fn with_heartbeat_interval(self, interval: Duration) -> Self

Configure heartbeat interval.

Source

pub fn add_group(&mut self, group_id: u64, peers: Vec<u64>) -> Result<()>

Initialize a Raft group on this node as a voting member.

peers is the list of other voters in the group (excluding self). For a learner-start group, use add_group_as_learner instead.

Source

pub fn add_group_as_learner( &mut self, group_id: u64, voters: Vec<u64>, learners: Vec<u64>, ) -> Result<()>

Initialize a Raft group on this node as a non-voting learner.

The local node boots in the Learner role and will not stand for election until it is promoted by a PromoteLearner conf change.

voters is the full voter set of the group (excluding self). learners is the learner set of the group excluding self — usually empty unless multiple learners are being admitted in the same round.

Source

pub fn tick(&mut self) -> MultiRaftReady

Tick all Raft groups. Returns aggregated ready output.

Source

pub fn routing(&self) -> &RoutingTable

Source

pub fn routing_mut(&mut self) -> &mut RoutingTable

Source

pub fn node_id(&self) -> u64

Source

pub fn group_count(&self) -> usize

Source

pub fn groups_mut(&mut self) -> &mut HashMap<u64, RaftNode<RedbLogStorage>>

Mutable access to the underlying Raft groups (for testing / bootstrap).

Source

pub fn group_statuses(&self) -> Vec<GroupStatus>

Snapshot of all Raft group states for observability.

Source

pub fn leader_for_vshard(&self, vshard_id: u16) -> Result<Option<u64>>

Get the leader for a given vShard (from local group state).

Source

pub fn propose(&mut self, vshard_id: u16, data: Vec<u8>) -> Result<(u64, u64)>

Propose a command to the Raft group that owns the given vShard.

Returns (group_id, log_index) on success.

Source

pub fn propose_to_group(&mut self, group_id: u64, data: Vec<u8>) -> Result<u64>

Propose a command directly to a specific Raft group (e.g. the metadata group, which has no vShard mapping).

Returns the committed log index on success.

Source§

impl MultiRaft

Source

pub fn commit_index_for(&self, group_id: u64) -> Option<u64>

Current commit index for a group, or None if the group is not hosted on this node.

Source

pub fn ready_learners(&self, group_id: u64) -> Vec<u64>

Learners in group_id whose match_index on this leader has caught up to the current commit_index — safe to promote.

Returns an empty vec if this node is not the leader of the group or the group is not hosted here.

Source

pub fn group_leader(&self, group_id: u64) -> u64

Observed leader id for a group (0 = unknown / no election yet).

Source

pub fn group_role_is_leader(&self, group_id: u64) -> bool

Whether this node is currently the leader of group_id.

Source§

impl MultiRaft

Source

pub fn handle_append_entries( &mut self, req: &AppendEntriesRequest, ) -> Result<AppendEntriesResponse>

Route an AppendEntries RPC to the correct group.

Source

pub fn handle_request_vote( &mut self, req: &RequestVoteRequest, ) -> Result<RequestVoteResponse>

Route a RequestVote RPC to the correct group.

Source

pub fn handle_install_snapshot( &mut self, req: &InstallSnapshotRequest, ) -> Result<InstallSnapshotResponse>

Route an InstallSnapshot RPC to the correct group.

Source

pub fn snapshot_metadata(&self, group_id: u64) -> Result<(u64, u64, u64)>

Get the current term and snapshot metadata for a group (for building InstallSnapshot RPCs).

Source

pub fn handle_append_entries_response( &mut self, group_id: u64, peer: u64, resp: &AppendEntriesResponse, ) -> Result<()>

Handle AppendEntries response for a specific group.

Source

pub fn handle_request_vote_response( &mut self, group_id: u64, peer: u64, resp: &RequestVoteResponse, ) -> Result<()>

Handle RequestVote response for a specific group.

Source

pub fn advance_applied(&mut self, group_id: u64, applied_to: u64) -> Result<()>

Advance applied index for a group after processing committed entries.

Source

pub fn match_index_for(&self, group_id: u64, peer: u64) -> Option<u64>

Query a peer’s match_index from a specific Raft group’s leader state.

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> ArchivePointee for T

Source§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
Source§

fn pointer_metadata( _: &<T as ArchivePointee>::ArchivedMetadata, ) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
Source§

impl<'a, T, E> AsTaggedExplicit<'a, E> for T
where T: 'a,

Source§

fn explicit(self, class: Class, tag: u32) -> TaggedParser<'a, Explicit, Self, E>

Source§

impl<'a, T, E> AsTaggedImplicit<'a, E> for T
where T: 'a,

Source§

fn implicit( self, class: Class, constructed: bool, tag: u32, ) -> TaggedParser<'a, Implicit, Self, E>

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> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
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> LayoutRaw for T

Source§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Returns the layout of the type.
Source§

impl<T, N1, N2> Niching<NichedOption<T, N1>> for N2
where T: SharedNiching<N1, N2>, N1: Niching<T>, N2: Niching<T>,

Source§

unsafe fn is_niched(niched: *const NichedOption<T, N1>) -> bool

Returns whether the given value has been niched. Read more
Source§

fn resolve_niched(out: Place<NichedOption<T, N1>>)

Writes data to out indicating that a T is niched.
Source§

impl<T> Pointee for T

Source§

type Metadata = ()

The metadata type for pointers and references to this type.
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

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

Source§

type Error = Infallible

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

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

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.
Source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V

Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more