retains one node-instance per pubkey (#17187)
crds table retains up to 32 node-instance values per each pubkey. This is so because if there are multiple running instances of the same node, then we want gossip to propagate node-instance values associated with both instances, therefore the corresponding label/key includes the randomly generated token in addition to the pubkey: https://github.com/solana-labs/solana/blob/9c42a89a4/core/src/crds_value.rs#L448 https://github.com/solana-labs/solana/pull/14037 As a result, the number of such values per pubkey are effectively unbounded, requiring custom mitigations implemented in: https://github.com/solana-labs/solana/pull/14467 but still taking redundant extra memory and bandwidth. This commit instead retains only one node-instance per pubkey by extending crds values override logic. If a crds value is of type node-instance, it will always override an existing one with the same key if it has more recent starting timestamp (not wallclock). As a result, gossip will always propagate the node-instance with more recent timestamp. Since the check_duplicate logic will stop the node with older timestamp, this change should preserve existing functionality.
This commit is contained in:
@@ -454,10 +454,10 @@ fn retain_staked(values: &mut Vec<CrdsValue>, stakes: &HashMap<Pubkey, u64>) {
|
||||
// Otherwise unstaked voting nodes will show up with no version in
|
||||
// the various dashboards.
|
||||
CrdsData::Version(_) => true,
|
||||
CrdsData::NodeInstance(_) => true,
|
||||
CrdsData::LowestSlot(_, _)
|
||||
| CrdsData::AccountsHashes(_)
|
||||
| CrdsData::LegacyVersion(_)
|
||||
| CrdsData::NodeInstance(_)
|
||||
| CrdsData::DuplicateShred(_, _) => {
|
||||
let stake = stakes.get(&value.pubkey()).copied();
|
||||
stake.unwrap_or_default() >= MIN_STAKE_FOR_GOSSIP
|
||||
|
Reference in New Issue
Block a user