Cancellation... It compiles now at least with latest changes, but not sure if they work or are correct

This commit is contained in:
Igor Katson 2024-02-18 20:11:12 +00:00
parent 1582d16cc5
commit f5ccb8632b
No known key found for this signature in database
GPG key ID: B4EC22B66D61A3F5
2 changed files with 71 additions and 57 deletions

View file

@ -15,7 +15,6 @@ use std::time::Duration;
use anyhow::bail;
use anyhow::Context;
use buffers::ByteString;
use dht::RequestPeersStream;
use librqbit_core::hash_id::Id20;
use librqbit_core::lengths::Lengths;
use librqbit_core::peer_id::generate_peer_id;
@ -32,7 +31,6 @@ use tracing::debug;
use tracing::error_span;
use tracing::trace;
use tracing::warn;
use url::Url;
use crate::chunk_tracker::ChunkTracker;
use crate::spawn_utils::BlockingSpawner;
@ -176,13 +174,15 @@ impl ManagedTorrent {
initial_peers: Vec<SocketAddr>,
peer_rx: Option<PeerStream>,
start_paused: bool,
live_cancellation_token: CancellationToken,
) -> anyhow::Result<()> {
let mut g = self.locked.write();
let spawn_fatal_errors_receiver =
|state: &Arc<Self>, rx: tokio::sync::oneshot::Receiver<anyhow::Error>| {
|state: &Arc<Self>,
rx: tokio::sync::oneshot::Receiver<anyhow::Error>,
token: CancellationToken| {
let span = state.info.span.clone();
let token = state.cancellation_token.clone();
let state = Arc::downgrade(state);
spawn_with_cancel(
error_span!(parent: span, "fatal_errors_receiver"),
@ -258,7 +258,7 @@ impl ManagedTorrent {
drop(g);
let t = self.clone();
let span = self.info().span.clone();
let token = self.cancellation_token.clone();
let token = live_cancellation_token.clone();
spawn_with_cancel(
error_span!(parent: span.clone(), "initialize_and_start"),
token.clone(),
@ -278,10 +278,11 @@ impl ManagedTorrent {
}
let (tx, rx) = tokio::sync::oneshot::channel();
let live = TorrentStateLive::new(paused, tx, token.child_token());
let live =
TorrentStateLive::new(paused, tx, live_cancellation_token);
g.state = ManagedTorrentState::Live(live.clone());
spawn_fatal_errors_receiver(&t, rx);
spawn_fatal_errors_receiver(&t, rx, token);
spawn_peer_adder(&live, initial_peers, peer_rx);
Ok(())
@ -299,13 +300,9 @@ impl ManagedTorrent {
ManagedTorrentState::Paused(_) => {
let paused = g.state.take().assert_paused();
let (tx, rx) = tokio::sync::oneshot::channel();
let live = TorrentStateLive::new(
paused,
tx,
self.cancellation_token.child_token().clone(),
);
let live = TorrentStateLive::new(paused, tx, live_cancellation_token.clone());
g.state = ManagedTorrentState::Live(live.clone());
spawn_fatal_errors_receiver(self, rx);
spawn_fatal_errors_receiver(self, rx, live_cancellation_token);
spawn_peer_adder(&live, initial_peers, peer_rx);
Ok(())
}
@ -318,7 +315,12 @@ impl ManagedTorrent {
drop(g);
// Recurse.
self.start(initial_peers, peer_rx, start_paused)
self.start(
initial_peers,
peer_rx,
start_paused,
live_cancellation_token,
)
}
ManagedTorrentState::None => bail!("bug: torrent is in empty state"),
}