From 32f2ea49534f55f654f5b8f3a2d90b27bc11a118 Mon Sep 17 00:00:00 2001 From: Igor Katson Date: Wed, 30 Jun 2021 10:31:30 +0100 Subject: [PATCH] Poor mans speed computation --- crates/librqbit/src/http_api.rs | 46 ++++++++++++++++++++++++++-- crates/librqbit/src/torrent_state.rs | 2 +- 2 files changed, 44 insertions(+), 4 deletions(-) diff --git a/crates/librqbit/src/http_api.rs b/crates/librqbit/src/http_api.rs index 59f9cb7..65a08be 100644 --- a/crates/librqbit/src/http_api.rs +++ b/crates/librqbit/src/http_api.rs @@ -1,13 +1,53 @@ use std::sync::Arc; +use std::io::Write; +use std::sync::atomic::Ordering; +use std::time::{Duration, Instant}; use warp::Filter; use crate::torrent_state::TorrentState; // This is just a stub for debugging, nothing useful here. pub async fn make_and_run_http_api(state: Arc) -> anyhow::Result<()> { - let dump_haves = warp::path("haves") - .map(move || format!("{:?}", state.locked.read().chunks.get_have_pieces())); - warp::serve(dump_haves).run(([127, 0, 0, 1], 3030)).await; + let dump_haves = warp::path("haves").map({ + let state = state.clone(); + move || format!("{:?}", state.locked.read().chunks.get_have_pieces()) + }); + + let dump_stats = warp::path("stats").map({ + let state = state.clone(); + let start_time = Instant::now(); + let initial_downloaded_and_checked = + state.stats.downloaded_and_checked.load(Ordering::Relaxed); + move || { + let stats = &state.stats; + let mut buf = Vec::new(); + writeln!(buf, "{:#?}", &stats).unwrap(); + writeln!( + buf, + "Average download time: {:?}", + stats.average_piece_download_time() + ) + .unwrap(); + + // Poor mans download speed computation + let elapsed = start_time.elapsed(); + let downloaded_bytes = state.stats.downloaded_and_checked.load(Ordering::Relaxed) + - initial_downloaded_and_checked; + let downloaded_mb = downloaded_bytes as f64 / 1024f64 / 1024f64; + writeln!( + buf, + "Speed: {:.2}Mbps", + downloaded_mb / elapsed.as_secs_f64() + ) + .unwrap(); + + buf + } + }); + + let router = dump_haves.or(dump_stats); + + warp::serve(router).run(([127, 0, 0, 1], 3030)).await; Ok(()) } diff --git a/crates/librqbit/src/torrent_state.rs b/crates/librqbit/src/torrent_state.rs index d37a61a..0e8f544 100644 --- a/crates/librqbit/src/torrent_state.rs +++ b/crates/librqbit/src/torrent_state.rs @@ -146,7 +146,7 @@ pub struct TorrentStateLocked { pub chunks: ChunkTracker, } -#[derive(Default)] +#[derive(Default, Debug)] pub struct AtomicStats { pub have: AtomicU64, pub downloaded_and_checked: AtomicU64,