Fix the bug thanks to e2e test
This commit is contained in:
parent
cd87acdab2
commit
5384f8c9db
3 changed files with 23 additions and 13 deletions
|
|
@ -67,18 +67,14 @@ pub async fn read_metainfo_from_peer_receiver<A: Stream<Item = SocketAddr> + Unp
|
||||||
unordered.push(read_info_guarded(a));
|
unordered.push(read_info_guarded(a));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let mut addrs_completed = false;
|
||||||
|
|
||||||
loop {
|
loop {
|
||||||
|
if addrs_completed && unordered.is_empty() {
|
||||||
|
return ReadMetainfoResult::ChannelClosed { seen };
|
||||||
|
}
|
||||||
|
|
||||||
tokio::select! {
|
tokio::select! {
|
||||||
next_addr = addrs.next() => {
|
|
||||||
match next_addr {
|
|
||||||
Some(addr) => {
|
|
||||||
if seen.insert(addr) {
|
|
||||||
unordered.push(read_info_guarded(addr));
|
|
||||||
}
|
|
||||||
},
|
|
||||||
None => return ReadMetainfoResult::ChannelClosed { seen },
|
|
||||||
}
|
|
||||||
},
|
|
||||||
done = unordered.next(), if !unordered.is_empty() => {
|
done = unordered.next(), if !unordered.is_empty() => {
|
||||||
match done {
|
match done {
|
||||||
Some(Ok((info, info_bytes))) => return ReadMetainfoResult::Found { info, info_bytes, seen, rx: addrs },
|
Some(Ok((info, info_bytes))) => return ReadMetainfoResult::Found { info, info_bytes, seen, rx: addrs },
|
||||||
|
|
@ -88,6 +84,20 @@ pub async fn read_metainfo_from_peer_receiver<A: Stream<Item = SocketAddr> + Unp
|
||||||
None => unreachable!()
|
None => unreachable!()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
next_addr = addrs.next(), if !addrs_completed => {
|
||||||
|
match next_addr {
|
||||||
|
Some(addr) => {
|
||||||
|
if seen.insert(addr) {
|
||||||
|
unordered.push(read_info_guarded(addr));
|
||||||
|
}
|
||||||
|
continue;
|
||||||
|
},
|
||||||
|
None => {
|
||||||
|
addrs_completed = true;
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1053,7 +1053,7 @@ impl Session {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ReadMetainfoResult::ChannelClosed { .. } => {
|
ReadMetainfoResult::ChannelClosed { .. } => {
|
||||||
bail!("DHT died, no way to discover torrent metainfo")
|
bail!("input address stream exhausted, no way to discover torrent metainfo")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1527,7 +1527,7 @@ impl PeerHandler {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn send_metadata_piece(&self, piece_id: u32) -> anyhow::Result<()> {
|
fn send_metadata_piece(&self, piece_id: u32) -> anyhow::Result<()> {
|
||||||
let data = &self.state.meta().torrent_bytes;
|
let data = &self.state.meta().info_bytes;
|
||||||
let metadata_size = data.len();
|
let metadata_size = data.len();
|
||||||
if metadata_size == 0 {
|
if metadata_size == 0 {
|
||||||
anyhow::bail!("peer requested for info metadata but we don't have it")
|
anyhow::bail!("peer requested for info metadata but we don't have it")
|
||||||
|
|
@ -1541,7 +1541,7 @@ impl PeerHandler {
|
||||||
}
|
}
|
||||||
|
|
||||||
let offset = piece_id * CHUNK_SIZE;
|
let offset = piece_id * CHUNK_SIZE;
|
||||||
let end = (offset + CHUNK_SIZE).min((data.len() - 1).try_into()?);
|
let end = (offset + CHUNK_SIZE).min(data.len().try_into()?);
|
||||||
let data = data.slice(offset as usize..end as usize);
|
let data = data.slice(offset as usize..end as usize);
|
||||||
|
|
||||||
self.tx
|
self.tx
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue