use std::fmt;
use display_more::DisplayOptionExt;
use openraft_macros::since;
use crate::RaftTypeConfig;
use crate::type_config::alias::LogIdOf;
#[since(version = "0.10.0")]
#[derive(Debug, Clone)]
pub struct LinearizeState<C>
where C: RaftTypeConfig
{
node_id: C::NodeId,
read_log_id: LogIdOf<C>,
applied: Option<LogIdOf<C>>,
}
impl<C> fmt::Display for LinearizeState<C>
where C: RaftTypeConfig
{
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "LinearizeState[id={}]", self.node_id)?;
write!(
f,
"{{ read_log_id: {}, applied: {} }}",
self.read_log_id,
self.applied.display()
)
}
}
impl<C> LinearizeState<C>
where C: RaftTypeConfig
{
pub(crate) fn new(node_id: C::NodeId, read_log_id: LogIdOf<C>, applied: Option<LogIdOf<C>>) -> Self {
Self {
node_id,
read_log_id,
applied,
}
}
pub(crate) fn with_applied(mut self, node_id: C::NodeId, applied: Option<LogIdOf<C>>) -> Self {
self.node_id = node_id;
self.applied = applied;
self
}
pub(crate) fn is_ready_on_node(&self, node_id: &C::NodeId) -> bool {
self.node_id == *node_id && self.applied.as_ref() >= Some(&self.read_log_id)
}
#[since(version = "0.10.0")]
pub fn node_id(&self) -> &C::NodeId {
&self.node_id
}
#[since(version = "0.10.0")]
pub fn read_log_id(&self) -> &LogIdOf<C> {
&self.read_log_id
}
#[since(version = "0.10.0")]
pub fn applied(&self) -> Option<&LogIdOf<C>> {
self.applied.as_ref()
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::engine::testing::UTConfig;
use crate::engine::testing::log_id;
#[test]
fn test_display() {
let state: LinearizeState<UTConfig> = LinearizeState::new(1, log_id(1, 1, 1), Some(log_id(1, 1, 0)));
assert_eq!(
format!("{}", state),
"LinearizeState[id=1]{ read_log_id: T1-N1.1, applied: T1-N1.0 }"
);
let state = state.with_applied(2, Some(log_id(3, 3, 3)));
assert_eq!(
format!("{}", state),
"LinearizeState[id=2]{ read_log_id: T1-N1.1, applied: T3-N3.3 }"
);
}
}