Split up a couple methods

This commit is contained in:
Igor Katson 2023-11-19 14:04:47 +00:00
parent d39479a251
commit a745257be2
No known key found for this signature in database
GPG key ID: B4EC22B66D61A3F5

View file

@ -31,7 +31,7 @@ use serde::Serialize;
use sha1w::Sha1; use sha1w::Sha1;
use tokio::{ use tokio::{
sync::{ sync::{
mpsc::{unbounded_channel, UnboundedSender}, mpsc::{unbounded_channel, UnboundedReceiver, UnboundedSender},
Notify, Semaphore, Notify, Semaphore,
}, },
time::timeout, time::timeout,
@ -291,7 +291,7 @@ impl TorrentState {
options: Option<TorrentStateOptions>, options: Option<TorrentStateOptions>,
) -> Arc<Self> { ) -> Arc<Self> {
let options = options.unwrap_or_default(); let options = options.unwrap_or_default();
let (peer_queue_tx, mut peer_queue_rx) = unbounded_channel(); let (peer_queue_tx, peer_queue_rx) = unbounded_channel();
let state = Arc::new(TorrentState { let state = Arc::new(TorrentState {
info_hash, info_hash,
info, info,
@ -315,24 +315,19 @@ impl TorrentState {
peer_queue_tx, peer_queue_tx,
finished_notify: Notify::new(), finished_notify: Notify::new(),
}); });
spawn(span!(Level::ERROR, "peer_adder"), { spawn(
let state = state.clone(); span!(Level::ERROR, "peer_adder"),
async move { state.clone().task_peer_adder(peer_queue_rx, spawner),
loop { );
let addr = peer_queue_rx.recv().await.unwrap(); state
if state.is_finished() {
debug!("ignoring peer {} as we are finished", addr);
state.locked.write().peers.mark_peer_not_needed(addr);
continue;
} }
let permit = state.peer_semaphore.acquire().await.unwrap(); pub async fn task_manage_peer(
permit.forget(); self: Arc<Self>,
spawn( addr: SocketAddr,
span!(parent: None, Level::ERROR, "manage_peer", peer = addr.to_string()), spawner: BlockingSpawner,
{ ) -> anyhow::Result<()> {
let state = state.clone(); let state = self;
async move {
let rx = state.locked.write().peers.mark_peer_connecting(addr)?; let rx = state.locked.write().peers.mark_peer_connecting(addr)?;
let handler = PeerHandler { let handler = PeerHandler {
@ -370,13 +365,30 @@ impl TorrentState {
} }
Ok::<_, anyhow::Error>(()) Ok::<_, anyhow::Error>(())
} }
},
pub async fn task_peer_adder(
self: Arc<Self>,
mut peer_queue_rx: UnboundedReceiver<SocketAddr>,
spawner: BlockingSpawner,
) -> anyhow::Result<()> {
let state = self;
loop {
let addr = peer_queue_rx.recv().await.unwrap();
if state.is_finished() {
debug!("ignoring peer {} as we are finished", addr);
state.locked.write().peers.mark_peer_not_needed(addr);
continue;
}
let permit = state.peer_semaphore.acquire().await.unwrap();
permit.forget();
spawn(
span!(parent: None, Level::ERROR, "manage_peer", peer = addr.to_string()),
state.clone().task_manage_peer(addr, spawner),
); );
} }
} }
});
state
}
pub fn info(&self) -> &TorrentMetaV1Info<ByteString> { pub fn info(&self) -> &TorrentMetaV1Info<ByteString> {
&self.info &self.info
} }