common.rs 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  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. Hash,
  10. Ord,
  11. PartialOrd,
  12. Eq,
  13. PartialEq,
  14. Serialize,
  15. Deserialize,
  16. )]
  17. pub struct UniqueId {
  18. pub clerk_id: ClerkId,
  19. pub sequence_id: u64,
  20. }
  21. #[derive(Debug)]
  22. pub struct UniqueIdSequence {
  23. clerk_id: u64,
  24. sequence_id: AtomicU64,
  25. }
  26. impl UniqueIdSequence {
  27. pub fn new() -> Self {
  28. Self {
  29. clerk_id: thread_rng().next_u64(),
  30. sequence_id: AtomicU64::new(0),
  31. }
  32. }
  33. pub fn zero(&self) -> UniqueId {
  34. UniqueId {
  35. clerk_id: self.clerk_id,
  36. sequence_id: 0,
  37. }
  38. }
  39. pub fn inc(&mut self) -> UniqueId {
  40. let seq = self.sequence_id.fetch_add(1, Ordering::Relaxed);
  41. UniqueId {
  42. clerk_id: self.clerk_id,
  43. sequence_id: seq,
  44. }
  45. }
  46. }
  47. pub(crate) const GET: &str = "KVServer.Get";
  48. pub(crate) const PUT_APPEND: &str = "KVServer.PutAppend";
  49. #[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize)]
  50. pub enum PutAppendEnum {
  51. Put,
  52. Append,
  53. }
  54. #[derive(Clone, Debug, Serialize, Deserialize)]
  55. pub struct PutAppendArgs {
  56. pub key: String,
  57. pub value: String,
  58. pub op: PutAppendEnum,
  59. pub unique_id: UniqueId,
  60. }
  61. #[derive(Clone, Debug, Serialize, Deserialize)]
  62. pub enum KVError {
  63. NotLeader,
  64. Expired,
  65. TimedOut,
  66. Conflict,
  67. }
  68. #[derive(Clone, Debug, Serialize, Deserialize)]
  69. pub struct PutAppendReply {
  70. pub result: Result<(), KVError>,
  71. }
  72. #[derive(Clone, Debug, Serialize, Deserialize)]
  73. pub struct GetArgs {
  74. pub key: String,
  75. pub unique_id: UniqueId,
  76. }
  77. #[derive(Clone, Debug, Serialize, Deserialize)]
  78. pub struct GetReply {
  79. pub result: Result<Option<String>, KVError>,
  80. pub is_retry: bool,
  81. }
  82. #[derive(Clone, Debug, Default)]
  83. pub struct KVRaftOptions {
  84. pub max_retry: Option<usize>,
  85. }
  86. pub trait ValidReply {
  87. fn is_reply_valid(&self) -> bool;
  88. }
  89. impl ValidReply for PutAppendReply {
  90. fn is_reply_valid(&self) -> bool {
  91. if let Err(KVError::NotLeader) = &self.result {
  92. return false;
  93. }
  94. return true;
  95. }
  96. }
  97. impl ValidReply for GetReply {
  98. fn is_reply_valid(&self) -> bool {
  99. if let Err(KVError::NotLeader) = &self.result {
  100. return false;
  101. }
  102. return true;
  103. }
  104. }