Implement /rpc_server_snapshot endpoint

This returns a JSON snapshot of the state of the server
This commit is contained in:
Nathan Sobo 2022-05-25 17:42:25 -06:00
parent 6a32d55d85
commit 742dd75041
6 changed files with 68 additions and 8 deletions

View file

@ -10,6 +10,7 @@ use futures::{
FutureExt, SinkExt, StreamExt,
};
use parking_lot::{Mutex, RwLock};
use serde::{ser::SerializeStruct, Serialize};
use smol_timeout::TimeoutExt;
use std::sync::atomic::Ordering::SeqCst;
use std::{
@ -24,7 +25,7 @@ use std::{
};
use tracing::instrument;
#[derive(Clone, Copy, PartialEq, Eq, Hash, Debug)]
#[derive(Clone, Copy, PartialEq, Eq, Hash, Debug, Serialize)]
pub struct ConnectionId(pub u32);
impl fmt::Display for ConnectionId {
@ -89,10 +90,12 @@ pub struct Peer {
next_connection_id: AtomicU32,
}
#[derive(Clone)]
#[derive(Clone, Serialize)]
pub struct ConnectionState {
#[serde(skip)]
outgoing_tx: mpsc::UnboundedSender<proto::Message>,
next_message_id: Arc<AtomicU32>,
#[serde(skip)]
response_channels:
Arc<Mutex<Option<HashMap<u32, oneshot::Sender<(proto::Envelope, oneshot::Sender<()>)>>>>>,
}
@ -471,6 +474,17 @@ impl Peer {
}
}
impl Serialize for Peer {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: serde::Serializer,
{
let mut state = serializer.serialize_struct("Peer", 2)?;
state.serialize_field("connections", &*self.connections.read())?;
state.end()
}
}
#[cfg(test)]
mod tests {
use super::*;