Эх сурвалжийг харах

Add put_append to the server.

Jing Yang 4 жил өмнө
parent
commit
911aab6e2a

+ 1 - 1
tests/kvraft/client.rs

@@ -1,5 +1,5 @@
 use super::common::{
-    GetArgs, GetReply, KVError, KVRaftOptions, PutAppendArgs, PutAppendReply,
+    GetArgs, GetReply, KVRaftOptions, PutAppendArgs, PutAppendReply,
     UniqueIdSequence, GET, PUT_APPEND,
 };
 use crate::kvraft::common::PutAppendEnum;

+ 1 - 1
tests/kvraft/common.rs

@@ -52,7 +52,7 @@ impl UniqueIdSequence {
 pub(crate) const GET: &str = "KVServer.Get";
 pub(crate) const PUT_APPEND: &str = "KVServer.PutAppend";
 
-#[derive(Clone, Debug, Serialize, Deserialize)]
+#[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize)]
 pub enum PutAppendEnum {
     Put,
     Append,

+ 46 - 1
tests/kvraft/server.rs

@@ -1,5 +1,7 @@
 use super::common::{ClerkId, UniqueId};
-use crate::kvraft::common::{GetArgs, GetReply, KVError};
+use crate::kvraft::common::{
+    GetArgs, GetReply, KVError, PutAppendArgs, PutAppendEnum, PutAppendReply,
+};
 use parking_lot::{Condvar, Mutex};
 use ruaft::{Persister, Raft, RpcClient};
 use std::collections::HashMap;
@@ -237,6 +239,49 @@ impl KVServer {
         GetReply { result, is_retry }
     }
 
+    pub fn put_append(&self, args: PutAppendArgs) -> PutAppendReply {
+        let op = PutAppendOp {
+            key: args.key,
+            value: args.value,
+        };
+        let op = match args.op {
+            PutAppendEnum::Put => KVOp::Put(op),
+            PutAppendEnum::Append => KVOp::Append(op),
+        };
+        let result = match self.block_for_commit(
+            args.unique_id,
+            op,
+            Self::DEFAULT_TIMEOUT,
+        ) {
+            Ok(result) => result,
+            Err(CommitError::Duplicate(result)) => result,
+            Err(e) => {
+                return PutAppendReply {
+                    result: Err(e.into()),
+                }
+            }
+        };
+        let result = match result {
+            CommitResult::Put => {
+                if args.op == PutAppendEnum::Put {
+                    Ok(())
+                } else {
+                    Err(KVError::Conflict)
+                }
+            }
+            CommitResult::Append => {
+                if args.op == PutAppendEnum::Append {
+                    Ok(())
+                } else {
+                    Err(KVError::Conflict)
+                }
+            }
+            CommitResult::Get(_) => Err(KVError::Conflict),
+        };
+
+        PutAppendReply { result }
+    }
+
     pub fn kill(self) {
         self.shutdown.store(true, Ordering::Relaxed);
         self.rf.kill()