|
@@ -1,15 +1,18 @@
|
|
|
use std::sync::Arc;
|
|
use std::sync::Arc;
|
|
|
|
|
|
|
|
|
|
+use async_trait::async_trait;
|
|
|
use tarpc::context::Context;
|
|
use tarpc::context::Context;
|
|
|
|
|
|
|
|
use kvraft::UniqueKVOp;
|
|
use kvraft::UniqueKVOp;
|
|
|
use ruaft::{
|
|
use ruaft::{
|
|
|
AppendEntriesArgs, AppendEntriesReply, InstallSnapshotArgs,
|
|
AppendEntriesArgs, AppendEntriesReply, InstallSnapshotArgs,
|
|
|
- InstallSnapshotReply, Raft, RequestVoteArgs, RequestVoteReply,
|
|
|
|
|
|
|
+ InstallSnapshotReply, Raft, RemoteRaft, RequestVoteArgs, RequestVoteReply,
|
|
|
};
|
|
};
|
|
|
|
|
+use std::io::ErrorKind;
|
|
|
|
|
+use tarpc::client::RpcError;
|
|
|
|
|
|
|
|
#[tarpc::service]
|
|
#[tarpc::service]
|
|
|
-trait RuaftSerivce {
|
|
|
|
|
|
|
+trait RuaftService {
|
|
|
async fn append_entries(
|
|
async fn append_entries(
|
|
|
args: AppendEntriesArgs<UniqueKVOp>,
|
|
args: AppendEntriesArgs<UniqueKVOp>,
|
|
|
) -> AppendEntriesReply;
|
|
) -> AppendEntriesReply;
|
|
@@ -22,7 +25,7 @@ trait RuaftSerivce {
|
|
|
struct RuaftRpcServer(Arc<Raft<UniqueKVOp>>);
|
|
struct RuaftRpcServer(Arc<Raft<UniqueKVOp>>);
|
|
|
|
|
|
|
|
#[tarpc::server]
|
|
#[tarpc::server]
|
|
|
-impl RuaftSerivce for RuaftRpcServer {
|
|
|
|
|
|
|
+impl RuaftService for RuaftRpcServer {
|
|
|
async fn append_entries(
|
|
async fn append_entries(
|
|
|
self,
|
|
self,
|
|
|
_context: Context,
|
|
_context: Context,
|
|
@@ -47,3 +50,45 @@ impl RuaftSerivce for RuaftRpcServer {
|
|
|
self.0.process_request_vote(args)
|
|
self.0.process_request_vote(args)
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
|
|
+#[async_trait]
|
|
|
|
|
+impl RemoteRaft<UniqueKVOp> for RuaftServiceClient {
|
|
|
|
|
+ async fn request_vote(
|
|
|
|
|
+ &self,
|
|
|
|
|
+ args: RequestVoteArgs,
|
|
|
|
|
+ ) -> std::io::Result<RequestVoteReply> {
|
|
|
|
|
+ self.request_vote(Context::current(), args)
|
|
|
|
|
+ .await
|
|
|
|
|
+ .map_err(translate_rpc_error)
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ async fn append_entries(
|
|
|
|
|
+ &self,
|
|
|
|
|
+ args: AppendEntriesArgs<UniqueKVOp>,
|
|
|
|
|
+ ) -> std::io::Result<AppendEntriesReply> {
|
|
|
|
|
+ self.append_entries(Context::current(), args)
|
|
|
|
|
+ .await
|
|
|
|
|
+ .map_err(translate_rpc_error)
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ async fn install_snapshot(
|
|
|
|
|
+ &self,
|
|
|
|
|
+ args: InstallSnapshotArgs,
|
|
|
|
|
+ ) -> std::io::Result<InstallSnapshotReply> {
|
|
|
|
|
+ self.install_snapshot(Context::current(), args)
|
|
|
|
|
+ .await
|
|
|
|
|
+ .map_err(translate_rpc_error)
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+fn translate_rpc_error(e: RpcError) -> std::io::Error {
|
|
|
|
|
+ match e {
|
|
|
|
|
+ RpcError::Disconnected => std::io::Error::new(ErrorKind::BrokenPipe, e),
|
|
|
|
|
+ RpcError::DeadlineExceeded => {
|
|
|
|
|
+ std::io::Error::new(ErrorKind::TimedOut, e)
|
|
|
|
|
+ }
|
|
|
|
|
+ RpcError::Server(server_error) => {
|
|
|
|
|
+ std::io::Error::new(ErrorKind::Other, server_error)
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+}
|