groupcache/
http.rs

1//! gRPC [groupcache_pb::GroupcacheServer] implementation
2
3use crate::groupcache::ValueBounds;
4use crate::metrics::METRIC_GET_SERVER_REQUESTS_TOTAL;
5use crate::GroupcacheInner;
6use async_trait::async_trait;
7use groupcache_pb::{GetRequest, GetResponse, Groupcache, RemoveRequest, RemoveResponse};
8use metrics::counter;
9use tonic::{Request, Response, Status};
10
11#[async_trait]
12impl<Value: ValueBounds> Groupcache for GroupcacheInner<Value> {
13    async fn get(&self, request: Request<GetRequest>) -> Result<Response<GetResponse>, Status> {
14        counter!(METRIC_GET_SERVER_REQUESTS_TOTAL).increment(1);
15
16        let payload = request.into_inner();
17        match self.get(&payload.key).await {
18            Ok(value) => {
19                let result = rmp_serde::to_vec(&value);
20                match result {
21                    Ok(bytes) => Ok(Response::new(GetResponse { value: Some(bytes) })),
22                    Err(err) => Err(Status::internal(err.to_string())),
23                }
24            }
25            Err(err) => Err(Status::internal(err.to_string())),
26        }
27    }
28
29    async fn remove(
30        &self,
31        request: Request<RemoveRequest>,
32    ) -> Result<Response<RemoveResponse>, Status> {
33        let payload = request.into_inner();
34
35        match self.remove(&payload.key).await {
36            Ok(_) => Ok(Response::new(RemoveResponse {})),
37            Err(err) => Err(Status::internal(err.to_string())),
38        }
39    }
40}