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));
|
||||
}
|
||||
|
||||
let mut addrs_completed = false;
|
||||
|
||||
loop {
|
||||
if addrs_completed && unordered.is_empty() {
|
||||
return ReadMetainfoResult::ChannelClosed { seen };
|
||||
}
|
||||
|
||||
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() => {
|
||||
match done {
|
||||
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!()
|
||||
}
|
||||
}
|
||||
|
||||
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 { .. } => {
|
||||
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<()> {
|
||||
let data = &self.state.meta().torrent_bytes;
|
||||
let data = &self.state.meta().info_bytes;
|
||||
let metadata_size = data.len();
|
||||
if metadata_size == 0 {
|
||||
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 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);
|
||||
|
||||
self.tx
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue