persister.rs 1.5 KB

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