Dumping routing table to JSON. Wow
This commit is contained in:
parent
fe4dcb226f
commit
ca25bac486
4 changed files with 30 additions and 6 deletions
1
Cargo.lock
generated
1
Cargo.lock
generated
|
|
@ -241,6 +241,7 @@ dependencies = [
|
|||
"pretty_env_logger",
|
||||
"rand 0.8.4",
|
||||
"serde",
|
||||
"serde_json",
|
||||
"tokio",
|
||||
"tokio-stream",
|
||||
]
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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<RoutingTableNode>),
|
||||
LeftRight(Box<BucketTree>, Box<BucketTree>),
|
||||
}
|
||||
|
||||
#[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<Instant>,
|
||||
#[serde(skip)]
|
||||
last_response: Option<Instant>,
|
||||
#[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,
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue