89 lines
2.8 KiB
Rust
89 lines
2.8 KiB
Rust
use actix_web::web::Data;
|
|
use openraft::BasicNode;
|
|
use tokio_stream::StreamExt;
|
|
use tonic::{transport::Server, Request, Response, Status};
|
|
|
|
use dcache::dcache_service_server::DcacheService;
|
|
use dcache::{Learner, RaftReply, RaftRequest};
|
|
|
|
use crate::app::DcacheApp;
|
|
|
|
pub mod dcache {
|
|
tonic::include_proto!("dcache"); // The string specified here must match the proto package name
|
|
}
|
|
|
|
#[derive(Clone)]
|
|
pub struct MyDcacheImpl {
|
|
app: Data<DcacheApp>,
|
|
}
|
|
|
|
impl MyDcacheImpl {
|
|
pub fn new(app: Data<DcacheApp>) -> Self {
|
|
Self { app }
|
|
}
|
|
}
|
|
|
|
#[tonic::async_trait]
|
|
impl DcacheService for MyDcacheImpl {
|
|
async fn add_learner(
|
|
&self,
|
|
request: tonic::Request<Learner>,
|
|
) -> std::result::Result<tonic::Response<RaftReply>, tonic::Status> {
|
|
//let req = request.into_inner();
|
|
//let req = serde_json::from_str(&req.data).unwrap();
|
|
//let res = self.app.raft.client_write(req).await;
|
|
//Ok(Response::new(res.into()))
|
|
let req = request.into_inner();
|
|
let node_id = req.id;
|
|
let node = BasicNode {
|
|
addr: req.addr.clone(),
|
|
};
|
|
let res = self.app.raft.add_learner(node_id, node, true).await;
|
|
Ok(Response::new(res.into()))
|
|
}
|
|
|
|
async fn write(
|
|
&self,
|
|
request: tonic::Request<RaftRequest>,
|
|
) -> std::result::Result<tonic::Response<RaftReply>, tonic::Status> {
|
|
let req = request.into_inner();
|
|
let req = serde_json::from_str(&req.data).unwrap();
|
|
let res = self.app.raft.client_write(req).await;
|
|
Ok(Response::new(res.into()))
|
|
}
|
|
/// / Forward a request to other
|
|
async fn forward(
|
|
&self,
|
|
request: tonic::Request<RaftRequest>,
|
|
) -> std::result::Result<tonic::Response<RaftReply>, tonic::Status> {
|
|
unimplemented!();
|
|
}
|
|
async fn append_entries(
|
|
&self,
|
|
request: tonic::Request<RaftRequest>,
|
|
) -> std::result::Result<tonic::Response<RaftReply>, tonic::Status> {
|
|
let req = request.into_inner();
|
|
let req = serde_json::from_str(&req.data).unwrap();
|
|
let res = self.app.raft.append_entries(req).await;
|
|
Ok(Response::new(res.into()))
|
|
}
|
|
async fn install_snapshot(
|
|
&self,
|
|
request: tonic::Request<RaftRequest>,
|
|
) -> std::result::Result<tonic::Response<RaftReply>, tonic::Status> {
|
|
let req = request.into_inner();
|
|
let req = serde_json::from_str(&req.data).unwrap();
|
|
let res = self.app.raft.install_snapshot(req).await;
|
|
Ok(Response::new(res.into()))
|
|
}
|
|
async fn vote(
|
|
&self,
|
|
request: tonic::Request<RaftRequest>,
|
|
) -> std::result::Result<tonic::Response<RaftReply>, tonic::Status> {
|
|
let req = request.into_inner();
|
|
let req = serde_json::from_str(&req.data).unwrap();
|
|
let res = self.app.raft.vote(req).await;
|
|
Ok(Response::new(res.into()))
|
|
}
|
|
}
|