common.rs 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. use std::sync::atomic::{AtomicU64, Ordering};
  2. use rand::{thread_rng, RngCore};
  3. use serde_derive::{Deserialize, Serialize};
  4. pub type ClerkId = u64;
  5. #[derive(
  6. Clone,
  7. Copy,
  8. Debug,
  9. Default,
  10. Hash,
  11. Ord,
  12. PartialOrd,
  13. Eq,
  14. PartialEq,
  15. Serialize,
  16. Deserialize,
  17. )]
  18. pub struct UniqueId {
  19. pub clerk_id: ClerkId,
  20. pub sequence_id: u64,
  21. }
  22. #[derive(Debug)]
  23. pub struct UniqueIdSequence {
  24. clerk_id: u64,
  25. sequence_id: AtomicU64,
  26. }
  27. impl UniqueIdSequence {
  28. pub fn new() -> Self {
  29. Self {
  30. clerk_id: thread_rng().next_u64(),
  31. sequence_id: AtomicU64::new(0),
  32. }
  33. }
  34. pub fn zero(&self) -> UniqueId {
  35. UniqueId {
  36. clerk_id: self.clerk_id,
  37. sequence_id: 0,
  38. }
  39. }
  40. pub fn inc(&mut self) -> UniqueId {
  41. let seq = self.sequence_id.fetch_add(1, Ordering::Relaxed);
  42. UniqueId {
  43. clerk_id: self.clerk_id,
  44. sequence_id: seq,
  45. }
  46. }
  47. }
  48. #[derive(Clone, Debug, Eq, PartialEq, 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 struct PutAppendReply {
  62. pub result: Result<(), KVError>,
  63. }
  64. #[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize)]
  65. pub enum GetEnum {
  66. AllowDuplicate,
  67. NoDuplicate,
  68. }
  69. #[derive(Clone, Debug, Serialize, Deserialize)]
  70. pub struct GetArgs {
  71. pub key: String,
  72. pub op: GetEnum,
  73. pub unique_id: UniqueId,
  74. }
  75. #[derive(Clone, Debug, Serialize, Deserialize)]
  76. pub struct GetReply {
  77. pub result: Result<Option<String>, KVError>,
  78. }
  79. #[derive(Clone, Debug, Default)]
  80. pub struct KVRaftOptions {
  81. pub max_retry: Option<usize>,
  82. }
  83. #[derive(Clone, Debug, Serialize, Deserialize)]
  84. pub enum KVError {
  85. NotLeader,
  86. Expired,
  87. TimedOut,
  88. Conflict,
  89. }
  90. pub trait ValidReply {
  91. fn is_reply_valid(&self) -> bool;
  92. }
  93. impl<T> ValidReply for Result<T, KVError> {
  94. fn is_reply_valid(&self) -> bool {
  95. !matches!(
  96. self.as_ref().err(),
  97. Some(KVError::TimedOut) | Some(KVError::NotLeader)
  98. )
  99. }
  100. }
  101. impl ValidReply for PutAppendReply {
  102. fn is_reply_valid(&self) -> bool {
  103. self.result.is_reply_valid()
  104. }
  105. }
  106. impl ValidReply for GetReply {
  107. fn is_reply_valid(&self) -> bool {
  108. self.result.is_reply_valid()
  109. }
  110. }