subspace_farmer/single_disk_farm/
plotted_sectors.rs1use crate::farm::{FarmError, PlottedSectors};
2use async_lock::RwLock as AsyncRwLock;
3use async_trait::async_trait;
4use futures::{stream, Stream};
5use std::sync::Arc;
6use subspace_core_primitives::pieces::PieceOffset;
7use subspace_core_primitives::sectors::SectorId;
8use subspace_core_primitives::PublicKey;
9use subspace_farmer_components::plotting::PlottedSector;
10use subspace_farmer_components::sector::SectorMetadataChecksummed;
11use subspace_farmer_components::FarmerProtocolInfo;
12
13#[derive(Debug)]
15pub struct SingleDiskPlottedSectors {
16 pub(super) public_key: PublicKey,
17 pub(super) pieces_in_sector: u16,
18 pub(super) farmer_protocol_info: FarmerProtocolInfo,
19 pub(super) sectors_metadata: Arc<AsyncRwLock<Vec<SectorMetadataChecksummed>>>,
20}
21
22#[async_trait]
23impl PlottedSectors for SingleDiskPlottedSectors {
24 async fn get(
25 &self,
26 ) -> Result<
27 Box<dyn Stream<Item = Result<PlottedSector, FarmError>> + Unpin + Send + '_>,
28 FarmError,
29 > {
30 let public_key_hash = self.public_key.hash();
31 let sectors_metadata = self.sectors_metadata.read().await.clone();
32 Ok(Box::new(stream::iter((0..).zip(sectors_metadata).map(
33 move |(sector_index, sector_metadata)| {
34 let sector_id =
35 SectorId::new(public_key_hash, sector_index, sector_metadata.history_size);
36
37 let mut piece_indexes = Vec::with_capacity(usize::from(self.pieces_in_sector));
38 (PieceOffset::ZERO..)
39 .take(usize::from(self.pieces_in_sector))
40 .map(|piece_offset| {
41 sector_id.derive_piece_index(
42 piece_offset,
43 sector_metadata.history_size,
44 self.farmer_protocol_info.max_pieces_in_sector,
45 self.farmer_protocol_info.recent_segments,
46 self.farmer_protocol_info.recent_history_fraction,
47 )
48 })
49 .collect_into(&mut piece_indexes);
50
51 Ok(PlottedSector {
52 sector_id,
53 sector_index,
54 sector_metadata,
55 piece_indexes,
56 })
57 },
58 ))))
59 }
60}