We don't want the debugging to fail, actually.

This commit is contained in:
Alex Auvolat 2020-04-10 23:43:35 +02:00
parent cf8fd948fc
commit 4a2624b76a

View File

@ -3,6 +3,7 @@ use std::sync::Arc;
use bytes::IntoBuf; use bytes::IntoBuf;
use futures::future::Future; use futures::future::Future;
use futures_util::future::*;
use hyper::server::conn::AddrStream; use hyper::server::conn::AddrStream;
use hyper::service::{make_service_fn, service_fn}; use hyper::service::{make_service_fn, service_fn};
use hyper::{Body, Method, Request, Response, Server, StatusCode}; use hyper::{Body, Method, Request, Response, Server, StatusCode};
@ -14,12 +15,16 @@ use crate::error::Error;
use crate::proto::Message; use crate::proto::Message;
use crate::server::Garage; use crate::server::Garage;
fn debug_serialize<T: Serialize>(x: T) -> Result<String, Error> { fn debug_serialize<T: Serialize>(x: T) -> String {
let ss = serde_json::to_string(&x)?; match serde_json::to_string(&x) {
if ss.len() > 100 { Ok(ss) => {
Ok(ss[..100].to_string()) if ss.len() > 100 {
} else { ss[..100].to_string()
Ok(ss) } else {
ss
}
}
Err(e) => format!("<JSON serialization error: {}>", e),
} }
} }
@ -47,19 +52,22 @@ async fn handler(
eprintln!( eprintln!(
"RPC from {}: {} ({} bytes)", "RPC from {}: {} ({} bytes)",
addr, addr,
debug_serialize(&msg)?, debug_serialize(&msg),
whole_body.len() whole_body.len()
); );
let sys = garage.system.clone(); let sys = garage.system.clone();
let resp = err_to_msg(match &msg { let resp = err_to_msg(match &msg {
Message::Ping(ping) => sys.handle_ping(&addr, ping).await, Message::Ping(ping) => sys.handle_ping(&addr, ping).await,
Message::PullStatus => sys.handle_pull_status().await, Message::PullStatus => sys.handle_pull_status().await,
Message::PullConfig => sys.handle_pull_config().await, Message::PullConfig => sys.handle_pull_config().await,
Message::AdvertiseNodesUp(adv) => sys.handle_advertise_nodes_up(adv).await, Message::AdvertiseNodesUp(adv) => sys.handle_advertise_nodes_up(adv).await,
Message::AdvertiseConfig(adv) => sys.handle_advertise_config(adv).await, Message::AdvertiseConfig(adv) => sys.handle_advertise_config(adv).await,
Message::PutBlock(m) => write_block(garage, &m.hash, &m.data).await, Message::PutBlock(m) => write_block(garage, &m.hash, &m.data).await,
Message::GetBlock(h) => read_block(garage, &h).await, Message::GetBlock(h) => read_block(garage, &h).await,
Message::TableRPC(table, msg) => { Message::TableRPC(table, msg) => {
if let Some(rpc_handler) = garage.table_rpc_handlers.get(table) { if let Some(rpc_handler) = garage.table_rpc_handlers.get(table) {
rpc_handler rpc_handler
@ -74,7 +82,7 @@ async fn handler(
_ => Ok(Message::Error(format!("Unexpected message: {:?}", msg))), _ => Ok(Message::Error(format!("Unexpected message: {:?}", msg))),
}); });
eprintln!("reply to {}: {}", addr, debug_serialize(&resp)?); eprintln!("reply to {}: {}", addr, debug_serialize(&resp));
Ok(Response::new(Body::from(rmp_to_vec_all_named(&resp)?))) Ok(Response::new(Body::from(rmp_to_vec_all_named(&resp)?)))
} }
@ -91,7 +99,10 @@ pub async fn run_rpc_server(
async move { async move {
Ok::<_, Error>(service_fn(move |req: Request<Body>| { Ok::<_, Error>(service_fn(move |req: Request<Body>| {
let garage = garage.clone(); let garage = garage.clone();
handler(garage, req, client_addr) handler(garage, req, client_addr).map_err(|e| {
eprintln!("RPC handler error: {}", e);
e
})
})) }))
} }
}); });