common.rs 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  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. pub struct UniqueId {
  7. clerk_id: u64,
  8. sequence_id: u64,
  9. }
  10. #[derive(Debug)]
  11. pub 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. pub(crate) const GET: &str = "KVServer.Get";
  37. pub(crate) const PUT_APPEND: &str = "KVServer.PutAppend";
  38. #[derive(Clone, Debug, Serialize, Deserialize)]
  39. pub enum PutAppendEnum {
  40. Put,
  41. Append,
  42. }
  43. #[derive(Clone, Debug, Serialize, Deserialize)]
  44. pub struct PutAppendArgs {
  45. pub key: String,
  46. pub value: String,
  47. pub op: PutAppendEnum,
  48. pub unique_id: UniqueId,
  49. }
  50. #[derive(Clone, Debug, Serialize, Deserialize)]
  51. pub enum KvError {
  52. NoKey,
  53. Other(String),
  54. }
  55. #[derive(Clone, Debug, Serialize, Deserialize)]
  56. pub struct PutAppendReply {
  57. pub result: Result<(), KvError>,
  58. }
  59. #[derive(Clone, Debug, Serialize, Deserialize)]
  60. pub struct GetArgs {
  61. pub key: String,
  62. pub unique_id: UniqueId,
  63. }
  64. #[derive(Clone, Debug, Serialize, Deserialize)]
  65. pub struct GetReply {
  66. pub result: Result<String, KvError>,
  67. pub is_retry: bool,
  68. }
  69. #[derive(Clone, Debug, Default)]
  70. pub struct KVRaftOptions {
  71. pub max_retry: Option<usize>,
  72. }