use std::io;
use std::sync::Arc;
use std::sync::mpsc::SyncSender;
use std::sync::mpsc::sync_channel;
use raft_log::Config;
use raft_log::RaftLog;
use raft_log::api::raft_log_writer::RaftLogWriter;
use raft_log::api::types::Types;
#[derive(Debug, Clone, PartialEq, Eq, Default)]
struct MyTypes;
impl Types for MyTypes {
type LogId = (u64, u64);
type LogPayload = String;
type Vote = (u64, u64);
type UserData = String;
type Callback = SyncSender<io::Result<()>>;
fn log_index(log_id: &Self::LogId) -> u64 {
log_id.1
}
fn payload_size(payload: &Self::LogPayload) -> u64 {
payload.len() as u64
}
}
fn main() -> io::Result<()> {
let temp_dir = tempfile::tempdir()?;
let config = Arc::new(Config {
dir: temp_dir.path().to_str().unwrap().to_string(),
..Default::default()
});
let mut raft_log = RaftLog::<MyTypes>::open(config)?;
let vote = (1, 2); raft_log.save_vote(vote)?;
let entries = vec![
((1, 1), "first entry".to_string()), ((1, 2), "second entry".to_string()), ((2, 3), "third entry".to_string()), ];
raft_log.append(entries)?;
raft_log.commit((1, 2))?;
{
let (tx, rx) = sync_channel(1);
raft_log.flush(Some(tx))?;
rx.recv().unwrap()?;
}
let read_entries: Vec<_> =
raft_log.read(1, 3).collect::<Result<Vec<_>, _>>()?;
println!("Read {} entries:", read_entries.len());
for ((term, idx), payload) in read_entries {
println!(" Term: {}, Index: {}, Payload: {}", term, idx, payload);
}
let state = raft_log.log_state();
println!("\nCurrent state:");
println!(" Last log: {:?}", state.last());
println!(" Committed: {:?}", state.committed());
println!(" Vote: {:?}", state.vote());
Ok(())
}