Kaynağa Gözat

net/seedsync_session: Use AtomicUsize for counting failed seed queries and return error.

parazyd 2 yıl önce
ebeveyn
işleme
974ab22b96
1 değiştirilmiş dosya ile 10 ekleme ve 6 silme
  1. 10 6
      src/net/session/seedsync_session.rs

+ 10 - 6
src/net/session/seedsync_session.rs

@@ -37,7 +37,10 @@
 //! function. This runs the version exchange protocol, stores the channel in the
 //! p2p list of channels, and subscribes to a stop signal.
 
-use std::sync::{Arc, Weak};
+use std::sync::{
+    atomic::{AtomicUsize, Ordering},
+    Arc, Weak,
+};
 
 use async_trait::async_trait;
 use futures::future::join_all;
@@ -52,7 +55,7 @@ use super::{
     },
     Session, SessionBitFlag, SESSION_SEED,
 };
-use crate::Result;
+use crate::{Error, Result};
 
 pub type SeedSyncSessionPtr = Arc<SeedSyncSession>;
 
@@ -86,11 +89,12 @@ impl SeedSyncSession {
         let executor = self.p2p().executor();
         let mut tasks = Vec::with_capacity(settings.seeds.len());
 
-        let mut failed = 0;
+        let failed = Arc::new(AtomicUsize::new(0));
 
         for (i, seed) in settings.seeds.iter().enumerate() {
             let ex_ = executor.clone();
             let self_ = self.clone();
+            let failed_ = failed.clone();
 
             tasks.push(async move {
                 if let Err(e) = self_.clone().start_seed(i, seed.clone(), ex_.clone()).await {
@@ -98,7 +102,7 @@ impl SeedSyncSession {
                         target: "net::session::seedsync_session",
                         "[P2P] Seed #{} connection failed: {}", i, e,
                     );
-                    failed += 1;
+                    failed_.fetch_add(1, Ordering::SeqCst);
                 }
             });
         }
@@ -106,8 +110,8 @@ impl SeedSyncSession {
         // Poll concurrently
         join_all(tasks).await;
 
-        if failed == settings.seeds.len() {
-            error!(target: "net::session::seedsync_session", "[P2P] Failed to connect to any seed");
+        if failed.load(Ordering::SeqCst) == settings.seeds.len() {
+            return Err(Error::ConnectFailed)
         }
 
         // Seed process complete