persister.rs 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  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. /// An object that saves bytes to permanent storage.
  8. ///
  9. /// When the methods of this trait returns, data should have been persisted to
  10. /// the storage. These methods should never return failure except panicking.
  11. /// They should not block forever, either.
  12. pub trait Persister: Send + Sync {
  13. fn read_state(&self) -> Bytes;
  14. fn save_state(&self, bytes: Bytes);
  15. fn state_size(&self) -> usize;
  16. fn save_snapshot_and_state(&self, state: Bytes, snapshot: &[u8]);
  17. }
  18. #[derive(Serialize, Deserialize)]
  19. pub(crate) struct PersistedRaftState<Command> {
  20. pub current_term: Term,
  21. pub voted_for: Option<Peer>,
  22. pub log: LogArray<Command>,
  23. }
  24. impl<Command: Clone, T: AsRef<RaftState<Command>>> From<T>
  25. for PersistedRaftState<Command>
  26. {
  27. fn from(raft_state: T) -> Self {
  28. Self::from(raft_state.as_ref())
  29. }
  30. }
  31. impl<Command: Clone> From<&RaftState<Command>> for PersistedRaftState<Command> {
  32. fn from(raft_state: &RaftState<Command>) -> Self {
  33. Self {
  34. current_term: raft_state.current_term,
  35. voted_for: raft_state.voted_for,
  36. log: raft_state.log.clone(),
  37. }
  38. }
  39. }
  40. impl<Command: DeserializeOwned> TryFrom<Bytes> for PersistedRaftState<Command> {
  41. type Error = bincode::Error;
  42. fn try_from(value: Bytes) -> Result<Self, Self::Error> {
  43. bincode::deserialize(value.as_ref())
  44. }
  45. }
  46. impl<Command: Serialize> From<PersistedRaftState<Command>> for Bytes {
  47. fn from(value: PersistedRaftState<Command>) -> Bytes {
  48. bincode::serialize(&value)
  49. .expect("Serialization should not fail")
  50. .into()
  51. }
  52. }