feat: pipelined read and write endpoints
This commit is contained in:
parent
285469ffed
commit
095b73a1b1
1 changed files with 108 additions and 2 deletions
|
@ -20,7 +20,10 @@ use actix_web::post;
|
||||||
use actix_web::web;
|
use actix_web::web;
|
||||||
use actix_web::web::Data;
|
use actix_web::web::Data;
|
||||||
use actix_web::Responder;
|
use actix_web::Responder;
|
||||||
|
use libmcaptcha::cache::messages::{CachedPoWConfig, RetrivePoW, VerifyCaptchaResult};
|
||||||
use libmcaptcha::master::messages::GetInternalData;
|
use libmcaptcha::master::messages::GetInternalData;
|
||||||
|
use serde::Deserialize;
|
||||||
|
use serde::Serialize;
|
||||||
use web::Json;
|
use web::Json;
|
||||||
|
|
||||||
use crate::app::DcacheApp;
|
use crate::app::DcacheApp;
|
||||||
|
@ -38,7 +41,7 @@ pub async fn write(
|
||||||
#[get("/state")]
|
#[get("/state")]
|
||||||
pub async fn state(app: Data<DcacheApp>) -> actix_web::Result<impl Responder> {
|
pub async fn state(app: Data<DcacheApp>) -> actix_web::Result<impl Responder> {
|
||||||
let sm = app.store.state_machine.read().await;
|
let sm = app.store.state_machine.read().await;
|
||||||
let data = sm
|
let resp = sm
|
||||||
.data
|
.data
|
||||||
.master
|
.master
|
||||||
.send(GetInternalData)
|
.send(GetInternalData)
|
||||||
|
@ -47,5 +50,108 @@ pub async fn state(app: Data<DcacheApp>) -> actix_web::Result<impl Responder> {
|
||||||
.await
|
.await
|
||||||
.unwrap()
|
.unwrap()
|
||||||
.unwrap();
|
.unwrap();
|
||||||
Ok(Json(data))
|
Ok(Json(resp))
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Serialize, Deserialize, Clone, Debug)]
|
||||||
|
pub enum ReadRequest {
|
||||||
|
RetrivePoW(RetrivePoW), //Reader
|
||||||
|
VerifyCaptchaResult(VerifyCaptchaResult), //Reader
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Serialize, Deserialize, Debug, Clone)]
|
||||||
|
pub enum ReadResponse {
|
||||||
|
VerifyCaptchaResult(bool),
|
||||||
|
RetrivePoW(Option<CachedPoWConfig>),
|
||||||
|
}
|
||||||
|
|
||||||
|
#[post("/read")]
|
||||||
|
pub async fn read(
|
||||||
|
app: Data<DcacheApp>,
|
||||||
|
req: Json<ReadRequest>,
|
||||||
|
) -> actix_web::Result<impl Responder> {
|
||||||
|
let sm = app.store.state_machine.read().await;
|
||||||
|
|
||||||
|
let req = req.into_inner();
|
||||||
|
let res = match req {
|
||||||
|
ReadRequest::RetrivePoW(msg) => {
|
||||||
|
let cache_res = sm
|
||||||
|
.data
|
||||||
|
.cache
|
||||||
|
.send(msg.clone())
|
||||||
|
.await
|
||||||
|
.unwrap()
|
||||||
|
.await
|
||||||
|
.unwrap()
|
||||||
|
.unwrap();
|
||||||
|
ReadResponse::RetrivePoW(cache_res)
|
||||||
|
}
|
||||||
|
ReadRequest::VerifyCaptchaResult(msg) => {
|
||||||
|
let cache_res = sm
|
||||||
|
.data
|
||||||
|
.cache
|
||||||
|
.send(msg.clone())
|
||||||
|
.await
|
||||||
|
.unwrap()
|
||||||
|
.await
|
||||||
|
.unwrap()
|
||||||
|
.unwrap();
|
||||||
|
ReadResponse::VerifyCaptchaResult(cache_res)
|
||||||
|
}
|
||||||
|
};
|
||||||
|
Ok(Json(res))
|
||||||
|
}
|
||||||
|
|
||||||
|
#[post("/pipeline/read")]
|
||||||
|
pub async fn pipeline_read(
|
||||||
|
app: Data<DcacheApp>,
|
||||||
|
requests: Json<Vec<ReadRequest>>,
|
||||||
|
) -> actix_web::Result<impl Responder> {
|
||||||
|
let requests = requests.into_inner();
|
||||||
|
let mut responses = Vec::with_capacity(requests.len());
|
||||||
|
let sm = app.store.state_machine.read().await;
|
||||||
|
for request in requests {
|
||||||
|
let res = match request {
|
||||||
|
ReadRequest::RetrivePoW(msg) => {
|
||||||
|
let cache_res = sm
|
||||||
|
.data
|
||||||
|
.cache
|
||||||
|
.send(msg.clone())
|
||||||
|
.await
|
||||||
|
.unwrap()
|
||||||
|
.await
|
||||||
|
.unwrap()
|
||||||
|
.unwrap();
|
||||||
|
ReadResponse::RetrivePoW(cache_res)
|
||||||
|
}
|
||||||
|
ReadRequest::VerifyCaptchaResult(msg) => {
|
||||||
|
let cache_res = sm
|
||||||
|
.data
|
||||||
|
.cache
|
||||||
|
.send(msg.clone())
|
||||||
|
.await
|
||||||
|
.unwrap()
|
||||||
|
.await
|
||||||
|
.unwrap()
|
||||||
|
.unwrap();
|
||||||
|
ReadResponse::VerifyCaptchaResult(cache_res)
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
responses.push(res);
|
||||||
|
}
|
||||||
|
Ok(Json(responses))
|
||||||
|
}
|
||||||
|
|
||||||
|
#[post("/pipeline/write")]
|
||||||
|
pub async fn pipeline_write(
|
||||||
|
app: Data<DcacheApp>,
|
||||||
|
requests: Json<Vec<DcacheRequest>>,
|
||||||
|
) -> actix_web::Result<impl Responder> {
|
||||||
|
let mut responses = Vec::with_capacity(requests.len());
|
||||||
|
let mut requests = requests.into_inner();
|
||||||
|
for req in requests.drain(0..) {
|
||||||
|
responses.push(app.raft.client_write(req).await);
|
||||||
|
}
|
||||||
|
Ok(Json(responses))
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue