persister.rs 1.8 KB

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