1use 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}