浏览代码

Create RPC servers for KVServer and Raft.

Jing Yang 4 年之前
父节点
当前提交
c1bfaba97d
共有 5 个文件被更改,包括 84 次插入2 次删除
  1. 29 0
      durio/src/kv_service.rs
  2. 3 0
      durio/src/main.rs
  3. 49 0
      durio/src/ruaft_service.rs
  4. 1 0
      kvraft/src/lib.rs
  5. 2 2
      kvraft/src/server.rs

+ 29 - 0
durio/src/kv_service.rs

@@ -0,0 +1,29 @@
+use std::sync::Arc;
+
+use tarpc::context::Context;
+
+use kvraft::{GetArgs, GetReply, KVServer, PutAppendArgs, PutAppendReply};
+
+#[tarpc::service]
+trait KVService {
+    async fn get(args: GetArgs) -> GetReply;
+    async fn put_append(args: PutAppendArgs) -> PutAppendReply;
+}
+
+#[derive(Clone)]
+struct KVRpcServer(Arc<KVServer>);
+
+#[tarpc::server]
+impl KVService for KVRpcServer {
+    async fn get(self, _context: Context, args: GetArgs) -> GetReply {
+        self.0.get(args).await
+    }
+
+    async fn put_append(
+        self,
+        _context: Context,
+        args: PutAppendArgs,
+    ) -> PutAppendReply {
+        self.0.put_append(args).await
+    }
+}

+ 3 - 0
durio/src/main.rs

@@ -1,3 +1,6 @@
+mod kv_service;
+mod ruaft_service;
+
 use std::sync::atomic::{AtomicUsize, Ordering};
 use std::sync::Arc;
 

+ 49 - 0
durio/src/ruaft_service.rs

@@ -0,0 +1,49 @@
+use std::sync::Arc;
+
+use tarpc::context::Context;
+
+use kvraft::UniqueKVOp;
+use ruaft::{
+    AppendEntriesArgs, AppendEntriesReply, InstallSnapshotArgs,
+    InstallSnapshotReply, Raft, RequestVoteArgs, RequestVoteReply,
+};
+
+#[tarpc::service]
+trait RuaftSerivce {
+    async fn append_entries(
+        args: AppendEntriesArgs<UniqueKVOp>,
+    ) -> AppendEntriesReply;
+    async fn install_snapshot(
+        args: InstallSnapshotArgs,
+    ) -> InstallSnapshotReply;
+    async fn request_vote(args: RequestVoteArgs) -> RequestVoteReply;
+}
+
+struct RuaftRpcServer(Arc<Raft<UniqueKVOp>>);
+
+#[tarpc::server]
+impl RuaftSerivce for RuaftRpcServer {
+    async fn append_entries(
+        self,
+        _context: Context,
+        args: AppendEntriesArgs<UniqueKVOp>,
+    ) -> AppendEntriesReply {
+        self.0.process_append_entries(args)
+    }
+
+    async fn install_snapshot(
+        self,
+        _context: Context,
+        args: InstallSnapshotArgs,
+    ) -> InstallSnapshotReply {
+        self.0.process_install_snapshot(args)
+    }
+
+    async fn request_vote(
+        self,
+        _context: Context,
+        args: RequestVoteArgs,
+    ) -> RequestVoteReply {
+        self.0.process_request_vote(args)
+    }
+}

+ 1 - 0
kvraft/src/lib.rs

@@ -2,6 +2,7 @@ pub use client::Clerk;
 pub use common::{GetArgs, GetReply, PutAppendArgs, PutAppendReply};
 pub use remote_kvraft::RemoteKvraft;
 pub use server::KVServer;
+pub use server::UniqueKVOp;
 
 mod client;
 mod common;

+ 2 - 2
kvraft/src/server.rs

@@ -27,7 +27,7 @@ pub struct KVServer {
     logger: LocalLogger,
 }
 
-#[derive(Clone, Default, Serialize, Deserialize)]
+#[derive(Clone, Debug, Default, Serialize, Deserialize)]
 pub struct UniqueKVOp {
     op: KVOp,
     me: usize,
@@ -51,7 +51,7 @@ struct KVServerState {
     >,
 }
 
-#[derive(Clone, Serialize, Deserialize)]
+#[derive(Clone, Debug, Serialize, Deserialize)]
 enum KVOp {
     NoOp,
     Get(String),