diff --git a/src/backend.rs b/src/backend.rs index b147c365..7dd98d82 100644 --- a/src/backend.rs +++ b/src/backend.rs @@ -99,6 +99,7 @@ pub enum BackendNotification { config: Config, raw_config: RawConfig, best_block_number: BlockNumber, + initial_plotting_states: Vec, }, Node(NodeNotification), Farmer(FarmerNotification), @@ -306,6 +307,7 @@ async fn run( config, raw_config, best_block_number: consensus_node.best_block_number(), + initial_plotting_states: farmer.initial_plotting_states().to_vec(), }) .await?; diff --git a/src/backend/farmer.rs b/src/backend/farmer.rs index 1d9b5ad6..0781fb78 100644 --- a/src/backend/farmer.rs +++ b/src/backend/farmer.rs @@ -8,7 +8,7 @@ use atomic::Atomic; use event_listener_primitives::HandlerId; use futures::channel::oneshot; use futures::future::BoxFuture; -use futures::stream::FuturesUnordered; +use futures::stream::{FuturesOrdered, FuturesUnordered}; use futures::{select, FutureExt, StreamExt}; use lru::LruCache; use parking_lot::Mutex; @@ -68,6 +68,7 @@ struct Handlers { pub(super) struct Farmer { farm_fut: BoxFuture<'static, anyhow::Result<()>>, piece_cache_worker_fut: BoxFuture<'static, ()>, + initial_plotting_states: Vec, handlers: Arc, } @@ -109,6 +110,10 @@ impl Farmer { Ok(()) } + pub(super) fn initial_plotting_states(&self) -> &[PlottingState] { + &self.initial_plotting_states + } + pub(super) fn on_plotting_state_change( &self, callback: Handler2Fn, @@ -371,6 +376,21 @@ pub(super) async fn create_farmer(farmer_options: FarmerOptions) -> anyhow::Resu })) .detach(); + let initial_plotting_states = single_disk_farms + .iter() + .map(|single_disk_farm| async { + if usize::from(single_disk_farm.total_sectors_count().await) + == single_disk_farm.plotted_sectors_count().await + { + PlottingState::Idle + } else { + PlottingState::Unknown + } + }) + .collect::>() + .collect() + .await; + let mut single_disk_farms_stream = single_disk_farms .into_iter() .enumerate() @@ -478,6 +498,7 @@ pub(super) async fn create_farmer(farmer_options: FarmerOptions) -> anyhow::Resu anyhow::Ok(Farmer { farm_fut, piece_cache_worker_fut, + initial_plotting_states, handlers, }) } diff --git a/src/frontend/running.rs b/src/frontend/running.rs index ed0f6cbc..20d9c6ca 100644 --- a/src/frontend/running.rs +++ b/src/frontend/running.rs @@ -10,7 +10,7 @@ use tracing::warn; pub enum RunningInput { Initialize { best_block_number: BlockNumber, - num_farms: usize, + initial_plotting_states: Vec, }, NodeNotification(NodeNotification), FarmerNotification(FarmerNotification), @@ -244,14 +244,14 @@ impl RunningView { match input { RunningInput::Initialize { best_block_number, - num_farms, + initial_plotting_states, } => { self.node_state = NodeState { best_block_number, sync_state: SyncState::default(), }; self.farmer_state = FarmerState { - plotting_state: vec![PlottingState::default(); num_farms], + plotting_state: initial_plotting_states, piece_cache_sync_progress: 0.0, }; } diff --git a/src/main.rs b/src/main.rs index e7a26510..43f5d19b 100644 --- a/src/main.rs +++ b/src/main.rs @@ -359,16 +359,16 @@ impl App { } }, BackendNotification::Running { - config, + config: _, raw_config, best_block_number, + initial_plotting_states, } => { - let num_farms = config.farms.len(); self.current_raw_config.replace(raw_config); self.current_view = View::Running; self.running_view.emit(RunningInput::Initialize { best_block_number, - num_farms, + initial_plotting_states, }); } BackendNotification::Node(node_notification) => {