diff --git a/crates/librqbit/src/dht_utils.rs b/crates/librqbit/src/dht_utils.rs index d97a98d..ce054e5 100644 --- a/crates/librqbit/src/dht_utils.rs +++ b/crates/librqbit/src/dht_utils.rs @@ -67,18 +67,14 @@ pub async fn read_metainfo_from_peer_receiver + 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 + 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; + }, + } + } }; } } diff --git a/crates/librqbit/src/session.rs b/crates/librqbit/src/session.rs index 19c5100..7526002 100644 --- a/crates/librqbit/src/session.rs +++ b/crates/librqbit/src/session.rs @@ -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") } } } diff --git a/crates/librqbit/src/torrent_state/live/mod.rs b/crates/librqbit/src/torrent_state/live/mod.rs index 40d04fb..a0d51db 100644 --- a/crates/librqbit/src/torrent_state/live/mod.rs +++ b/crates/librqbit/src/torrent_state/live/mod.rs @@ -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