common.rs 1.9 KB

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