Split up a couple methods
This commit is contained in:
parent
d39479a251
commit
a745257be2
1 changed files with 74 additions and 62 deletions
|
|
@ -31,7 +31,7 @@ use serde::Serialize;
|
|||
use sha1w::Sha1;
|
||||
use tokio::{
|
||||
sync::{
|
||||
mpsc::{unbounded_channel, UnboundedSender},
|
||||
mpsc::{unbounded_channel, UnboundedReceiver, UnboundedSender},
|
||||
Notify, Semaphore,
|
||||
},
|
||||
time::timeout,
|
||||
|
|
@ -291,7 +291,7 @@ impl TorrentState {
|
|||
options: Option<TorrentStateOptions>,
|
||||
) -> Arc<Self> {
|
||||
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 {
|
||||
info_hash,
|
||||
info,
|
||||
|
|
@ -315,24 +315,19 @@ impl TorrentState {
|
|||
peer_queue_tx,
|
||||
finished_notify: Notify::new(),
|
||||
});
|
||||
spawn(span!(Level::ERROR, "peer_adder"), {
|
||||
let state = state.clone();
|
||||
async move {
|
||||
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;
|
||||
spawn(
|
||||
span!(Level::ERROR, "peer_adder"),
|
||||
state.clone().task_peer_adder(peer_queue_rx, spawner),
|
||||
);
|
||||
state
|
||||
}
|
||||
|
||||
let permit = state.peer_semaphore.acquire().await.unwrap();
|
||||
permit.forget();
|
||||
spawn(
|
||||
span!(parent: None, Level::ERROR, "manage_peer", peer = addr.to_string()),
|
||||
{
|
||||
let state = state.clone();
|
||||
async move {
|
||||
pub async fn task_manage_peer(
|
||||
self: Arc<Self>,
|
||||
addr: SocketAddr,
|
||||
spawner: BlockingSpawner,
|
||||
) -> anyhow::Result<()> {
|
||||
let state = self;
|
||||
let rx = state.locked.write().peers.mark_peer_connecting(addr)?;
|
||||
|
||||
let handler = PeerHandler {
|
||||
|
|
@ -370,13 +365,30 @@ impl TorrentState {
|
|||
}
|
||||
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> {
|
||||
&self.info
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue