diff --git a/crates/librqbit/src/chunk_tracker.rs b/crates/librqbit/src/chunk_tracker.rs index 891fd43..794febd 100644 --- a/crates/librqbit/src/chunk_tracker.rs +++ b/crates/librqbit/src/chunk_tracker.rs @@ -205,13 +205,13 @@ impl ChunkTracker { pub(crate) fn iter_queued_pieces<'a>( &'a self, file_priorities: &'a FilePriorities, - opened_files: &'a FileInfos, + file_infos: &'a FileInfos, ) -> impl Iterator + 'a { file_priorities .iter() - .filter_map(|p| opened_files.get(*p)) - // .filter(|f| !f.approx_is_finished()) - .flat_map(|f| f.iter_piece_priorities()) + .filter_map(|p| Some((*p, file_infos.get(*p)?))) + .filter(|(id, f)| self.per_file_bytes[*id] != f.len) + .flat_map(|(_id, f)| f.iter_piece_priorities()) .filter(|id| self.queue_pieces[*id]) .filter_map(|id| id.try_into().ok()) .filter_map(|id| self.lengths.validate_piece_index(id)) @@ -249,12 +249,7 @@ impl ChunkTracker { { return; } - self.mark_piece_broken(index) - } - - pub fn mark_piece_broken(&mut self, index: ValidPieceIndex) { debug!("marking piece={} as broken", index); - self.have.set(index.get() as usize, false); self.queue_pieces.set(index.get() as usize, true); if let Some(s) = self.chunk_status.get_mut(self.lengths.chunk_range(index)) { s.fill(false); diff --git a/crates/librqbit/src/torrent_state/streaming.rs b/crates/librqbit/src/torrent_state/streaming.rs index 593c57f..e197290 100644 --- a/crates/librqbit/src/torrent_state/streaming.rs +++ b/crates/librqbit/src/torrent_state/streaming.rs @@ -247,12 +247,6 @@ impl AsyncRead for FileStream { self.as_mut().advance(bytes_to_read as u64); tbuf.advance(bytes_to_read); - self.streams - .streams - .get_mut(&self.stream_id) - .unwrap() - .value_mut() - .position = self.position; Poll::Ready(Ok(())) } @@ -305,7 +299,7 @@ impl ManagedTorrent { let files = match s { crate::ManagedTorrentState::Paused(p) => &*p.files, crate::ManagedTorrentState::Live(l) => &*l.files, - _ => anyhow::bail!("invalid state"), + s => anyhow::bail!("with_storage_and_file: invalid state: {}", s.name()), }; let fi = self .info() @@ -338,6 +332,7 @@ impl ManagedTorrent { } fn is_file_finished(&self, file_id: usize) -> bool { + // TODO: would be nice to remove locking self.with_chunk_tracker(|ct| ct.is_file_finished(&self.info.file_infos[file_id])) .unwrap_or(false) }