Skip to content

Commit 78a5600

Browse files
committed
PeerReputationManager always tries to load in the constructor
1 parent c56321e commit 78a5600

2 files changed

Lines changed: 31 additions & 34 deletions

File tree

dash-spv/src/network/manager.rs

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -81,11 +81,7 @@ impl PeerNetworkManager {
8181

8282
let peer_store = PersistentPeerStorage::open(data_dir.clone()).await?;
8383

84-
let mut reputation_manager = PeerReputationManager::default();
85-
86-
if let Err(e) = reputation_manager.load_from_storage(&peer_store).await {
87-
log::warn!("Failed to load peer reputation data: {}", e);
88-
}
84+
let reputation_manager = PeerReputationManager::load_or_new(&peer_store).await;
8985

9086
// Determine exclusive mode: either explicitly requested or peers were provided
9187
let exclusive_mode = config.restrict_to_configured_peers || !config.peers.is_empty();

dash-spv/src/network/reputation.rs

Lines changed: 30 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -189,12 +189,28 @@ impl PeerReputation {
189189
}
190190
}
191191

192-
#[derive(Default)]
193192
pub struct PeerReputationManager {
194193
reputations: HashMap<SocketAddr, PeerReputation>,
195194
}
196195

197196
impl PeerReputationManager {
197+
pub async fn load_or_new(storage: &PersistentPeerStorage) -> Self {
198+
let mut reputations =
199+
storage.load_peers_reputation().await.unwrap_or_else(|_| HashMap::new());
200+
201+
log::info!("Loaded reputation data for {} peers", reputations.len());
202+
203+
for (_, reputation) in reputations.iter_mut() {
204+
if reputation.ban_count > 0 {
205+
reputation.score = reputation.score.max(50); // Start with higher score for previously banned peers
206+
}
207+
}
208+
209+
Self {
210+
reputations,
211+
}
212+
}
213+
198214
/// Update peer reputation
199215
pub async fn update_reputation(
200216
&mut self,
@@ -320,28 +336,6 @@ impl PeerReputationManager {
320336
) -> std::io::Result<()> {
321337
storage.save_peers_reputation(&self.reputations).await.map_err(std::io::Error::other)
322338
}
323-
324-
/// Load reputation data from persistent storage
325-
pub async fn load_from_storage(
326-
&mut self,
327-
storage: &PersistentPeerStorage,
328-
) -> std::io::Result<()> {
329-
let data = storage.load_peers_reputation().await.map_err(std::io::Error::other)?;
330-
log::info!("Loaded reputation data for {} peers", data.len());
331-
332-
let reputations = &mut self.reputations;
333-
334-
for (addr, mut reputation) in data {
335-
// Apply initial decay based on ban count
336-
if reputation.ban_count > 0 {
337-
reputation.score = reputation.score.max(50); // Start with higher score for previously banned peers
338-
}
339-
340-
reputations.insert(addr, reputation);
341-
}
342-
343-
Ok(())
344-
}
345339
}
346340

347341
#[cfg(test)]
@@ -351,9 +345,17 @@ mod tests {
351345
use super::*;
352346
use std::net::SocketAddr;
353347

348+
async fn build_peer_reputation_manager() -> PeerReputationManager {
349+
let temp_dir = tempfile::TempDir::new().unwrap();
350+
let peer_storage = PersistentPeerStorage::open(temp_dir.path())
351+
.await
352+
.expect("Failed to open PersistentPeerStorage");
353+
PeerReputationManager::load_or_new(&peer_storage).await
354+
}
355+
354356
#[tokio::test]
355357
async fn test_basic_reputation_operations() {
356-
let mut manager = PeerReputationManager::default();
358+
let mut manager = build_peer_reputation_manager().await;
357359
let peer: SocketAddr = "127.0.0.1:8333".parse().unwrap();
358360

359361
// Initial score should be 0
@@ -367,7 +369,7 @@ mod tests {
367369

368370
#[tokio::test]
369371
async fn test_banning_mechanism() {
370-
let mut manager = PeerReputationManager::default();
372+
let mut manager = build_peer_reputation_manager().await;
371373
let peer: SocketAddr = "192.168.1.1:8333".parse().unwrap();
372374

373375
// Accumulate misbehavior
@@ -388,7 +390,7 @@ mod tests {
388390

389391
#[tokio::test]
390392
async fn test_reputation_persistence() {
391-
let mut manager = PeerReputationManager::default();
393+
let mut manager = build_peer_reputation_manager().await;
392394
let peer1: SocketAddr = "10.0.0.1:8333".parse().unwrap();
393395
let peer2: SocketAddr = "10.0.0.2:8333".parse().unwrap();
394396

@@ -407,8 +409,7 @@ mod tests {
407409
.expect("Failed to open PersistentPeerStorage");
408410
manager.save_to_storage(&peer_storage).await.unwrap();
409411

410-
let mut new_manager = PeerReputationManager::default();
411-
new_manager.load_from_storage(&peer_storage).await.unwrap();
412+
let new_manager = PeerReputationManager::load_or_new(&peer_storage).await;
412413

413414
// Verify scores were preserved
414415
assert_eq!(new_manager.reputations.get(&peer1).expect("Peer not found").score, -10);
@@ -417,7 +418,7 @@ mod tests {
417418

418419
#[tokio::test]
419420
async fn test_peer_selection() {
420-
let mut manager = PeerReputationManager::default();
421+
let mut manager = build_peer_reputation_manager().await;
421422

422423
let good_peer: SocketAddr = "1.1.1.1:8333".parse().unwrap();
423424
let neutral_peer: SocketAddr = "2.2.2.2:8333".parse().unwrap();

0 commit comments

Comments
 (0)