From 721bc46657aedbe67e920123d7dd3d152dc4688b Mon Sep 17 00:00:00 2001 From: Austin Abell Date: Fri, 22 Jan 2021 14:00:59 -0500 Subject: [PATCH] Fix bugs in terminate sectors logic (#950) --- vm/actor/src/builtin/miner/expiration_queue.rs | 8 +++++--- vm/actor/src/builtin/miner/partition_state.rs | 4 ++-- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/vm/actor/src/builtin/miner/expiration_queue.rs b/vm/actor/src/builtin/miner/expiration_queue.rs index 7eb7a9d960fd..4d692da6250d 100644 --- a/vm/actor/src/builtin/miner/expiration_queue.rs +++ b/vm/actor/src/builtin/miner/expiration_queue.rs @@ -490,14 +490,16 @@ impl<'db, BS: BlockStore> ExpirationQueue<'db, BS> { // Split into faulty and non-faulty. We process non-faulty sectors first // because they always expire on-time so we know where to find them. - let mut non_faulty_sectors = Vec::<&SectorOnChainInfo>::new(); + // TODO since cloning info, should be RC or find a way for data to be references. + // This might get optimized by the compiler, so not a priority + let mut non_faulty_sectors = Vec::::new(); let mut faulty_sectors = Vec::<&SectorOnChainInfo>::new(); for sector in sectors { if faults_map.contains(§or.sector_number) { faulty_sectors.push(sector); } else { - non_faulty_sectors.push(sector); + non_faulty_sectors.push(sector.clone()); // remove them from "remaining", we're going to process them below. remaining.remove(§or.sector_number); @@ -506,7 +508,7 @@ impl<'db, BS: BlockStore> ExpirationQueue<'db, BS> { // Remove non-faulty sectors. let (removed_sector_numbers, removed_power, removed_pledge) = self - .remove_active_sectors(sectors, sector_size) + .remove_active_sectors(&non_faulty_sectors, sector_size) .map_err(|e| e.downcast_wrap("failed to remove on-time recoveries"))?; removed.on_time_sectors = removed_sector_numbers; removed.active_power = removed_power; diff --git a/vm/actor/src/builtin/miner/partition_state.rs b/vm/actor/src/builtin/miner/partition_state.rs index 364471c4911d..0adf278d3237 100644 --- a/vm/actor/src/builtin/miner/partition_state.rs +++ b/vm/actor/src/builtin/miner/partition_state.rs @@ -485,8 +485,8 @@ impl Partition { ) })?; - if live_sectors.contains_all(sector_numbers) { - return Err(actor_error!(ErrIllegalArgument; "can only terminate live sectors").into()); + if !live_sectors.contains_all(sector_numbers) { + return Err(actor_error!(ErrIllegalArgument, "can only terminate live sectors").into()); } let sector_infos = sectors.load_sector(sector_numbers)?;