persister.rs 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. use std::convert::TryFrom;
  2. use bytes::Bytes;
  3. use crate::{LogEntry, Peer, RaftState, Term};
  4. use serde::de::DeserializeOwned;
  5. use serde::Serialize;
  6. pub trait Persister: Send + Sync {
  7. fn read_state(&self) -> Bytes;
  8. fn save_state(&self, bytes: Bytes);
  9. fn state_size(&self) -> usize;
  10. fn save_snapshot_and_state(&self, state: Bytes, snapshot: &[u8]);
  11. }
  12. #[derive(Serialize, Deserialize)]
  13. pub(crate) struct PersistedRaftState<Command> {
  14. pub current_term: Term,
  15. pub voted_for: Option<Peer>,
  16. pub log: Vec<LogEntry<Command>>,
  17. }
  18. impl<Command: Clone, T: AsRef<RaftState<Command>>> From<T>
  19. for PersistedRaftState<Command>
  20. {
  21. fn from(raft_state: T) -> Self {
  22. Self::from(raft_state.as_ref())
  23. }
  24. }
  25. impl<Command: Clone> From<&RaftState<Command>> for PersistedRaftState<Command> {
  26. fn from(raft_state: &RaftState<Command>) -> Self {
  27. Self {
  28. current_term: raft_state.current_term,
  29. voted_for: raft_state.voted_for,
  30. log: raft_state.log.all().to_vec(),
  31. }
  32. }
  33. }
  34. impl<Command: DeserializeOwned> TryFrom<Bytes> for PersistedRaftState<Command> {
  35. type Error = bincode::Error;
  36. fn try_from(value: Bytes) -> Result<Self, Self::Error> {
  37. bincode::deserialize(value.as_ref())
  38. }
  39. }
  40. impl<Command: Serialize> Into<Bytes> for PersistedRaftState<Command> {
  41. fn into(self) -> Bytes {
  42. bincode::serialize(&self)
  43. .expect("Serialization should not fail")
  44. .into()
  45. }
  46. }