diff --git a/crates/librqbit/src/chunk_tracker.rs b/crates/librqbit/src/chunk_tracker.rs index d5bccbd..9e0893b 100644 --- a/crates/librqbit/src/chunk_tracker.rs +++ b/crates/librqbit/src/chunk_tracker.rs @@ -34,23 +34,32 @@ pub struct ChunkTracker { // E.g. we might have more pieces, but the client asks to download only some files // partially. fn compute_chunk_status(lengths: &Lengths, needed_pieces: &BF) -> anyhow::Result { + if needed_pieces.len() != lengths.total_pieces() as usize { + anyhow::bail!( + "bug: needed_pieces.len() != lengths.total_pieces(); {} != {}", + needed_pieces.len(), + lengths.total_pieces() + ); + } let required_size = lengths.chunk_bitfield_bytes(); let vec = vec![0u8; required_size]; let mut chunk_bf = BF::from_boxed_slice(vec.into_boxed_slice()); let range = 0..lengths.total_pieces() as usize; for piece_index in needed_pieces .get(range.clone()) - .with_context(|| format!("error getting range {range:?} from needed_pieces"))? + .with_context(|| format!("bug: error getting range {range:?} from needed_pieces. needed_pieces.len() = {}, range={:?}", needed_pieces.len(), range))? .iter_zeros() { let offset = piece_index * lengths.default_chunks_per_piece() as usize; - let chunks_per_piece = lengths - .chunks_per_piece(lengths.try_validate_piece_index(piece_index as u32)?) - as usize; + let chunks_per_piece = lengths.chunks_per_piece( + lengths + .try_validate_piece_index(piece_index as u32) + .context("bug")?, + ) as usize; let range = offset..offset + chunks_per_piece; chunk_bf .get_mut(range.clone()) - .with_context(|| format!("error getting range {range:?} from chunk_bf"))? + .with_context(|| format!("bug: error getting range {range:?} from chunk_bf"))? .fill(true); } Ok(chunk_bf)