make async-backtrace optional

This commit is contained in:
Igor Katson 2024-08-19 13:40:01 +01:00
parent 17353cf8e1
commit e4aac7930f
No known key found for this signature in database
GPG key ID: B4EC22B66D61A3F5
4 changed files with 44 additions and 21 deletions

View file

@ -22,6 +22,7 @@ storage_middleware = ["lru"]
storage_examples = [] storage_examples = []
tracing-subscriber-utils = ["tracing-subscriber"] tracing-subscriber-utils = ["tracing-subscriber"]
postgres = ["sqlx"] postgres = ["sqlx"]
async-bt = ["async-backtrace"]
[dependencies] [dependencies]
sqlx = { version = "0.7", features = [ sqlx = { version = "0.7", features = [
@ -88,7 +89,7 @@ lru = { version = "0.12.3", optional = true }
mime_guess = { version = "2.0.5", default-features = false } mime_guess = { version = "2.0.5", default-features = false }
tokio-socks = "0.5.2" tokio-socks = "0.5.2"
async-trait = "0.1.81" async-trait = "0.1.81"
async-backtrace = "0.2" async-backtrace = { version = "0.2", optional = true }
[build-dependencies] [build-dependencies]
anyhow = "1" anyhow = "1"

View file

@ -25,6 +25,19 @@
#![warn(clippy::cast_possible_truncation)] #![warn(clippy::cast_possible_truncation)]
macro_rules! aframe {
($e:expr) => {{
#[cfg(feature = "async-bt")]
{
async_backtrace::frame!($e)
}
#[cfg(not(feature = "async-bt"))]
{
$e
}
}};
}
pub mod api; pub mod api;
mod api_error; mod api_error;
mod chunk_tracker; mod chunk_tracker;

View file

@ -85,7 +85,17 @@ impl TestPeerMetadata {
async fn debug_server() -> anyhow::Result<()> { async fn debug_server() -> anyhow::Result<()> {
async fn backtraces() -> impl IntoResponse { async fn backtraces() -> impl IntoResponse {
async_backtrace::taskdump_tree(true) #[cfg(feature = "async-bt")]
{
async_backtrace::taskdump_tree(true)
}
#[cfg(not(feature = "async-bt"))]
{
use crate::ApiError;
ApiError::from(anyhow::anyhow!(
"backtraces not enabled, enable async-bt feature"
))
}
} }
let app = Router::new().route("/backtrace", get(backtraces)); let app = Router::new().route("/backtrace", get(backtraces));

View file

@ -70,12 +70,9 @@ use peer_binary_protocol::{
extended::{handshake::ExtendedHandshake, ut_metadata::UtMetadata, ExtendedMessage}, extended::{handshake::ExtendedHandshake, ut_metadata::UtMetadata, ExtendedMessage},
Handshake, Message, MessageOwned, Piece, Request, Handshake, Message, MessageOwned, Piece, Request,
}; };
use tokio::{ use tokio::sync::{
sync::{ mpsc::{unbounded_channel, UnboundedReceiver, UnboundedSender},
mpsc::{unbounded_channel, UnboundedReceiver, UnboundedSender}, Notify, OwnedSemaphorePermit, Semaphore,
Notify, OwnedSemaphorePermit, Semaphore,
},
time::timeout,
}; };
use tokio_util::sync::CancellationToken; use tokio_util::sync::CancellationToken;
use tracing::{debug, error, error_span, info, trace, warn, Instrument}; use tracing::{debug, error, error_span, info, trace, warn, Instrument};
@ -349,13 +346,13 @@ impl TorrentStateLive {
"manage_incoming_peer", "manage_incoming_peer",
addr = %checked_peer.addr addr = %checked_peer.addr
), ),
self.clone() aframe!(self
.task_manage_incoming_peer(checked_peer, counters, tx, rx, permit), .clone()
.task_manage_incoming_peer(checked_peer, counters, tx, rx, permit)),
); );
Ok(()) Ok(())
} }
#[async_backtrace::framed]
async fn task_manage_incoming_peer( async fn task_manage_incoming_peer(
self: Arc<Self>, self: Arc<Self>,
checked_peer: CheckedIncomingConnection, checked_peer: CheckedIncomingConnection,
@ -416,7 +413,6 @@ impl TorrentStateLive {
Ok(()) Ok(())
} }
#[async_backtrace::framed]
async fn task_manage_outgoing_peer( async fn task_manage_outgoing_peer(
self: Arc<Self>, self: Arc<Self>,
addr: SocketAddr, addr: SocketAddr,
@ -453,10 +449,10 @@ impl TorrentStateLive {
state.meta.spawner, state.meta.spawner,
state.meta.connector.clone(), state.meta.connector.clone(),
); );
let requester = async_backtrace::frame!(handler let requester = aframe!(handler
.task_peer_chunk_requester() .task_peer_chunk_requester()
.instrument(error_span!("chunk_requester"))); .instrument(error_span!("chunk_requester")));
let conn_manager = async_backtrace::frame!(peer_connection let conn_manager = aframe!(peer_connection
.manage_peer_outgoing(rx, state.have_broadcast_tx.subscribe()) .manage_peer_outgoing(rx, state.have_broadcast_tx.subscribe())
.instrument(error_span!("peer_connection"))); .instrument(error_span!("peer_connection")));
@ -499,7 +495,7 @@ impl TorrentStateLive {
let permit = state.peer_semaphore.clone().acquire_owned().await?; let permit = state.peer_semaphore.clone().acquire_owned().await?;
state.spawn( state.spawn(
error_span!(parent: state.meta.span.clone(), "manage_peer", peer = addr.to_string()), error_span!(parent: state.meta.span.clone(), "manage_peer", peer = addr.to_string()),
state.clone().task_manage_outgoing_peer(addr, permit), aframe!(state.clone().task_manage_outgoing_peer(addr, permit)),
); );
} }
} }
@ -1218,7 +1214,7 @@ impl PeerHandler {
} }
loop { loop {
async_backtrace::frame!(self.wait_for_unchoke()).await; aframe!(self.wait_for_unchoke()).await;
if self.state.is_finished_and_dont_need_peers() { if self.state.is_finished_and_dont_need_peers() {
debug!("nothing left to do, disconnecting peer"); debug!("nothing left to do, disconnecting peer");
@ -1238,12 +1234,15 @@ impl PeerHandler {
Some(next) => next, Some(next) => next,
None => { None => {
debug!("no pieces to request"); debug!("no pieces to request");
let _ = async_backtrace::frame!(tokio::time::timeout( match aframe!(tokio::time::timeout(
Duration::from_secs(10), Duration::from_secs(10),
new_piece_notify new_piece_notify
)) ))
.await; .await
debug!("woken up"); {
Ok(()) => debug!("woken up, new pieces might be available"),
Err(_) => debug!("woken up by sleep timer"),
}
continue; continue;
} }
}; };
@ -1277,9 +1276,9 @@ impl PeerHandler {
}; };
loop { loop {
match async_backtrace::frame!(timeout( match aframe!(tokio::time::timeout(
Duration::from_secs(10), Duration::from_secs(10),
async_backtrace::frame!(self.requests_sem.acquire()) aframe!(self.requests_sem.acquire())
)) ))
.await .await
{ {