Move peer db writes to eth2 libp2p (#2724)

## Issue Addressed
Part of a bigger effort to make the network globals read only. This moves all writes to the `PeerDB` to the `eth2_libp2p` crate. Limiting writes to the peer manager is a slightly more complicated issue for a next PR, to keep things reviewable.

## Proposed Changes
- Make the peers field in the globals a private field.
- Allow mutable access to the peers field to `eth2_libp2p` for now.
- Add a new network message to update the sync state.

Co-authored-by: Age Manning <Age@AgeManning.com>
This commit is contained in:
Divma
2021-11-19 04:42:31 +00:00
parent 31386277c3
commit 53562010ec
16 changed files with 139 additions and 154 deletions

View File

@@ -143,7 +143,7 @@ impl<TSpec: EthSpec> PeerManager<TSpec> {
/// This will send a goodbye and disconnect the peer if it is connected or dialing.
pub fn goodbye_peer(&mut self, peer_id: &PeerId, reason: GoodbyeReason, source: ReportSource) {
// Update the sync status if required
if let Some(info) = self.network_globals.peers.write().peer_info_mut(peer_id) {
if let Some(info) = self.network_globals.peers_mut().peer_info_mut(peer_id) {
debug!(self.log, "Sending goodbye to peer"; "peer_id" => %peer_id, "reason" => %reason, "score" => %info.score());
if matches!(reason, GoodbyeReason::IrrelevantNetwork) {
info.update_sync_status(SyncStatus::IrrelevantPeer);
@@ -165,8 +165,7 @@ impl<TSpec: EthSpec> PeerManager<TSpec> {
) {
let action = self
.network_globals
.peers
.write()
.peers_mut()
.report_peer(peer_id, action, source);
self.handle_score_action(peer_id, action, reason);
}
@@ -264,14 +263,13 @@ impl<TSpec: EthSpec> PeerManager<TSpec> {
if (min_ttl.is_some()
&& connected_or_dialing + to_dial_peers.len() < self.max_priority_peers()
|| connected_or_dialing + to_dial_peers.len() < self.max_peers())
&& self.network_globals.peers.read().should_dial(&peer_id)
&& self.network_globals.peers().should_dial(&peer_id)
{
// This should be updated with the peer dialing. In fact created once the peer is
// dialed
if let Some(min_ttl) = min_ttl {
self.network_globals
.peers
.write()
.peers_mut()
.update_min_ttl(&peer_id, min_ttl);
}
to_dial_peers.push(peer_id);
@@ -341,11 +339,11 @@ impl<TSpec: EthSpec> PeerManager<TSpec> {
///
/// This is used to determine if we should accept incoming connections.
pub fn ban_status(&self, peer_id: &PeerId) -> BanResult {
self.network_globals.peers.read().ban_status(peer_id)
self.network_globals.peers().ban_status(peer_id)
}
pub fn is_connected(&self, peer_id: &PeerId) -> bool {
self.network_globals.peers.read().is_connected(peer_id)
self.network_globals.peers().is_connected(peer_id)
}
/// Reports whether the peer limit is reached in which case we stop allowing new incoming
@@ -356,7 +354,7 @@ impl<TSpec: EthSpec> PeerManager<TSpec> {
/// Updates `PeerInfo` with `identify` information.
pub fn identify(&mut self, peer_id: &PeerId, info: &IdentifyInfo) {
if let Some(peer_info) = self.network_globals.peers.write().peer_info_mut(peer_id) {
if let Some(peer_info) = self.network_globals.peers_mut().peer_info_mut(peer_id) {
let previous_kind = peer_info.client().kind.clone();
let previous_listening_addresses =
peer_info.set_listening_addresses(info.listen_addrs.clone());
@@ -403,7 +401,7 @@ impl<TSpec: EthSpec> PeerManager<TSpec> {
direction: ConnectionDirection,
) {
let client = self.network_globals.client(peer_id);
let score = self.network_globals.peers.read().score(peer_id);
let score = self.network_globals.peers().score(peer_id);
debug!(self.log, "RPC Error"; "protocol" => %protocol, "err" => %err, "client" => %client,
"peer_id" => %peer_id, "score" => %score, "direction" => ?direction);
metrics::inc_counter_vec(
@@ -505,7 +503,7 @@ impl<TSpec: EthSpec> PeerManager<TSpec> {
/// A ping request has been received.
// NOTE: The behaviour responds with a PONG automatically
pub fn ping_request(&mut self, peer_id: &PeerId, seq: u64) {
if let Some(peer_info) = self.network_globals.peers.read().peer_info(peer_id) {
if let Some(peer_info) = self.network_globals.peers().peer_info(peer_id) {
// received a ping
// reset the to-ping timer for this peer
debug!(self.log, "Received a ping request"; "peer_id" => %peer_id, "seq_no" => seq);
@@ -542,7 +540,7 @@ impl<TSpec: EthSpec> PeerManager<TSpec> {
/// A PONG has been returned from a peer.
pub fn pong_response(&mut self, peer_id: &PeerId, seq: u64) {
if let Some(peer_info) = self.network_globals.peers.read().peer_info(peer_id) {
if let Some(peer_info) = self.network_globals.peers().peer_info(peer_id) {
// received a pong
// if the sequence number is unknown send update the meta data of the peer.
@@ -565,7 +563,7 @@ impl<TSpec: EthSpec> PeerManager<TSpec> {
/// Received a metadata response from a peer.
pub fn meta_data_response(&mut self, peer_id: &PeerId, meta_data: MetaData<TSpec>) {
if let Some(peer_info) = self.network_globals.peers.write().peer_info_mut(peer_id) {
if let Some(peer_info) = self.network_globals.peers_mut().peer_info_mut(peer_id) {
if let Some(known_meta_data) = &peer_info.meta_data() {
if *known_meta_data.seq_number() < *meta_data.seq_number() {
debug!(self.log, "Updating peer's metadata";
@@ -592,8 +590,7 @@ impl<TSpec: EthSpec> PeerManager<TSpec> {
pub(crate) fn update_gossipsub_scores(&mut self, gossipsub: &Gossipsub) {
let actions = self
.network_globals
.peers
.write()
.peers_mut()
.update_gossipsub_scores(self.target_peers, gossipsub);
for (peer_id, score_action) in actions {
@@ -633,11 +630,7 @@ impl<TSpec: EthSpec> PeerManager<TSpec> {
///
/// This is also called when dialing a peer fails.
fn inject_disconnect(&mut self, peer_id: &PeerId) {
let ban_operation = self
.network_globals
.peers
.write()
.inject_disconnect(peer_id);
let ban_operation = self.network_globals.peers_mut().inject_disconnect(peer_id);
if let Some(ban_operation) = ban_operation {
// The peer was awaiting a ban, continue to ban the peer.
@@ -663,7 +656,7 @@ impl<TSpec: EthSpec> PeerManager<TSpec> {
enr: Option<Enr>,
) -> bool {
{
let mut peerdb = self.network_globals.peers.write();
let mut peerdb = self.network_globals.peers_mut();
if !matches!(peerdb.ban_status(peer_id), BanResult::NotBanned) {
// don't connect if the peer is banned
error!(self.log, "Connection has been allowed to a banned peer"; "peer_id" => %peer_id);
@@ -700,8 +693,7 @@ impl<TSpec: EthSpec> PeerManager<TSpec> {
// Increment the PEERS_PER_CLIENT metric
if let Some(kind) = self
.network_globals
.peers
.read()
.peers()
.peer_info(peer_id)
.map(|peer_info| peer_info.client().kind.clone())
{
@@ -720,8 +712,7 @@ impl<TSpec: EthSpec> PeerManager<TSpec> {
self.events
.push(PeerManagerEvent::DisconnectPeer(peer_id, reason));
self.network_globals
.peers
.write()
.peers_mut()
.notify_disconnecting(&peer_id, false);
}
@@ -737,8 +728,7 @@ impl<TSpec: EthSpec> PeerManager<TSpec> {
.filter_map(|(k, v)| {
if self
.network_globals
.peers
.read()
.peers()
.good_peers_on_subnet(Subnet::SyncCommittee(*k))
.count()
< TARGET_SUBNET_PEERS
@@ -787,7 +777,7 @@ impl<TSpec: EthSpec> PeerManager<TSpec> {
}
// Updates peer's scores and unban any peers if required.
let actions = self.network_globals.peers.write().update_scores();
let actions = self.network_globals.peers_mut().update_scores();
for (peer_id, action) in actions {
self.handle_score_action(&peer_id, action, None);
}
@@ -806,8 +796,7 @@ impl<TSpec: EthSpec> PeerManager<TSpec> {
let mut n_outbound_removed = 0;
for (peer_id, info) in self
.network_globals
.peers
.read()
.peers()
.worst_connected_peers()
.iter()
.filter(|(_, info)| !info.has_future_duty())
@@ -926,16 +915,14 @@ mod tests {
// Set the outbound-only peers to have the lowest score.
peer_manager
.network_globals
.peers
.write()
.peers_mut()
.peer_info_mut(&outbound_only_peer1)
.unwrap()
.add_to_score(-1.0);
peer_manager
.network_globals
.peers
.write()
.peers_mut()
.peer_info_mut(&outbound_only_peer2)
.unwrap()
.add_to_score(-2.0);
@@ -951,13 +938,11 @@ mod tests {
assert_eq!(peer_manager.network_globals.connected_or_dialing_peers(), 3);
assert!(peer_manager
.network_globals
.peers
.read()
.peers()
.is_connected(&outbound_only_peer1));
assert!(!peer_manager
.network_globals
.peers
.read()
.peers()
.is_connected(&outbound_only_peer2));
peer_manager.heartbeat();
@@ -986,8 +971,7 @@ mod tests {
);
peer_manager
.network_globals
.peers
.write()
.peers_mut()
.peer_info_mut(&(outbound_only_peer))
.unwrap()
.add_to_score(-1.0);
@@ -1027,29 +1011,25 @@ mod tests {
);
peer_manager
.network_globals
.peers
.write()
.peers_mut()
.peer_info_mut(&(inbound_only_peer1))
.unwrap()
.add_to_score(-19.8);
peer_manager
.network_globals
.peers
.write()
.peers_mut()
.peer_info_mut(&(outbound_only_peer1))
.unwrap()
.add_to_score(-19.8);
peer_manager
.network_globals
.peers
.write()
.peers_mut()
.peer_info_mut(&(inbound_only_peer1))
.unwrap()
.set_gossipsub_score(-85.0);
peer_manager
.network_globals
.peers
.write()
.peers_mut()
.peer_info_mut(&(outbound_only_peer1))
.unwrap()
.set_gossipsub_score(-85.0);
@@ -1087,15 +1067,13 @@ mod tests {
);
peer_manager
.network_globals
.peers
.write()
.peers_mut()
.peer_info_mut(&(inbound_only_peer1))
.unwrap()
.add_to_score(-19.9);
peer_manager
.network_globals
.peers
.write()
.peers_mut()
.peer_info_mut(&(inbound_only_peer1))
.unwrap()
.set_gossipsub_score(-85.0);