use super::policy::*;
use super::{Deadlines, Partition};
use clock::ChainEpoch;
use fil_types::{
deadlines::{DeadlineInfo, QuantSpec},
SectorNumber,
};
use ipld_amt::Amt;
use ipld_blockstore::BlockStore;
use std::error::Error as StdError;
pub fn new_deadline_info(
proving_period_start: ChainEpoch,
deadline_idx: usize,
current_epoch: ChainEpoch,
) -> DeadlineInfo {
DeadlineInfo::new(
proving_period_start,
deadline_idx as u64,
current_epoch,
WPOST_PERIOD_DEADLINES as u64,
WPOST_PROVING_PERIOD,
WPOST_CHALLENGE_WINDOW,
WPOST_CHALLENGE_LOOKBACK,
FAULT_DECLARATION_CUTOFF,
)
}
impl Deadlines {
pub fn find_sector<BS: BlockStore>(
&self,
store: &BS,
sector_number: SectorNumber,
) -> Result<(usize, usize), Box<dyn StdError>> {
for i in 0..self.due.len() {
let deadline_idx = i;
let deadline = self.load_deadline(store, deadline_idx)?;
let partitions = Amt::<Partition, _>::load(&deadline.partitions, store)?;
let mut partition_idx = None;
partitions.for_each_while(|i, partition| {
if partition.sectors.get(sector_number as usize) {
partition_idx = Some(i);
Ok(false)
} else {
Ok(true)
}
})?;
if let Some(partition_idx) = partition_idx {
return Ok((deadline_idx, partition_idx));
}
}
Err(format!("sector {} not due at any deadline", sector_number).into())
}
}
pub fn deadline_is_mutable(
proving_period_start: ChainEpoch,
deadline_idx: usize,
current_epoch: ChainEpoch,
) -> bool {
let deadline_info =
new_deadline_info(proving_period_start, deadline_idx, current_epoch).next_not_elapsed();
current_epoch < deadline_info.open - WPOST_CHALLENGE_WINDOW
}
pub fn quant_spec_for_deadline(di: &DeadlineInfo) -> QuantSpec {
QuantSpec {
unit: WPOST_PROVING_PERIOD,
offset: di.last(),
}
}
pub fn deadline_available_for_optimistic_post_dispute(
proving_period_start: ChainEpoch,
deadline_idx: usize,
current_epoch: ChainEpoch,
) -> bool {
if proving_period_start > current_epoch {
return false;
}
let dl_info =
new_deadline_info(proving_period_start, deadline_idx, current_epoch).next_not_elapsed();
!dl_info.is_open()
&& current_epoch < (dl_info.close - WPOST_PROVING_PERIOD) + WPOST_DISPUTE_WINDOW
}
pub fn deadline_available_for_compaction(
proving_period_start: ChainEpoch,
deadline_idx: usize,
current_epoch: ChainEpoch,
) -> bool {
deadline_is_mutable(proving_period_start, deadline_idx, current_epoch)
&& !deadline_available_for_optimistic_post_dispute(
proving_period_start,
deadline_idx,
current_epoch,
)
}
pub fn new_deadline_info_from_offset_and_epoch(
period_start_seed: ChainEpoch,
current_epoch: ChainEpoch,
) -> DeadlineInfo {
let q = QuantSpec {
unit: WPOST_PROVING_PERIOD,
offset: period_start_seed,
};
let current_period_start = q.quantize_down(current_epoch);
let current_deadline_idx = ((current_epoch - current_period_start) / WPOST_CHALLENGE_WINDOW)
as u64
% WPOST_PERIOD_DEADLINES;
new_deadline_info(
current_period_start,
current_deadline_idx as usize,
current_epoch,
)
}