common.rs 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. use rand::{thread_rng, RngCore};
  2. use std::sync::atomic::{AtomicU64, Ordering};
  3. #[derive(
  4. Clone, Debug, Ord, PartialOrd, Eq, PartialEq, Serialize, Deserialize,
  5. )]
  6. struct UniqueId {
  7. clerk_id: u64,
  8. sequence_id: u64,
  9. }
  10. #[derive(Debug)]
  11. struct UniqueIdSequence {
  12. clerk_id: u64,
  13. sequence_id: AtomicU64,
  14. }
  15. impl UniqueIdSequence {
  16. pub fn new() -> Self {
  17. Self {
  18. clerk_id: thread_rng().next_u64(),
  19. sequence_id: AtomicU64::new(0),
  20. }
  21. }
  22. pub fn zero(&self) -> UniqueId {
  23. UniqueId {
  24. clerk_id: self.clerk_id,
  25. sequence_id: 0,
  26. }
  27. }
  28. pub fn inc(&mut self) -> UniqueId {
  29. let seq = self.sequence_id.fetch_add(1, Ordering::Relaxed);
  30. UniqueId {
  31. clerk_id: self.clerk_id,
  32. sequence_id: seq,
  33. }
  34. }
  35. }
  36. #[derive(Clone, Debug, Serialize, Deserialize)]
  37. enum PutAppendEnum {
  38. Put,
  39. Append,
  40. }
  41. #[derive(Clone, Debug, Serialize, Deserialize)]
  42. struct PutAppendArgs {
  43. key: String,
  44. value: String,
  45. op: PutAppendEnum,
  46. unique_id: UniqueId,
  47. }
  48. #[derive(Clone, Debug, Serialize, Deserialize)]
  49. enum KvError {
  50. NoKey,
  51. Other(String),
  52. }
  53. #[derive(Clone, Debug, Serialize, Deserialize)]
  54. struct PutAppendReply {
  55. result: Result<(), KvError>,
  56. }
  57. #[derive(Clone, Debug, Serialize, Deserialize)]
  58. struct GetArgs {
  59. key: String,
  60. unique_id: UniqueId,
  61. }
  62. #[derive(Clone, Debug, Serialize, Deserialize)]
  63. struct GetReply {
  64. result: Result<String, KvError>,
  65. is_retry: bool,
  66. }