Never run the scan loop more than once every 15 seconds
[dnsseed-rust] / src / datastore.rs
index 4782027e8736eb78c6956ab011f7b1dae690b368..18aa0e68d067509a71ed992ca791b7b533c656db 100644 (file)
@@ -315,11 +315,11 @@ impl Store {
                }
        }
 
-       pub fn set_node_state(&self, addr: SocketAddr, state: AddressState, services: u64) -> bool {
+       pub fn set_node_state(&self, addr: SocketAddr, state: AddressState, services: u64) -> AddressState {
                let mut nodes_lock = self.nodes.write().unwrap();
                let nodes = nodes_lock.borrow_mut();
                let state_ref = nodes.nodes_to_state.get_mut(&addr).unwrap();
-               let ret = state != state_ref.state;
+               let ret = state_ref.state;
                let now = Instant::now();
                if (state_ref.state == AddressState::Good || state_ref.state == AddressState::WasGood)
                                && state != AddressState::Good
@@ -481,12 +481,15 @@ impl Store {
        }
 
        pub fn get_next_scan_nodes(&self) -> Vec<SocketAddr> {
-               let mut res = Vec::with_capacity(600);
+               let results = 30 * self.get_u64(U64Setting::ConnsPerSec) as usize;
+               let per_bucket_results = results / (AddressState::get_count() as usize);
+               let mut res = Vec::with_capacity(results);
                let cur_time = Instant::now();
+
                let mut nodes = self.nodes.write().unwrap();
-               for (state, state_nodes) in nodes.state_next_scan.iter_mut() {
+               for (idx, (state, state_nodes)) in nodes.state_next_scan.iter_mut().enumerate() {
                        let cmp_time = cur_time - Duration::from_secs(self.get_u64(U64Setting::RescanInterval(*state)));
-                       let split_point = cmp::min(cmp::min(600 - res.len(), 60),
+                       let split_point = cmp::min(cmp::min(results - res.len(), results - (per_bucket_results * (AddressState::get_count() as usize - idx))),
                                        state_nodes.binary_search_by(|a| a.0.cmp(&cmp_time)).unwrap_or_else(|idx| idx));
                        let mut new_nodes = state_nodes.split_off(split_point);
                        mem::swap(&mut new_nodes, state_nodes);