subspace_data_retrieval/
piece_fetcher.rs1use crate::object_fetcher::Error;
4use crate::piece_getter::PieceGetter;
5use futures::StreamExt;
6use std::sync::Arc;
7use subspace_core_primitives::pieces::{Piece, PieceIndex};
8use tracing::{debug, trace};
9
10pub async fn download_pieces<PG>(
17 piece_indexes: Arc<[PieceIndex]>,
18 piece_getter: &PG,
19) -> anyhow::Result<Vec<Piece>>
20where
21 PG: PieceGetter,
22{
23 debug!(
24 count = piece_indexes.len(),
25 ?piece_indexes,
26 "Retrieving exact pieces"
27 );
28
29 let mut received_pieces = piece_getter.get_pieces(piece_indexes.to_vec()).await?;
34
35 let mut pieces = Vec::new();
36 pieces.resize(piece_indexes.len(), Piece::default());
37
38 while let Some((piece_index, maybe_piece)) = received_pieces.next().await {
39 let piece = maybe_piece?.ok_or(Error::PieceNotFound { piece_index })?;
41 let index_position = piece_indexes
42 .iter()
43 .position(|i| *i == piece_index)
44 .expect("get_pieces only returns indexes it was supplied; qed");
45 pieces[index_position] = piece;
46 }
47
48 trace!(
49 count = piece_indexes.len(),
50 ?piece_indexes,
51 "Successfully retrieved exact pieces"
52 );
53
54 Ok(pieces)
55}