diff --git a/Cargo.lock b/Cargo.lock index e83606a..af966d6 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -241,6 +241,7 @@ dependencies = [ "pretty_env_logger", "rand 0.8.4", "serde", + "serde_json", "tokio", "tokio-stream", ] diff --git a/crates/dht/Cargo.toml b/crates/dht/Cargo.toml index 7dbdaac..2894ca2 100644 --- a/crates/dht/Cargo.toml +++ b/crates/dht/Cargo.toml @@ -9,6 +9,7 @@ edition = "2018" tokio = {version = "1", features = ["macros", "rt-multi-thread", "net", "sync"]} tokio-stream = {version = "0.1", features = ["sync"]} serde = {version = "1", features = ["derive"]} +serde_json = "1" hex = "0.4" bencode = {path = "../bencode"} anyhow = "1" diff --git a/crates/dht/src/main.rs b/crates/dht/src/main.rs index 36dbaa4..bc69280 100644 --- a/crates/dht/src/main.rs +++ b/crates/dht/src/main.rs @@ -14,7 +14,7 @@ async fn main() -> anyhow::Result<()> { let mut stream = dht.get_peers(info_hash).await?; let mut seen = HashSet::new(); - let stats_printer = async move { + let stats_printer = async { loop { tokio::time::sleep(Duration::from_secs(5)).await; info!("DHT stats: {:?}", dht.stats()); @@ -22,7 +22,24 @@ async fn main() -> anyhow::Result<()> { Ok::<_, anyhow::Error>(()) }; - let peer_printer = async move { + let routing_table_dumper = async { + loop { + tokio::time::sleep(Duration::from_secs(15)).await; + dht.with_routing_table(|r| { + let filename = "/tmp/routing-table.json"; + let mut f = std::fs::OpenOptions::new() + .create(true) + .write(true) + .open(filename) + .unwrap(); + serde_json::to_writer_pretty(&mut f, r).unwrap(); + info!("Dumped DHT routing table to {}", filename); + }); + } + Ok::<_, anyhow::Error>(()) + }; + + let peer_printer = async { while let Some(peer) = stream.next().await { let peer = peer.context("error reading peer stream")?; if seen.insert(peer) { @@ -35,6 +52,7 @@ async fn main() -> anyhow::Result<()> { let res = tokio::select! { res = stats_printer => res, res = peer_printer => res, + res = routing_table_dumper => res, }; res } diff --git a/crates/dht/src/routing_table.rs b/crates/dht/src/routing_table.rs index 863be2a..12d871d 100644 --- a/crates/dht/src/routing_table.rs +++ b/crates/dht/src/routing_table.rs @@ -5,14 +5,15 @@ use std::{ use librqbit_core::id20::Id20; use log::debug; +use serde::Serialize; -#[derive(Debug, Clone)] +#[derive(Debug, Clone, Serialize)] enum BucketTreeNode { Leaf(Vec), LeftRight(Box, Box), } -#[derive(Debug, Clone)] +#[derive(Debug, Clone, Serialize)] pub struct BucketTree { bits: u8, start: Id20, @@ -302,12 +303,15 @@ impl Default for BucketTree { } } -#[derive(Debug, Clone)] +#[derive(Debug, Clone, Serialize)] pub struct RoutingTableNode { id: Id20, addr: SocketAddr, + #[serde(skip)] last_request: Option, + #[serde(skip)] last_response: Option, + #[serde(skip)] outstanding_queries_in_a_row: usize, } @@ -356,7 +360,7 @@ impl RoutingTableNode { } } -#[derive(Debug, Clone)] +#[derive(Debug, Clone, Serialize)] pub struct RoutingTable { id: Id20, size: usize,