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 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
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue