Never run the scan loop more than once every 15 seconds
[dnsseed-rust] / src / datastore.rs
index ba984d23ed167e96d84f786b1469ec73f1ddcd3f..18aa0e68d067509a71ed992ca791b7b533c656db 100644 (file)
@@ -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);