Drop nodes mutex before shuffling result
authorMatt Corallo <git@bluematt.me>
Sun, 2 Jun 2019 09:56:54 +0000 (05:56 -0400)
committerMatt Corallo <git@bluematt.me>
Sun, 2 Jun 2019 09:56:54 +0000 (05:56 -0400)
src/datastore.rs

index fd776c70aca035c572744aec30c649cd1d631b58..e7bf99acbff027b77d97447c354ec3da0c0bd18f 100644 (file)
@@ -492,15 +492,17 @@ impl Store {
                let mut res = Vec::with_capacity(results);
                let cur_time = Instant::now();
 
-               let mut nodes = self.nodes.write().unwrap();
-               for (idx, state_nodes) in nodes.state_next_scan.iter_mut().enumerate() {
-                       let cmp_time = cur_time - Duration::from_secs(self.get_u64(U64Setting::RescanInterval(AddressState::from_num(idx as u8).unwrap())));
-                       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);
-                       for (_, node) in new_nodes.drain(..) {
-                               res.push(node);
+               {
+                       let mut nodes = self.nodes.write().unwrap();
+                       for (idx, state_nodes) in nodes.state_next_scan.iter_mut().enumerate() {
+                               let cmp_time = cur_time - Duration::from_secs(self.get_u64(U64Setting::RescanInterval(AddressState::from_num(idx as u8).unwrap())));
+                               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);
+                               for (_, node) in new_nodes.drain(..) {
+                                       res.push(node);
+                               }
                        }
                }
                res.shuffle(&mut thread_rng());