X-Git-Url: http://git.bitcoin.ninja/index.cgi?a=blobdiff_plain;f=src%2Fmain.rs;h=5c7e506a18ba5fa7ba016b77ac9a4874be5afc4f;hb=a823c0486de0cdefd1742adb953cb1e5f1ab7e5c;hp=ae0bb5b833ce37510b099072bd97068ac7bac532;hpb=894cf32d90308efbf7af5339677d822d27633bc3;p=dnsseed-rust diff --git a/src/main.rs b/src/main.rs index ae0bb5b..5c7e506 100644 --- a/src/main.rs +++ b/src/main.rs @@ -138,15 +138,17 @@ pub fn scan_node(scan_time: Instant, node: SocketAddr, manual: bool) { state_lock.recvd_addrs = false; return future::err(()); } - if !state_lock.recvd_addrs { - if let Err(_) = write.try_send(NetworkMessage::GetData(vec![Inventory { - inv_type: InvType::WitnessBlock, - hash: state_lock.request.1, - }])) { - return future::err(()); + if addrs.len() > 10 { + if !state_lock.recvd_addrs { + if let Err(_) = write.try_send(NetworkMessage::GetData(vec![Inventory { + inv_type: InvType::WitnessBlock, + hash: state_lock.request.1, + }])) { + return future::err(()); + } } + state_lock.recvd_addrs = true; } - state_lock.recvd_addrs = true; unsafe { DATA_STORE.as_ref().unwrap() }.add_fresh_nodes(&addrs); }, NetworkMessage::Block(block) => { @@ -169,7 +171,7 @@ pub fn scan_node(scan_time: Instant, node: SocketAddr, manual: bool) { let store = unsafe { DATA_STORE.as_ref().unwrap() }; printer.set_stat(Stat::ConnectionClosed); - let state_lock = final_peer_state.lock().unwrap(); + let mut state_lock = final_peer_state.lock().unwrap(); if state_lock.recvd_version && state_lock.recvd_verack && state_lock.recvd_addrs && state_lock.recvd_block { let old_state = store.set_node_state(node, AddressState::Good, state_lock.node_services); @@ -178,10 +180,17 @@ pub fn scan_node(scan_time: Instant, node: SocketAddr, manual: bool) { } } else { assert!(state_lock.fail_reason != AddressState::Good); + if state_lock.fail_reason == AddressState::TimeoutDuringRequest && state_lock.recvd_version && state_lock.recvd_verack { + if !state_lock.recvd_addrs { + state_lock.fail_reason = AddressState::TimeoutAwaitingAddr; + } else if !state_lock.recvd_block { + state_lock.fail_reason = AddressState::TimeoutAwaitingBlock; + } + } let old_state = store.set_node_state(node, state_lock.fail_reason, 0); if (manual || old_state != state_lock.fail_reason) && state_lock.fail_reason == AddressState::TimeoutDuringRequest { - printer.add_line(format!("Updating {} from {} to Timeout During Request (ver: {}, vack: {}, addr: {}, block: {})", - node, old_state.to_str(), state_lock.recvd_version, state_lock.recvd_verack, state_lock.recvd_addrs, state_lock.recvd_block), true); + printer.add_line(format!("Updating {} from {} to Timeout During Request (ver: {}, vack: {})", + node, old_state.to_str(), state_lock.recvd_version, state_lock.recvd_verack), true); } else if manual || (old_state != state_lock.fail_reason && state_lock.msg.0 != "" && state_lock.msg.1) { printer.add_line(format!("Updating {} from {} to {} {}", node, old_state.to_str(), state_lock.fail_reason.to_str(), &state_lock.msg.0), state_lock.msg.1); } @@ -202,10 +211,13 @@ fn poll_dnsseeds() { } printer.add_line(format!("Added {} new addresses from other DNS seeds", new_addrs), false); Delay::new(Instant::now() + Duration::from_secs(60)).then(|_| { - if !START_SHUTDOWN.load(Ordering::Relaxed) { - poll_dnsseeds(); - } - future::ok(()) + let store = unsafe { DATA_STORE.as_ref().unwrap() }; + store.save_data().then(|_| { + if !START_SHUTDOWN.load(Ordering::Relaxed) { + poll_dnsseeds(); + } + future::ok(()) + }) }) })); } @@ -225,14 +237,11 @@ fn scan_net() { scan_node(iter_time, node, false); iter_time += per_iter_time; } - 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) { - scan_net(); - } - future::ok(()) - }) + Delay::new(cmp::max(iter_time, start_time + Duration::from_secs(1))).then(|_| { + if !START_SHUTDOWN.load(Ordering::Relaxed) { + scan_net(); + } + future::ok(()) }) })); }