parent
944b9d574a
commit
1db0683a50
|
@ -2889,94 +2889,22 @@ impl Bank {
|
||||||
metrics,
|
metrics,
|
||||||
);
|
);
|
||||||
|
|
||||||
if point_value.is_none() {
|
if let Some(point_value) = point_value {
|
||||||
return;
|
let (vote_account_rewards, stake_rewards) = self.redeem_rewards(
|
||||||
|
vote_with_stake_delegations_map,
|
||||||
|
rewarded_epoch,
|
||||||
|
point_value,
|
||||||
|
credits_auto_rewind,
|
||||||
|
&stake_history,
|
||||||
|
thread_pool,
|
||||||
|
reward_calc_tracer.as_ref(),
|
||||||
|
metrics,
|
||||||
|
);
|
||||||
|
|
||||||
|
self.store_stake_accounts(&stake_rewards, metrics);
|
||||||
|
let vote_rewards = self.store_vote_accounts(vote_account_rewards, metrics);
|
||||||
|
self.update_reward_history(stake_rewards, vote_rewards);
|
||||||
}
|
}
|
||||||
|
|
||||||
// pay according to point value
|
|
||||||
let point_value = point_value.unwrap();
|
|
||||||
let vote_account_rewards: DashMap<Pubkey, (AccountSharedData, u8, u64, bool)> =
|
|
||||||
DashMap::with_capacity(vote_with_stake_delegations_map.len());
|
|
||||||
let stake_delegation_iterator = vote_with_stake_delegations_map.into_par_iter().flat_map(
|
|
||||||
|(
|
|
||||||
vote_pubkey,
|
|
||||||
VoteWithStakeDelegations {
|
|
||||||
vote_state,
|
|
||||||
vote_account,
|
|
||||||
delegations,
|
|
||||||
},
|
|
||||||
)| {
|
|
||||||
vote_account_rewards
|
|
||||||
.insert(vote_pubkey, (vote_account, vote_state.commission, 0, false));
|
|
||||||
delegations
|
|
||||||
.into_par_iter()
|
|
||||||
.map(move |delegation| (vote_pubkey, Arc::clone(&vote_state), delegation))
|
|
||||||
},
|
|
||||||
);
|
|
||||||
|
|
||||||
let mut m = Measure::start("redeem_rewards");
|
|
||||||
let stake_rewards: StakeRewards = thread_pool.install(|| {
|
|
||||||
stake_delegation_iterator
|
|
||||||
.filter_map(|(vote_pubkey, vote_state, (stake_pubkey, stake_account))| {
|
|
||||||
// curry closure to add the contextual stake_pubkey
|
|
||||||
let reward_calc_tracer = reward_calc_tracer.as_ref().map(|outer| {
|
|
||||||
// inner
|
|
||||||
move |inner_event: &_| {
|
|
||||||
outer(&RewardCalculationEvent::Staking(&stake_pubkey, inner_event))
|
|
||||||
}
|
|
||||||
});
|
|
||||||
let (mut stake_account, stake_state) =
|
|
||||||
<(AccountSharedData, StakeState)>::from(stake_account);
|
|
||||||
let redeemed = stake_state::redeem_rewards(
|
|
||||||
rewarded_epoch,
|
|
||||||
stake_state,
|
|
||||||
&mut stake_account,
|
|
||||||
&vote_state,
|
|
||||||
&point_value,
|
|
||||||
Some(&stake_history),
|
|
||||||
reward_calc_tracer.as_ref(),
|
|
||||||
credits_auto_rewind,
|
|
||||||
);
|
|
||||||
if let Ok((stakers_reward, voters_reward)) = redeemed {
|
|
||||||
// track voter rewards
|
|
||||||
if let Some((
|
|
||||||
_vote_account,
|
|
||||||
_commission,
|
|
||||||
vote_rewards_sum,
|
|
||||||
vote_needs_store,
|
|
||||||
)) = vote_account_rewards.get_mut(&vote_pubkey).as_deref_mut()
|
|
||||||
{
|
|
||||||
*vote_needs_store = true;
|
|
||||||
*vote_rewards_sum = vote_rewards_sum.saturating_add(voters_reward);
|
|
||||||
}
|
|
||||||
|
|
||||||
let post_balance = stake_account.lamports();
|
|
||||||
return Some(StakeReward {
|
|
||||||
stake_pubkey,
|
|
||||||
stake_reward_info: RewardInfo {
|
|
||||||
reward_type: RewardType::Staking,
|
|
||||||
lamports: i64::try_from(stakers_reward).unwrap(),
|
|
||||||
post_balance,
|
|
||||||
commission: Some(vote_state.commission),
|
|
||||||
},
|
|
||||||
stake_account,
|
|
||||||
});
|
|
||||||
} else {
|
|
||||||
debug!(
|
|
||||||
"stake_state::redeem_rewards() failed for {}: {:?}",
|
|
||||||
stake_pubkey, redeemed
|
|
||||||
);
|
|
||||||
}
|
|
||||||
None
|
|
||||||
})
|
|
||||||
.collect()
|
|
||||||
});
|
|
||||||
m.stop();
|
|
||||||
metrics.redeem_rewards_us += m.as_us();
|
|
||||||
|
|
||||||
self.store_stake_accounts(&stake_rewards, metrics);
|
|
||||||
let vote_rewards = self.store_vote_accounts(vote_account_rewards, metrics);
|
|
||||||
self.update_reward_history(stake_rewards, vote_rewards);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn load_vote_and_stake_accounts(
|
fn load_vote_and_stake_accounts(
|
||||||
|
@ -3059,6 +2987,96 @@ impl Bank {
|
||||||
(points > 0).then_some(PointValue { rewards, points })
|
(points > 0).then_some(PointValue { rewards, points })
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn redeem_rewards(
|
||||||
|
&self,
|
||||||
|
vote_with_stake_delegations_map: DashMap<Pubkey, VoteWithStakeDelegations>,
|
||||||
|
rewarded_epoch: Epoch,
|
||||||
|
point_value: PointValue,
|
||||||
|
credits_auto_rewind: bool,
|
||||||
|
stake_history: &StakeHistory,
|
||||||
|
thread_pool: &ThreadPool,
|
||||||
|
reward_calc_tracer: Option<impl RewardCalcTracer>,
|
||||||
|
metrics: &mut RewardsMetrics,
|
||||||
|
) -> (VoteRewards, StakeRewards) {
|
||||||
|
let vote_account_rewards: VoteRewards =
|
||||||
|
DashMap::with_capacity(vote_with_stake_delegations_map.len());
|
||||||
|
let stake_delegation_iterator = vote_with_stake_delegations_map.into_par_iter().flat_map(
|
||||||
|
|(
|
||||||
|
vote_pubkey,
|
||||||
|
VoteWithStakeDelegations {
|
||||||
|
vote_state,
|
||||||
|
vote_account,
|
||||||
|
delegations,
|
||||||
|
},
|
||||||
|
)| {
|
||||||
|
vote_account_rewards
|
||||||
|
.insert(vote_pubkey, (vote_account, vote_state.commission, 0, false));
|
||||||
|
delegations
|
||||||
|
.into_par_iter()
|
||||||
|
.map(move |delegation| (vote_pubkey, Arc::clone(&vote_state), delegation))
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|
||||||
|
let (stake_rewards, measure) = measure!(thread_pool.install(|| {
|
||||||
|
stake_delegation_iterator
|
||||||
|
.filter_map(|(vote_pubkey, vote_state, (stake_pubkey, stake_account))| {
|
||||||
|
// curry closure to add the contextual stake_pubkey
|
||||||
|
let reward_calc_tracer = reward_calc_tracer.as_ref().map(|outer| {
|
||||||
|
// inner
|
||||||
|
move |inner_event: &_| {
|
||||||
|
outer(&RewardCalculationEvent::Staking(&stake_pubkey, inner_event))
|
||||||
|
}
|
||||||
|
});
|
||||||
|
let (mut stake_account, stake_state) =
|
||||||
|
<(AccountSharedData, StakeState)>::from(stake_account);
|
||||||
|
let redeemed = stake_state::redeem_rewards(
|
||||||
|
rewarded_epoch,
|
||||||
|
stake_state,
|
||||||
|
&mut stake_account,
|
||||||
|
&vote_state,
|
||||||
|
&point_value,
|
||||||
|
Some(stake_history),
|
||||||
|
reward_calc_tracer.as_ref(),
|
||||||
|
credits_auto_rewind,
|
||||||
|
);
|
||||||
|
if let Ok((stakers_reward, voters_reward)) = redeemed {
|
||||||
|
// track voter rewards
|
||||||
|
if let Some((
|
||||||
|
_vote_account,
|
||||||
|
_commission,
|
||||||
|
vote_rewards_sum,
|
||||||
|
vote_needs_store,
|
||||||
|
)) = vote_account_rewards.get_mut(&vote_pubkey).as_deref_mut()
|
||||||
|
{
|
||||||
|
*vote_needs_store = true;
|
||||||
|
*vote_rewards_sum = vote_rewards_sum.saturating_add(voters_reward);
|
||||||
|
}
|
||||||
|
|
||||||
|
let post_balance = stake_account.lamports();
|
||||||
|
return Some(StakeReward {
|
||||||
|
stake_pubkey,
|
||||||
|
stake_reward_info: RewardInfo {
|
||||||
|
reward_type: RewardType::Staking,
|
||||||
|
lamports: i64::try_from(stakers_reward).unwrap(),
|
||||||
|
post_balance,
|
||||||
|
commission: Some(vote_state.commission),
|
||||||
|
},
|
||||||
|
stake_account,
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
debug!(
|
||||||
|
"stake_state::redeem_rewards() failed for {}: {:?}",
|
||||||
|
stake_pubkey, redeemed
|
||||||
|
);
|
||||||
|
}
|
||||||
|
None
|
||||||
|
})
|
||||||
|
.collect()
|
||||||
|
}));
|
||||||
|
metrics.redeem_rewards_us += measure.as_us();
|
||||||
|
(vote_account_rewards, stake_rewards)
|
||||||
|
}
|
||||||
|
|
||||||
fn store_stake_accounts(&self, stake_rewards: &[StakeReward], metrics: &mut RewardsMetrics) {
|
fn store_stake_accounts(&self, stake_rewards: &[StakeReward], metrics: &mut RewardsMetrics) {
|
||||||
// store stake account even if stake_reward is 0
|
// store stake account even if stake_reward is 0
|
||||||
// because credits observed has changed
|
// because credits observed has changed
|
||||||
|
|
Loading…
Reference in New Issue