From f28da4ad743e66d552e1bda63dd04ba5a9c77d12 Mon Sep 17 00:00:00 2001 From: musitdev Date: Fri, 29 Sep 2023 14:49:49 +0200 Subject: [PATCH] change vcote account that participate to the schedule filter. Filter on stake=0 --- stake_aggregate/src/leader_schedule.rs | 33 +++++++++++++++++--------- stake_aggregate/src/main.rs | 4 +++- stake_aggregate/src/votestore.rs | 9 +++---- 3 files changed, 30 insertions(+), 16 deletions(-) diff --git a/stake_aggregate/src/leader_schedule.rs b/stake_aggregate/src/leader_schedule.rs index 5d87d1d..bd76844 100644 --- a/stake_aggregate/src/leader_schedule.rs +++ b/stake_aggregate/src/leader_schedule.rs @@ -296,9 +296,6 @@ fn calculate_leader_schedule_from_stake_map( //log::trace!("calculate_leader_schedule_from_stake_map stake_map:{stake_map:?} current_epoch_info:{current_epoch_info:?}"); for storestake in stake_map.values() { - //log::info!("Program_accounts stake:{stake:#?}"); - // if is_stake_to_add(storestake.pubkey, &storestake.stake, ¤t_epoch_info) { - // Add the stake in this stake account to the total for the delegated-to vote account //get nodeid for vote account let Some(vote_account) = vote_map.get(&storestake.stake.voter_pubkey) else { log::warn!( @@ -312,10 +309,16 @@ fn calculate_leader_schedule_from_stake_map( //on testnet the vote account CY7gjryUPV6Pwbsn4aArkMBL7HSaRHB8sPZUvhw558Tm node_id:6YpwLjgXcMWAj29govWQr87kaAGKS7CnoqWsEDJE4h8P //hasn't vote since a long time but still return on RPC call get_voteaccounts. //the validator don't use it for leader schedule. - if vote_account.vote_data.root_slot.unwrap_or(0) - < current_epoch_info - .absolute_slot - .saturating_sub(ten_epoch_slot_long) + if vote_account.vote_data.root_slot.unwrap_or_else(|| { + //vote with no root_slot are added. They have just been activated and can have active stake- TODO TO TEST. + log::info!( + "leader schedule vote:{} with None root_slot, add it", + vote_account.pubkey + ); + current_epoch_info.absolute_slot + }) < current_epoch_info + .absolute_slot + .saturating_sub(ten_epoch_slot_long) { log::warn!("Vote account:{} nodeid:{} that hasn't vote since 10 epochs. Stake for account:{:?}. Remove leader_schedule." , storestake.stake.voter_pubkey @@ -324,14 +327,22 @@ fn calculate_leader_schedule_from_stake_map( , storestake.stake.stake(current_epoch_info.epoch, stake_history, Some(0)), ); } else { - *(stakes - .entry(vote_account.vote_data.node_pubkey) - .or_insert(0)) += storestake + let effective_stake = storestake .stake //TODO us the right reduce_stake_warmup_cooldown_epoch value from validator feature. .stake(current_epoch_info.epoch, stake_history, Some(0)); + //only vote account with positive stake are use for the schedule. + if effective_stake > 0 { + *(stakes + .entry(vote_account.vote_data.node_pubkey) + .or_insert(0)) += effective_stake; + } else { + log::info!( + "leader schedule vote:{} with 0 effective vote", + storestake.stake.voter_pubkey + ); + } } - // } } let mut schedule_stakes: Vec<(Pubkey, u64)> = vec![]; diff --git a/stake_aggregate/src/main.rs b/stake_aggregate/src/main.rs index 9fc7b4b..3d11405 100644 --- a/stake_aggregate/src/main.rs +++ b/stake_aggregate/src/main.rs @@ -395,9 +395,11 @@ async fn run_loop(mut client: GeyserGrpcClient) -> anyhow::Re } } solana_sdk::vote::program::ID => { + log::info!("Geyser notif VOTE account:{}", account); + let account_pubkey = account.pubkey; //process vote accout notification if let Err(err) = votestore.add_vote(account, current_epoch_state.current_epoch_end_slot()) { - log::warn!("Can't add new stake from account data err:{}", err); + log::warn!("Can't add new stake from account data err:{} account:{}", err, account_pubkey); continue; } } diff --git a/stake_aggregate/src/votestore.rs b/stake_aggregate/src/votestore.rs index 3dae074..e5eb58a 100644 --- a/stake_aggregate/src/votestore.rs +++ b/stake_aggregate/src/votestore.rs @@ -164,10 +164,11 @@ fn vote_map_insert_vote(map: &mut VoteMap, vote_account: Pubkey, vote_data: Stor match map.entry(vote_account) { std::collections::hash_map::Entry::Occupied(occupied) => { let voteacc = occupied.into_mut(); // <-- get mut reference to existing value - if voteacc.last_update_slot < vote_data.last_update_slot { - log::trace!( - "Vote updated for: {vote_account} node_id:{}", - vote_data.vote_data.node_pubkey + if voteacc.last_update_slot <= vote_data.last_update_slot { + log::info!( + "Vote updated for: {vote_account} node_id:{} root_slot:{:?}", + vote_data.vote_data.node_pubkey, + vote_data.vote_data.root_slot, ); *voteacc = vote_data; }