Skip to content

Commit 1b282d4

Browse files
authored
Claim allocations processes batches by sector (#1337)
* Claim allocations processes batches by sector * review * restore illegal argument on batch failure * fmt
1 parent 64a103e commit 1b282d4

File tree

9 files changed

+322
-230
lines changed

9 files changed

+322
-230
lines changed

actors/market/src/lib.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -545,7 +545,7 @@ impl Actor {
545545
let (activations, batch_ret) = rt.transaction(|st: &mut State, rt| {
546546
let mut deal_states: Vec<(DealID, DealState)> = vec![];
547547
let mut batch_gen = BatchReturnGen::new(params.sectors.len());
548-
let mut activations: Vec<DealActivation> = vec![];
548+
let mut activations: Vec<SectorDealActivation> = vec![];
549549
let mut activated_deals: HashSet<DealID> = HashSet::new();
550550

551551
for p in params.sectors {
@@ -651,7 +651,7 @@ impl Actor {
651651

652652
match update_result {
653653
Ok(_) => {
654-
activations.push(DealActivation {
654+
activations.push(SectorDealActivation {
655655
nonverified_deal_space: deal_spaces.deal_space,
656656
verified_infos,
657657
});

actors/market/src/types.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,8 @@ pub struct SectorDealData {
9999
#[serde(transparent)]
100100
pub struct BatchActivateDealsParams {
101101
/// Deals to activate, grouped by sector.
102+
/// A failed deal activation will cause other deals in the same sector group to also fail,
103+
/// but allow other sectors to proceed.
102104
pub sectors: Vec<SectorDeals>,
103105
}
104106

@@ -113,7 +115,7 @@ pub struct VerifiedDealInfo {
113115

114116
// Information about a sector-grouping of deals that have been activated.
115117
#[derive(Serialize_tuple, Deserialize_tuple, Debug, Clone, Eq, PartialEq)]
116-
pub struct DealActivation {
118+
pub struct SectorDealActivation {
117119
/// The total size of the non-verified deals activated.
118120
#[serde(with = "bigint_ser")]
119121
pub nonverified_deal_space: BigInt,
@@ -126,7 +128,7 @@ pub struct BatchActivateDealsResult {
126128
/// Status of each sector grouping of deals.
127129
pub activation_results: BatchReturn,
128130
/// Activation information for the sector groups that were activated.
129-
pub activations: Vec<DealActivation>,
131+
pub activations: Vec<SectorDealActivation>,
130132
}
131133

132134
#[derive(Serialize_tuple, Deserialize_tuple, Debug, Clone, Eq, PartialEq)]

actors/miner/src/ext.rs

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -202,31 +202,36 @@ pub mod verifreg {
202202
}
203203

204204
#[derive(Clone, Debug, PartialEq, Eq, Serialize_tuple, Deserialize_tuple)]
205-
pub struct SectorAllocationClaim {
205+
pub struct SectorAllocationClaims {
206+
pub sector: SectorNumber,
207+
pub expiry: ChainEpoch,
208+
pub claims: Vec<AllocationClaim>,
209+
}
210+
211+
#[derive(Clone, Debug, PartialEq, Eq, Serialize_tuple, Deserialize_tuple)]
212+
pub struct AllocationClaim {
206213
pub client: ActorID,
207214
pub allocation_id: AllocationID,
208215
pub data: Cid,
209216
pub size: PaddedPieceSize,
210-
pub sector: SectorNumber,
211-
pub sector_expiry: ChainEpoch,
212217
}
213218

214219
#[derive(Clone, Debug, PartialEq, Eq, Serialize_tuple, Deserialize_tuple)]
215220
pub struct ClaimAllocationsParams {
216-
pub allocations: Vec<SectorAllocationClaim>,
221+
pub sectors: Vec<SectorAllocationClaims>,
217222
pub all_or_nothing: bool,
218223
}
219224

220225
#[derive(Clone, Debug, PartialEq, Eq, Default, Serialize_tuple, Deserialize_tuple)]
221226
#[serde(transparent)]
222-
pub struct SectorAllocationClaimResult {
227+
pub struct SectorClaimSummary {
223228
#[serde(with = "bigint_ser")]
224229
pub claimed_space: BigInt,
225230
}
226231

227232
#[derive(Clone, Debug, PartialEq, Eq, Serialize_tuple, Deserialize_tuple)]
228233
pub struct ClaimAllocationsReturn {
229-
pub claim_results: BatchReturn,
230-
pub claims: Vec<SectorAllocationClaimResult>,
234+
pub sector_results: BatchReturn,
235+
pub sector_claims: Vec<SectorClaimSummary>,
231236
}
232237
}

actors/miner/src/lib.rs

Lines changed: 22 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -5010,32 +5010,39 @@ fn batch_activate_deals_and_claim_allocations(
50105010
for (activation_info, activate_res) in
50115011
successful_activation_infos.iter().zip(&batch_activation_res.activations)
50125012
{
5013-
let mut sector_claims = activate_res
5013+
let sector_claims = activate_res
50145014
.verified_infos
50155015
.iter()
5016-
.map(|info| ext::verifreg::SectorAllocationClaim {
5016+
.map(|info| ext::verifreg::AllocationClaim {
50175017
client: info.client,
50185018
allocation_id: info.allocation_id,
50195019
data: info.data,
50205020
size: info.size,
5021-
sector: activation_info.sector_number,
5022-
sector_expiry: activation_info.sector_expiry,
50235021
})
50245022
.collect();
5025-
verified_claims.append(&mut sector_claims);
5023+
verified_claims.push(ext::verifreg::SectorAllocationClaims {
5024+
sector: activation_info.sector_number,
5025+
expiry: activation_info.sector_expiry,
5026+
claims: sector_claims,
5027+
});
50265028
}
50275029

5028-
let claim_res = match verified_claims.is_empty() {
5030+
let claim_res = match verified_claims.iter().all(|sector| sector.claims.is_empty()) {
5031+
// Short-circuit the call if there are no claims,
5032+
// but otherwise send a group for each sector (even if empty) to ease association of results.
50295033
true => ext::verifreg::ClaimAllocationsReturn {
5030-
claim_results: BatchReturn::empty(),
5031-
claims: Vec::default(),
5034+
sector_results: BatchReturn::ok(verified_claims.len() as u32),
5035+
sector_claims: vec![
5036+
ext::verifreg::SectorClaimSummary { claimed_space: BigInt::zero() };
5037+
verified_claims.len()
5038+
],
50325039
},
50335040
false => {
50345041
let claim_raw = extract_send_result(rt.send_simple(
50355042
&VERIFIED_REGISTRY_ACTOR_ADDR,
50365043
ext::verifreg::CLAIM_ALLOCATIONS_METHOD,
50375044
IpldBlock::serialize_cbor(&ext::verifreg::ClaimAllocationsParams {
5038-
allocations: verified_claims,
5045+
sectors: verified_claims,
50395046
all_or_nothing: true,
50405047
})?,
50415048
TokenAmount::zero(),
@@ -5048,29 +5055,19 @@ fn batch_activate_deals_and_claim_allocations(
50485055
};
50495056

50505057
assert!(
5051-
claim_res.claim_results.all_ok() || claim_res.claim_results.success_count == 0,
5058+
claim_res.sector_results.all_ok() || claim_res.sector_results.success_count == 0,
50525059
"batch return of claim allocations partially succeeded but request was all_or_nothing {:?}",
50535060
claim_res
50545061
);
50555062

5056-
let mut claims = claim_res.claims.into_iter();
50575063
// reassociate the verified claims with corresponding DealActivation information
5058-
let activation_and_claim_results: Vec<ext::market::DealSpaces> = batch_activation_res
5064+
let activation_and_claim_results = batch_activation_res
50595065
.activations
50605066
.iter()
5061-
.map(|deal_activation| {
5062-
// each activation contributed as many claims as verified_info entries it had
5063-
let number_of_claims = deal_activation.verified_infos.len();
5064-
// we consume these claims from the iterator, then combine the claims into one
5065-
// value per DealActivation
5066-
let verified_deal_space = claims
5067-
.by_ref()
5068-
.take(number_of_claims)
5069-
.fold(BigInt::zero(), |acc, claim| acc + claim.claimed_space);
5070-
ext::market::DealSpaces {
5071-
verified_deal_space,
5072-
deal_space: deal_activation.nonverified_deal_space.clone(),
5073-
}
5067+
.zip(claim_res.sector_claims)
5068+
.map(|(sector_deals, sector_claim)| ext::market::DealSpaces {
5069+
verified_deal_space: sector_claim.claimed_space,
5070+
deal_space: sector_deals.nonverified_deal_space.clone(),
50745071
})
50755072
.collect();
50765073

actors/miner/tests/util.rs

Lines changed: 33 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -2,19 +2,16 @@
22

33
use fil_actor_account::Method as AccountMethod;
44
use fil_actor_market::{
5-
BatchActivateDealsParams, BatchActivateDealsResult, DealActivation, DealSpaces,
6-
Method as MarketMethod, OnMinerSectorsTerminateParams, SectorDealData, SectorDeals,
5+
BatchActivateDealsParams, BatchActivateDealsResult, DealSpaces, Method as MarketMethod,
6+
OnMinerSectorsTerminateParams, SectorDealActivation, SectorDealData, SectorDeals,
77
VerifiedDealInfo, VerifyDealsForActivationParams, VerifyDealsForActivationReturn,
88
};
99
use fil_actor_miner::ext::market::ON_MINER_SECTORS_TERMINATE_METHOD;
1010
use fil_actor_miner::ext::power::{UPDATE_CLAIMED_POWER_METHOD, UPDATE_PLEDGE_TOTAL_METHOD};
11-
use fil_actor_miner::ext::verifreg::{
12-
ClaimAllocationsParams, ClaimAllocationsReturn, SectorAllocationClaim,
13-
SectorAllocationClaimResult, CLAIM_ALLOCATIONS_METHOD,
14-
};
11+
use fil_actor_miner::ext::verifreg::CLAIM_ALLOCATIONS_METHOD;
1512
use fil_actor_miner::{
1613
aggregate_pre_commit_network_fee, aggregate_prove_commit_network_fee, consensus_fault_penalty,
17-
initial_pledge_for_power, locked_reward_from_reward, max_prove_commit_duration,
14+
ext, initial_pledge_for_power, locked_reward_from_reward, max_prove_commit_duration,
1815
new_deadline_info_from_offset_and_epoch, pledge_penalty_for_continued_fault, power_for_sectors,
1916
qa_power_for_sector, qa_power_for_weight, reward_for_consensus_slash_report, ActiveBeneficiary,
2017
Actor, ApplyRewardParams, BeneficiaryTerm, BitFieldQueue, ChangeBeneficiaryParams,
@@ -1056,11 +1053,11 @@ impl ActorHarness {
10561053
let mut valid_pcs = Vec::new();
10571054

10581055
// claim FIL+ allocations
1059-
let mut sectors_claims: Vec<SectorAllocationClaim> = Vec::new();
1056+
let mut sectors_claims: Vec<ext::verifreg::SectorAllocationClaims> = Vec::new();
10601057

10611058
// build expectations per sector
10621059
let mut sector_activation_params: Vec<SectorDeals> = Vec::new();
1063-
let mut sector_activations: Vec<DealActivation> = Vec::new();
1060+
let mut sector_activations: Vec<SectorDealActivation> = Vec::new();
10641061
let mut sector_activation_results = BatchReturnGen::new(pcs.len());
10651062

10661063
for pc in pcs {
@@ -1073,7 +1070,7 @@ impl ActorHarness {
10731070
};
10741071
sector_activation_params.push(activate_params);
10751072

1076-
let ret = DealActivation {
1073+
let ret = SectorDealActivation {
10771074
nonverified_deal_space: deal_spaces.deal_space,
10781075
verified_infos: cfg
10791076
.verified_deal_infos
@@ -1094,25 +1091,23 @@ impl ActorHarness {
10941091
}
10951092
}
10961093

1097-
if ret.verified_infos.is_empty() {
1098-
if activate_deals_exit == ExitCode::OK {
1099-
valid_pcs.push(pc);
1100-
}
1101-
} else {
1102-
let mut sector_claims: Vec<SectorAllocationClaim> = ret
1094+
if activate_deals_exit == ExitCode::OK {
1095+
valid_pcs.push(pc);
1096+
let sector_claims = ret
11031097
.verified_infos
11041098
.iter()
1105-
.map(|info| SectorAllocationClaim {
1099+
.map(|info| ext::verifreg::AllocationClaim {
11061100
client: info.client,
11071101
allocation_id: info.allocation_id,
11081102
data: info.data,
11091103
size: info.size,
1110-
sector: pc.info.sector_number,
1111-
sector_expiry: pc.info.expiration,
11121104
})
11131105
.collect();
1114-
sectors_claims.append(&mut sector_claims);
1115-
valid_pcs.push(pc);
1106+
sectors_claims.push(ext::verifreg::SectorAllocationClaims {
1107+
sector: pc.info.sector_number,
1108+
expiry: pc.info.expiration,
1109+
claims: sector_claims,
1110+
});
11161111
}
11171112
} else {
11181113
// empty deal ids
@@ -1121,11 +1116,16 @@ impl ActorHarness {
11211116
sector_expiry: pc.info.expiration,
11221117
sector_type: RegisteredSealProof::StackedDRG8MiBV1,
11231118
});
1124-
sector_activations.push(DealActivation {
1119+
sector_activations.push(SectorDealActivation {
11251120
nonverified_deal_space: BigInt::zero(),
11261121
verified_infos: vec![],
11271122
});
11281123
sector_activation_results.add_success();
1124+
sectors_claims.push(ext::verifreg::SectorAllocationClaims {
1125+
sector: pc.info.sector_number,
1126+
expiry: pc.info.expiration,
1127+
claims: vec![],
1128+
});
11291129
valid_pcs.push(pc);
11301130
}
11311131
}
@@ -1148,20 +1148,24 @@ impl ActorHarness {
11481148
);
11491149
}
11501150

1151-
if !sectors_claims.is_empty() {
1152-
let claim_allocation_params = ClaimAllocationsParams {
1153-
allocations: sectors_claims.clone(),
1151+
if !sectors_claims.iter().all(|c| c.claims.is_empty()) {
1152+
let claim_allocation_params = ext::verifreg::ClaimAllocationsParams {
1153+
sectors: sectors_claims.clone(),
11541154
all_or_nothing: true,
11551155
};
11561156

11571157
// TODO handle failures of claim allocations
11581158
// use exit code map for claim allocations in config
1159-
let claim_allocs_ret = ClaimAllocationsReturn {
1160-
claims: sectors_claims
1159+
let claim_allocs_ret = ext::verifreg::ClaimAllocationsReturn {
1160+
sector_results: BatchReturn::ok(sectors_claims.len() as u32),
1161+
sector_claims: sectors_claims
11611162
.iter()
1162-
.map(|claim| SectorAllocationClaimResult { claimed_space: claim.size.0.into() })
1163+
.map(|sector| ext::verifreg::SectorClaimSummary {
1164+
claimed_space: BigInt::from(
1165+
sector.claims.iter().map(|c| c.size.0).sum::<u64>(),
1166+
),
1167+
})
11631168
.collect(),
1164-
claim_results: BatchReturn::ok(sectors_claims.len() as u32),
11651169
};
11661170
rt.expect_send_simple(
11671171
VERIFIED_REGISTRY_ACTOR_ADDR,

0 commit comments

Comments
 (0)