memory_persister.rs 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. use std::sync::Arc;
  2. use parking_lot::Mutex;
  3. #[derive(Clone)]
  4. pub struct State {
  5. bytes: bytes::Bytes,
  6. snapshot: Vec<u8>,
  7. }
  8. pub struct MemoryPersister {
  9. state: Mutex<State>,
  10. }
  11. impl MemoryPersister {
  12. pub fn new() -> Self {
  13. Self {
  14. state: Mutex::new(State {
  15. bytes: bytes::Bytes::new(),
  16. snapshot: vec![],
  17. }),
  18. }
  19. }
  20. }
  21. impl ruaft::Persister for MemoryPersister {
  22. fn read_state(&self) -> bytes::Bytes {
  23. self.state.lock().bytes.clone()
  24. }
  25. fn save_state(&self, data: bytes::Bytes) {
  26. self.state.lock().bytes = data;
  27. }
  28. fn state_size(&self) -> usize {
  29. self.state.lock().bytes.len()
  30. }
  31. fn save_snapshot_and_state(&self, state: bytes::Bytes, snapshot: &[u8]) {
  32. let mut this = self.state.lock();
  33. this.bytes = state;
  34. this.snapshot = snapshot.to_vec();
  35. }
  36. }
  37. impl MemoryPersister {
  38. pub fn read(&self) -> State {
  39. self.state.lock().clone()
  40. }
  41. pub fn restore(&self, state: State) {
  42. *self.state.lock() = state;
  43. }
  44. pub fn snapshot_size(&self) -> usize {
  45. self.state.lock().snapshot.len()
  46. }
  47. }
  48. #[derive(Default)]
  49. pub struct MemoryStorage {
  50. state_vec: Vec<Arc<MemoryPersister>>,
  51. }
  52. impl MemoryStorage {
  53. pub fn make(&mut self) -> Arc<MemoryPersister> {
  54. let persister = Arc::new(MemoryPersister::new());
  55. self.state_vec.push(persister.clone());
  56. persister
  57. }
  58. pub fn at(&self, index: usize) -> Arc<MemoryPersister> {
  59. self.state_vec[index].clone()
  60. }
  61. pub fn replace(&mut self, index: usize) -> Arc<MemoryPersister> {
  62. let persister = Arc::new(MemoryPersister::new());
  63. self.state_vec[index] = persister.clone();
  64. persister
  65. }
  66. pub fn all(&self) -> &Vec<Arc<MemoryPersister>> {
  67. &self.state_vec
  68. }
  69. }