use std::sync::{Arc, Mutex};
use crate::control::distributed_applier::DistributedApplier;
use nodedb_cluster::calvin::{SEQUENCER_GROUP_ID, SequencerStateMachine};
pub struct SpscCommitApplier {
applier: Arc<DistributedApplier>,
sequencer_state_machine: Arc<Mutex<SequencerStateMachine>>,
}
impl SpscCommitApplier {
pub fn new(
_shared: Arc<crate::control::state::SharedState>,
applier: Arc<DistributedApplier>,
sequencer_state_machine: Arc<Mutex<SequencerStateMachine>>,
) -> Self {
Self {
applier,
sequencer_state_machine,
}
}
}
impl nodedb_cluster::CommitApplier for SpscCommitApplier {
fn apply_committed(&self, group_id: u64, entries: &[nodedb_raft::message::LogEntry]) -> u64 {
if group_id == SEQUENCER_GROUP_ID {
let mut sm = self
.sequencer_state_machine
.lock()
.unwrap_or_else(|p| p.into_inner());
for entry in entries {
if !entry.data.is_empty() {
sm.apply(&entry.data);
}
}
return entries.last().map(|e| e.index).unwrap_or(0);
}
self.applier.apply_committed(group_id, entries)
}
}