Never run the scan loop more than once every 15 seconds
[dnsseed-rust] / src / main.rs
index ae38a5bc3e6845fcf3a658812f49233339673873..e040b95e7913ff1c51c7839a2d155a78c9490931 100644 (file)
@@ -4,7 +4,7 @@ mod peer;
 mod timeout_stream;
 mod datastore;
 
-use std::env;
+use std::{cmp, env};
 use std::collections::HashMap;
 use std::sync::{Arc, Mutex};
 use std::sync::atomic::{Ordering, AtomicBool};
@@ -33,6 +33,7 @@ static mut HEIGHT_MAP: Option<Box<Mutex<HashMap<u64, sha256d::Hash>>>> = None;
 static mut DATA_STORE: Option<Box<Store>> = None;
 static mut PRINTER: Option<Box<Printer>> = None;
 pub static START_SHUTDOWN: AtomicBool = AtomicBool::new(false);
+static SCANNING: AtomicBool = AtomicBool::new(false);
 
 struct PeerState {
        request: (u64, sha256d::Hash),
@@ -193,13 +194,14 @@ fn scan_net() {
                let store = unsafe { DATA_STORE.as_ref().unwrap() };
                let mut scan_nodes = store.get_next_scan_nodes();
                let per_iter_time = Duration::from_millis(1000 / store.get_u64(U64Setting::ConnsPerSec));
-               let mut iter_time = Instant::now();
+               let start_time = Instant::now();
+               let mut iter_time = start_time;
 
                for node in scan_nodes.drain(..) {
                        scan_node(iter_time, node);
                        iter_time += per_iter_time;
                }
-               Delay::new(iter_time).then(|_| {
+               Delay::new(cmp::max(iter_time, start_time + Duration::from_secs(15))).then(|_| {
                        let store = unsafe { DATA_STORE.as_ref().unwrap() };
                        store.save_data().then(|_| {
                                if !START_SHUTDOWN.load(Ordering::Relaxed) {
@@ -229,6 +231,9 @@ fn make_trusted_conn(trusted_sockaddr: SocketAddr) {
                                        starting_height = ver.start_height;
                                },
                                NetworkMessage::Verack => {
+                                       if let Err(_) = trusted_write.try_send(NetworkMessage::SendHeaders) {
+                                               return future::err(());
+                                       }
                                        if let Err(_) = trusted_write.try_send(NetworkMessage::GetHeaders(GetHeadersMessage {
                                                version: 70015,
                                                locator_hashes: vec![unsafe { HIGHEST_HEADER.as_ref().unwrap() }.lock().unwrap().0.clone()],
@@ -263,7 +268,9 @@ fn make_trusted_conn(trusted_sockaddr: SocketAddr) {
                                                        = (headers.last().unwrap().bitcoin_hash(), top_height);
                                                printer.set_stat(printer::Stat::HeaderCount(top_height));
                                                if top_height >= starting_height as u64 {
-                                                       scan_net();
+                                                       if !SCANNING.swap(true, Ordering::SeqCst) {
+                                                               scan_net();
+                                                       }
                                                }
                                        } else {
                                                // Wat? Lets start again...