Skip to content

Commit

Permalink
Remove Score Ord, PartialOrd, Eq and PartialEq impls (#6420)
Browse files Browse the repository at this point in the history
* drop score Ord, PartialOrd, Eq and PartialEq impls

and impl total_cmp instead

* Revert "Fix test failure on Rust v1.81 (#6407)"

This reverts commit 8a085fc.

* reverse in the compare function

* lint mdfiles
  • Loading branch information
jxs authored Sep 25, 2024
1 parent 2792705 commit 50d8375
Show file tree
Hide file tree
Showing 4 changed files with 31 additions and 41 deletions.
14 changes: 2 additions & 12 deletions beacon_node/lighthouse_network/src/peer_manager/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2340,16 +2340,6 @@ mod tests {
gossipsub_score: f64,
}

// generate an arbitrary f64 while preventing NaN values
fn arbitrary_f64(g: &mut Gen) -> f64 {
loop {
let val = f64::arbitrary(g);
if !val.is_nan() {
return val;
}
}
}

impl Arbitrary for PeerCondition {
fn arbitrary(g: &mut Gen) -> Self {
let attestation_net_bitfield = {
Expand All @@ -2375,9 +2365,9 @@ mod tests {
outgoing: bool::arbitrary(g),
attestation_net_bitfield,
sync_committee_net_bitfield,
score: arbitrary_f64(g),
score: f64::arbitrary(g),
trusted: bool::arbitrary(g),
gossipsub_score: arbitrary_f64(g),
gossipsub_score: f64::arbitrary(g),
}
}
}
Expand Down
22 changes: 8 additions & 14 deletions beacon_node/lighthouse_network/src/peer_manager/peerdb.rs
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
use crate::discovery::enr::PEERDAS_CUSTODY_SUBNET_COUNT_ENR_KEY;
use crate::discovery::{peer_id_to_node_id, CombinedKey};
use crate::{metrics, multiaddr::Multiaddr, types::Subnet, Enr, EnrExt, Gossipsub, PeerId};
use itertools::Itertools;
use peer_info::{ConnectionDirection, PeerConnectionStatus, PeerInfo};
use rand::seq::SliceRandom;
use score::{PeerAction, ReportSource, Score, ScoreState};
use slog::{crit, debug, error, trace, warn};
use std::net::IpAddr;
Expand Down Expand Up @@ -290,15 +290,11 @@ impl<E: EthSpec> PeerDB<E> {
/// Returns a vector of all connected peers sorted by score beginning with the worst scores.
/// Ties get broken randomly.
pub fn worst_connected_peers(&self) -> Vec<(&PeerId, &PeerInfo<E>)> {
let mut connected = self
.peers
self.peers
.iter()
.filter(|(_, info)| info.is_connected())
.collect::<Vec<_>>();

connected.shuffle(&mut rand::thread_rng());
connected.sort_by_key(|(_, info)| info.score());
connected
.sorted_by(|(_, info_a), (_, info_b)| info_a.score().total_cmp(info_b.score(), false))
.collect::<Vec<_>>()
}

/// Returns a vector containing peers (their ids and info), sorted by
Expand All @@ -307,13 +303,11 @@ impl<E: EthSpec> PeerDB<E> {
where
F: Fn(&PeerInfo<E>) -> bool,
{
let mut by_status = self
.peers
self.peers
.iter()
.filter(|(_, info)| is_status(info))
.collect::<Vec<_>>();
by_status.sort_by_key(|(_, info)| info.score());
by_status.into_iter().rev().collect()
.sorted_by(|(_, info_a), (_, info_b)| info_a.score().total_cmp(info_b.score(), true))
.collect::<Vec<_>>()
}

/// Returns the peer with highest reputation that satisfies `is_status`
Expand All @@ -324,7 +318,7 @@ impl<E: EthSpec> PeerDB<E> {
self.peers
.iter()
.filter(|(_, info)| is_status(info))
.max_by_key(|(_, info)| info.score())
.max_by(|(_, info_a), (_, info_b)| info_a.score().total_cmp(info_b.score(), false))
.map(|(id, _)| id)
}

Expand Down
35 changes: 20 additions & 15 deletions beacon_node/lighthouse_network/src/peer_manager/peerdb/score.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
//! The scoring algorithms are currently experimental.
use crate::service::gossipsub_scoring_parameters::GREYLIST_THRESHOLD as GOSSIPSUB_GREYLIST_THRESHOLD;
use serde::Serialize;
use std::cmp::Ordering;
use std::sync::LazyLock;
use std::time::Instant;
use strum::AsRefStr;
Expand Down Expand Up @@ -260,7 +261,7 @@ impl RealScore {
}
}

#[derive(PartialEq, Clone, Debug, Serialize)]
#[derive(Clone, Debug, Serialize)]
pub enum Score {
Max,
Real(RealScore),
Expand Down Expand Up @@ -323,21 +324,25 @@ impl Score {
Self::Real(score) => score.is_good_gossipsub_peer(),
}
}
}

impl Eq for Score {}

impl PartialOrd for Score {
fn partial_cmp(&self, other: &Score) -> Option<std::cmp::Ordering> {
Some(self.cmp(other))
}
}

impl Ord for Score {
fn cmp(&self, other: &Score) -> std::cmp::Ordering {
self.score()
.partial_cmp(&other.score())
.unwrap_or(std::cmp::Ordering::Equal)
/// Instead of implementing `Ord` for `Score`, as we are underneath dealing with f64,
/// follow std convention and impl `Score::total_cmp` similar to `f64::total_cmp`.
pub fn total_cmp(&self, other: &Score, reverse: bool) -> Ordering {
match self.score().partial_cmp(&other.score()) {
Some(v) => {
// Only reverse when none of the items is NAN,
// so that NAN's are never considered.
if reverse {
v.reverse()
} else {
v
}
}
None if self.score().is_nan() && !other.score().is_nan() => Ordering::Less,
None if !self.score().is_nan() && other.score().is_nan() => Ordering::Greater,
// Both are NAN.
None => Ordering::Equal,
}
}
}

Expand Down
1 change: 1 addition & 0 deletions book/src/developers.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ Lighthouse currently uses the following ENR fields:
### Lighthouse Custom Fields

Lighthouse is currently using the following custom ENR fields.

| Field | Description |
| ---- | ---- |
| `quic` | The UDP port on which the QUIC transport is listening on IPv4 |
Expand Down

0 comments on commit 50d8375

Please sign in to comment.