common.rs 1.8 KB

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