common.rs 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  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. 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(&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. #[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize)]
  48. pub enum PutAppendEnum {
  49. Put,
  50. Append,
  51. }
  52. #[derive(Clone, Debug, Serialize, Deserialize)]
  53. pub struct PutAppendArgs {
  54. pub key: String,
  55. pub value: String,
  56. pub op: PutAppendEnum,
  57. pub unique_id: UniqueId,
  58. }
  59. #[derive(Clone, Debug, Serialize, Deserialize)]
  60. pub struct PutAppendReply {
  61. pub result: Result<(), KVError>,
  62. }
  63. #[derive(Clone, Debug, Serialize, Deserialize)]
  64. pub struct GetArgs {
  65. pub key: String,
  66. }
  67. #[derive(Clone, Debug, Serialize, Deserialize)]
  68. pub struct GetReply {
  69. pub result: Result<Option<String>, KVError>,
  70. }
  71. #[derive(Clone, Debug, Default)]
  72. pub struct KVRaftOptions {
  73. pub max_retry: Option<usize>,
  74. }
  75. #[derive(Clone, Debug, Serialize, Deserialize)]
  76. pub struct CommitSentinelArgs {
  77. pub unique_id: UniqueId,
  78. }
  79. #[derive(Clone, Debug, Serialize, Deserialize)]
  80. pub struct CommitSentinelReply {
  81. pub result: Result<(), KVError>,
  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. }
  111. impl ValidReply for CommitSentinelReply {
  112. fn is_reply_valid(&self) -> bool {
  113. self.result.is_reply_valid()
  114. }
  115. }