mirror of
https://github.com/sigp/lighthouse.git
synced 2026-03-14 18:32:42 +00:00
Subnet discovery fixes (#2095)
## Issue Addressed N/A ## Proposed Changes Fixes multiple issues related to discovering of subnet peers. 1. Subnet discovery retries after yielding no results 2. Metadata updates if peer send older metadata 3. peerdb stores the peer subscriptions from gossipsub
This commit is contained in:
@@ -285,6 +285,27 @@ impl<TSpec: EthSpec> PeerManager<TSpec> {
|
||||
self.status_peers.insert(peer_id.clone());
|
||||
}
|
||||
|
||||
/// Adds a gossipsub subscription to a peer in the peerdb.
|
||||
pub fn add_subscription(&self, peer_id: &PeerId, subnet_id: SubnetId) {
|
||||
if let Some(info) = self.network_globals.peers.write().peer_info_mut(peer_id) {
|
||||
info.subnets.insert(subnet_id);
|
||||
}
|
||||
}
|
||||
|
||||
/// Removes a gossipsub subscription to a peer in the peerdb.
|
||||
pub fn remove_subscription(&self, peer_id: &PeerId, subnet_id: SubnetId) {
|
||||
if let Some(info) = self.network_globals.peers.write().peer_info_mut(peer_id) {
|
||||
info.subnets.remove(&subnet_id);
|
||||
}
|
||||
}
|
||||
|
||||
/// Removes all gossipsub subscriptions to a peer in the peerdb.
|
||||
pub fn remove_all_subscriptions(&self, peer_id: &PeerId) {
|
||||
if let Some(info) = self.network_globals.peers.write().peer_info_mut(peer_id) {
|
||||
info.subnets = Default::default();
|
||||
}
|
||||
}
|
||||
|
||||
/* Notifications from the Swarm */
|
||||
|
||||
/// Updates the state of the peer as disconnected.
|
||||
@@ -541,6 +562,9 @@ impl<TSpec: EthSpec> PeerManager<TSpec> {
|
||||
} else {
|
||||
debug!(self.log, "Received old metadata";
|
||||
"peer_id" => %peer_id, "known_seq_no" => known_meta_data.seq_number, "new_seq_no" => meta_data.seq_number);
|
||||
// Updating metadata even in this case to prevent storing
|
||||
// incorrect `metadata.attnets` for a peer
|
||||
peer_info.meta_data = Some(meta_data);
|
||||
}
|
||||
} else {
|
||||
// we have no meta-data for this peer, update
|
||||
|
||||
@@ -38,6 +38,8 @@ pub struct PeerInfo<T: EthSpec> {
|
||||
/// The ENR subnet bitfield of the peer. This may be determined after it's initial
|
||||
/// connection.
|
||||
pub meta_data: Option<MetaData<T>>,
|
||||
/// Subnets the peer is connected to.
|
||||
pub subnets: HashSet<SubnetId>,
|
||||
/// The time we would like to retain this peer. After this time, the peer is no longer
|
||||
/// necessary.
|
||||
#[serde(skip)]
|
||||
@@ -60,6 +62,7 @@ impl<TSpec: EthSpec> Default for PeerInfo<TSpec> {
|
||||
connection_status: Default::default(),
|
||||
listening_addresses: Vec::new(),
|
||||
seen_addresses: HashSet::new(),
|
||||
subnets: HashSet::new(),
|
||||
sync_status: PeerSyncStatus::Unknown,
|
||||
meta_data: None,
|
||||
min_ttl: None,
|
||||
@@ -80,14 +83,19 @@ impl<T: EthSpec> PeerInfo<T> {
|
||||
}
|
||||
}
|
||||
|
||||
/// Returns if the peer is subscribed to a given `SubnetId`
|
||||
pub fn on_subnet(&self, subnet_id: SubnetId) -> bool {
|
||||
/// Returns if the peer is subscribed to a given `SubnetId` from the metadata attnets field.
|
||||
pub fn on_subnet_metadata(&self, subnet_id: SubnetId) -> bool {
|
||||
if let Some(meta_data) = &self.meta_data {
|
||||
return meta_data.attnets.get(*subnet_id as usize).unwrap_or(false);
|
||||
}
|
||||
false
|
||||
}
|
||||
|
||||
/// Returns if the peer is subscribed to a given `SubnetId` from the gossipsub subscriptions.
|
||||
pub fn on_subnet_gossipsub(&self, subnet_id: SubnetId) -> bool {
|
||||
self.subnets.contains(&subnet_id)
|
||||
}
|
||||
|
||||
/// Returns the seen IP addresses of the peer.
|
||||
pub fn seen_addresses<'a>(&'a self) -> impl Iterator<Item = IpAddr> + 'a {
|
||||
self.seen_addresses
|
||||
|
||||
@@ -246,7 +246,11 @@ impl<TSpec: EthSpec> PeerDB<TSpec> {
|
||||
self.peers
|
||||
.iter()
|
||||
.filter(move |(_, info)| {
|
||||
info.is_connected() && info.on_subnet(subnet_id) && info.is_good_gossipsub_peer()
|
||||
// We check both the metadata and gossipsub data as we only want to count long-lived subscribed peers
|
||||
info.is_connected()
|
||||
&& info.on_subnet_metadata(subnet_id)
|
||||
&& info.on_subnet_gossipsub(subnet_id)
|
||||
&& info.is_good_gossipsub_peer()
|
||||
})
|
||||
.map(|(peer_id, _)| peer_id)
|
||||
}
|
||||
@@ -357,7 +361,7 @@ impl<TSpec: EthSpec> PeerDB<TSpec> {
|
||||
let log = &self.log;
|
||||
self.peers.iter_mut()
|
||||
.filter(move |(_, info)| {
|
||||
info.is_connected() && info.on_subnet(subnet_id)
|
||||
info.is_connected() && info.on_subnet_metadata(subnet_id) && info.on_subnet_gossipsub(subnet_id)
|
||||
})
|
||||
.for_each(|(peer_id,info)| {
|
||||
if info.min_ttl.is_none() || Some(min_ttl) > info.min_ttl {
|
||||
|
||||
Reference in New Issue
Block a user