exempts node-instances from shred-version check (#19190)
Clusters are kept separate using the shred-versions obtained from contact-infos. However, this mechanism breaks if there are 2 instances of the same identity key running on different clusters, because then one of the two contact-infos have the right shred-version. If a node has the contact-info with the matching shred-version, then it will pass all associated crds values even if they belong to the other instance. So the shred-version check breaks. As a result we cannot support 2 instances of the same identity key running on different clusters. To prevent that, this commit is exempting node-instances from shred-version check so that they are always propagated across clusters and halt one of the running duplicate instances.
This commit is contained in:
parent
22674000bd
commit
140abec6ef
|
@ -2922,18 +2922,24 @@ fn filter_on_shred_version(
|
||||||
) -> Option<Protocol> {
|
) -> Option<Protocol> {
|
||||||
let filter_values = |from: &Pubkey, values: &mut Vec<CrdsValue>, skipped_counter: &Counter| {
|
let filter_values = |from: &Pubkey, values: &mut Vec<CrdsValue>, skipped_counter: &Counter| {
|
||||||
let num_values = values.len();
|
let num_values = values.len();
|
||||||
|
// Node-instances are always exempted from shred-version check so that:
|
||||||
|
// * their propagation across cluster is expedited.
|
||||||
|
// * prevent two running instances of the same identity key cross
|
||||||
|
// contaminate gossip between clusters.
|
||||||
if crds.get_shred_version(from) == Some(self_shred_version) {
|
if crds.get_shred_version(from) == Some(self_shred_version) {
|
||||||
// Retain values with the same shred-vesion, or those which are
|
|
||||||
// contact-info so that shred-versions can be updated.
|
|
||||||
values.retain(|value| match &value.data {
|
values.retain(|value| match &value.data {
|
||||||
|
// Allow contact-infos so that shred-versions are updated.
|
||||||
CrdsData::ContactInfo(_) => true,
|
CrdsData::ContactInfo(_) => true,
|
||||||
|
CrdsData::NodeInstance(_) => true,
|
||||||
|
// Only retain values with the same shred version.
|
||||||
_ => crds.get_shred_version(&value.pubkey()) == Some(self_shred_version),
|
_ => crds.get_shred_version(&value.pubkey()) == Some(self_shred_version),
|
||||||
})
|
})
|
||||||
} else {
|
} else {
|
||||||
// Only allow node to update its own contact info in case their
|
|
||||||
// shred-version changes.
|
|
||||||
values.retain(|value| match &value.data {
|
values.retain(|value| match &value.data {
|
||||||
|
// Allow node to update its own contact info in case their
|
||||||
|
// shred-version changes
|
||||||
CrdsData::ContactInfo(node) => node.id == *from,
|
CrdsData::ContactInfo(node) => node.id == *from,
|
||||||
|
CrdsData::NodeInstance(_) => true,
|
||||||
_ => false,
|
_ => false,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue