subspace_farmer/single_disk_farm/
plotted_sectors.rs

1use 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/// Getter for single disk plotted sectors
14#[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}