Ver Fonte

Use the new RpcHandler.

Jing Yang há 5 anos atrás
pai
commit
dbfda93592
1 ficheiros alterados com 27 adições e 34 exclusões
  1. 27 34
      src/rpcs.rs

+ 27 - 34
src/rpcs.rs

@@ -1,8 +1,6 @@
 use std::sync::Arc;
 
-use labrpc::{
-    Client, Network, ReplyMessage, RequestMessage, RpcHandler, Server,
-};
+use labrpc::{Client, Network, ReplyMessage, RequestMessage, Server};
 use parking_lot::Mutex;
 
 use crate::{
@@ -10,35 +8,26 @@ use crate::{
     RequestVoteReply,
 };
 
-struct RequestVoteRpcHandler(Arc<Raft>);
-
-impl RpcHandler for RequestVoteRpcHandler {
-    fn call(&self, data: RequestMessage) -> ReplyMessage {
-        let reply = self.0.process_request_vote(
-            bincode::deserialize(data.as_ref())
-                .expect("Deserialization of requests should not fail"),
-        );
+fn proxy_request_vote(raft: &Raft, data: RequestMessage) -> ReplyMessage {
+    let reply = raft.process_request_vote(
+        bincode::deserialize(data.as_ref())
+            .expect("Deserialization of requests should not fail"),
+    );
 
-        ReplyMessage::from(
-            bincode::serialize(&reply)
-                .expect("Serialization of reply should not fail"),
-        )
-    }
+    ReplyMessage::from(
+        bincode::serialize(&reply)
+            .expect("Serialization of reply should not fail"),
+    )
 }
-
-struct AppendEntriesRpcHandler(Arc<Raft>);
-
-impl RpcHandler for AppendEntriesRpcHandler {
-    fn call(&self, data: RequestMessage) -> ReplyMessage {
-        let reply = self.0.process_append_entries(
-            bincode::deserialize(data.as_ref())
-                .expect("Deserialization should not fail"),
-        );
-
-        ReplyMessage::from(
-            bincode::serialize(&reply).expect("Serialization should not fail"),
-        )
-    }
+fn proxy_append_entries(raft: &Raft, data: RequestMessage) -> ReplyMessage {
+    let reply = raft.process_append_entries(
+        bincode::deserialize(data.as_ref())
+            .expect("Deserialization should not fail"),
+    );
+
+    ReplyMessage::from(
+        bincode::serialize(&reply).expect("Serialization should not fail"),
+    )
 }
 
 pub(crate) const REQUEST_VOTE_RPC: &str = "Raft.RequestVote";
@@ -92,16 +81,20 @@ pub fn register_server<S: AsRef<str>>(
     let server_name = name.as_ref();
     let mut server = Server::make_server(server_name);
 
-    let request_vote_rpc_handler = RequestVoteRpcHandler(raft.clone());
+    let raft_clone = raft.clone();
     server.register_rpc_handler(
         REQUEST_VOTE_RPC.to_owned(),
-        Box::new(request_vote_rpc_handler),
+        Box::new(move |request| {
+            proxy_request_vote(raft_clone.as_ref(), request)
+        }),
     )?;
 
-    let append_entries_rpc_handler = AppendEntriesRpcHandler(raft);
+    let raft_clone = raft;
     server.register_rpc_handler(
         APPEND_ENTRIES_RPC.to_owned(),
-        Box::new(append_entries_rpc_handler),
+        Box::new(move |request| {
+            proxy_append_entries(raft_clone.as_ref(), request)
+        }),
     )?;
 
     network.add_server(server_name, server);