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,68 +315,80 @@ 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();
|
|
||||||
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()),
|
|
||||||
{
|
|
||||||
let state = state.clone();
|
|
||||||
async move {
|
|
||||||
let rx = state.locked.write().peers.mark_peer_connecting(addr)?;
|
|
||||||
|
|
||||||
let handler = PeerHandler {
|
|
||||||
addr,
|
|
||||||
state: state.clone(),
|
|
||||||
spawner,
|
|
||||||
};
|
|
||||||
let options = PeerConnectionOptions {
|
|
||||||
connect_timeout: state.options.peer_connect_timeout,
|
|
||||||
read_write_timeout: state.options.peer_read_write_timeout,
|
|
||||||
..Default::default()
|
|
||||||
};
|
|
||||||
let peer_connection = PeerConnection::new(
|
|
||||||
addr,
|
|
||||||
state.info_hash,
|
|
||||||
state.peer_id,
|
|
||||||
handler,
|
|
||||||
Some(options),
|
|
||||||
spawner,
|
|
||||||
);
|
|
||||||
|
|
||||||
let res = peer_connection.manage_peer(rx).await;
|
|
||||||
let state = peer_connection.into_handler().state;
|
|
||||||
state.peer_semaphore.add_permits(1);
|
|
||||||
|
|
||||||
match res {
|
|
||||||
// We disconnected the peer ourselves as we don't need it
|
|
||||||
Ok(()) => {
|
|
||||||
state.on_peer_died(addr, None);
|
|
||||||
}
|
|
||||||
Err(e) => {
|
|
||||||
debug!("error managing peer: {:#}", e);
|
|
||||||
state.on_peer_died(addr, Some(e));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Ok::<_, anyhow::Error>(())
|
|
||||||
}
|
|
||||||
},
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
state
|
state
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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 {
|
||||||
|
addr,
|
||||||
|
state: state.clone(),
|
||||||
|
spawner,
|
||||||
|
};
|
||||||
|
let options = PeerConnectionOptions {
|
||||||
|
connect_timeout: state.options.peer_connect_timeout,
|
||||||
|
read_write_timeout: state.options.peer_read_write_timeout,
|
||||||
|
..Default::default()
|
||||||
|
};
|
||||||
|
let peer_connection = PeerConnection::new(
|
||||||
|
addr,
|
||||||
|
state.info_hash,
|
||||||
|
state.peer_id,
|
||||||
|
handler,
|
||||||
|
Some(options),
|
||||||
|
spawner,
|
||||||
|
);
|
||||||
|
|
||||||
|
let res = peer_connection.manage_peer(rx).await;
|
||||||
|
let state = peer_connection.into_handler().state;
|
||||||
|
state.peer_semaphore.add_permits(1);
|
||||||
|
|
||||||
|
match res {
|
||||||
|
// We disconnected the peer ourselves as we don't need it
|
||||||
|
Ok(()) => {
|
||||||
|
state.on_peer_died(addr, None);
|
||||||
|
}
|
||||||
|
Err(e) => {
|
||||||
|
debug!("error managing peer: {:#}", e);
|
||||||
|
state.on_peer_died(addr, Some(e));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
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),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
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