diff --git a/src/blockchain/chain.rs b/src/blockchain/chain.rs index 32dcc3b..717141d 100644 --- a/src/blockchain/chain.rs +++ b/src/blockchain/chain.rs @@ -7,7 +7,7 @@ use log::{debug, error, info, trace, warn}; use sqlite::{Connection, State, Statement}; use crate::{Block, Bytes, Keystore, Transaction, check_domain, get_domain_zone}; -use crate::blockchain::constants::*; +use crate::commons::constants::*; use crate::blockchain::enums::{BlockQuality, MineResult}; use crate::blockchain::enums::BlockQuality::*; use crate::blockchain::hash_utils::*; diff --git a/src/blockchain/mod.rs b/src/blockchain/mod.rs index 0d4431e..e3c55f8 100644 --- a/src/blockchain/mod.rs +++ b/src/blockchain/mod.rs @@ -1,12 +1,11 @@ +pub use block::Block; +pub use chain::Chain; +pub use transaction::Transaction; + pub mod transaction; pub mod block; pub mod chain; pub mod filter; -pub mod constants; pub mod hash_utils; pub mod enums; -pub use transaction::Transaction; -pub use block::Block; -pub use chain::Chain; -pub use constants::*; \ No newline at end of file diff --git a/src/blockchain/constants.rs b/src/commons/constants.rs similarity index 86% rename from src/blockchain/constants.rs rename to src/commons/constants.rs index 57ca10e..365e99c 100644 --- a/src/blockchain/constants.rs +++ b/src/commons/constants.rs @@ -13,4 +13,5 @@ pub const LOCKER_BLOCK_INTERVAL: u64 = 50; pub const FULL_BLOCKS_INTERVAL: i64 = 86400; // One day in seconds -pub const ZONE_MAX_LENGTH: usize = 10; \ No newline at end of file +pub const ZONE_MAX_LENGTH: usize = 10; +pub const MAX_RECONNECTS: u32 = 5; \ No newline at end of file diff --git a/src/commons/mod.rs b/src/commons/mod.rs index 830cb41..a196533 100644 --- a/src/commons/mod.rs +++ b/src/commons/mod.rs @@ -3,6 +3,9 @@ use rand::Rng; #[cfg(not(target_os = "macos"))] use thread_priority::*; +pub mod constants; +pub use constants::*; + /// Convert bytes array to HEX format pub fn to_hex(buf: &[u8]) -> String { let mut result = String::new(); @@ -111,4 +114,4 @@ mod test { assert!(!check_domain(".ab.c", true)); assert!(!check_domain("ab.c-", true)); } -} \ No newline at end of file +} diff --git a/src/keys.rs b/src/keys.rs index 7462b83..35d9a44 100644 --- a/src/keys.rs +++ b/src/keys.rs @@ -19,7 +19,7 @@ use serde::{Deserialize, Serialize}; use crate::blockchain::hash_utils::*; use crate::{Context, setup_miner_thread}; use crate::event::Event; -use crate::blockchain::KEYSTORE_DIFFICULTY; +use crate::commons::KEYSTORE_DIFFICULTY; use crate::bytes::Bytes; use blakeout::Blakeout; use self::crypto::digest::Digest; diff --git a/src/main.rs b/src/main.rs index d77508c..261db84 100644 --- a/src/main.rs +++ b/src/main.rs @@ -16,7 +16,7 @@ use simple_logger::SimpleLogger; use winapi::um::wincon::{ATTACH_PARENT_PROCESS, AttachConsole, FreeConsole}; use alfis::{Block, Bytes, Chain, Miner, Context, Network, Settings, dns_utils, Keystore}; -use alfis::blockchain::BLOCK_DIFFICULTY; +use alfis::commons::BLOCK_DIFFICULTY; #[cfg(feature = "webgui")] mod web_ui; diff --git a/src/miner.rs b/src/miner.rs index 85e8e7b..e28f3f7 100644 --- a/src/miner.rs +++ b/src/miner.rs @@ -10,7 +10,7 @@ use log::{debug, error, info, trace, warn}; use num_cpus; use crate::{Block, Bytes, Context, setup_miner_thread}; -use crate::blockchain::{CHAIN_VERSION, LOCKER_DIFFICULTY, KEYSTORE_DIFFICULTY}; +use crate::commons::{CHAIN_VERSION, LOCKER_DIFFICULTY, KEYSTORE_DIFFICULTY}; use crate::blockchain::enums::BlockQuality; use crate::blockchain::hash_utils::*; use crate::keys::check_public_key_strength; diff --git a/src/p2p/network.rs b/src/p2p/network.rs index 3ea95da..18cab9f 100644 --- a/src/p2p/network.rs +++ b/src/p2p/network.rs @@ -17,7 +17,7 @@ use std::net::{SocketAddr, IpAddr, SocketAddrV4, Shutdown}; use std::collections::HashSet; use crate::{Context, Block, p2p::Message, p2p::State, p2p::Peer, p2p::Peers, Bytes}; use crate::blockchain::enums::BlockQuality; -use crate::blockchain::CHAIN_VERSION; +use crate::commons::CHAIN_VERSION; const SERVER: Token = Token(0); const POLL_TIMEOUT: Option = Some(Duration::from_millis(3000)); @@ -304,6 +304,7 @@ fn handle_message(context: Arc>, message: Message, peers: &mut Pe let peer = peers.get_mut_peer(token).unwrap(); peer.set_height(height); peer.set_active(true); + peer.reset_reconnects(); let mut context = context.lock().unwrap(); let blocks_count = context.chain.height(); context.bus.post(crate::event::Event::NetworkStatus { nodes: active_count + 1, blocks: blocks_count }); diff --git a/src/p2p/peer.rs b/src/p2p/peer.rs index f503e78..8e00ab2 100644 --- a/src/p2p/peer.rs +++ b/src/p2p/peer.rs @@ -14,13 +14,26 @@ pub struct Peer { inbound: bool, public: bool, active: bool, + reconnects: u32, received_block: u64, fork: HashMap } impl Peer { pub fn new(addr: SocketAddr, stream: TcpStream, state: State, inbound: bool) -> Self { - Peer { addr, stream, state, rand: commons::random_string(6), height: 0, inbound, public: false, active: false, received_block: 0, fork: HashMap::new() } + Peer { + addr, + stream, + state, + rand: commons::random_string(6), + height: 0, + inbound, + public: false, + active: false, + reconnects: 0, + received_block: 0, + fork: HashMap::new() + } } pub fn get_addr(&self) -> SocketAddr { @@ -83,6 +96,18 @@ impl Peer { self.active } + pub fn reconnects(&self) -> u32 { + self.reconnects + } + + pub fn inc_reconnects(&mut self) { + self.reconnects += 1; + } + + pub fn reset_reconnects(&mut self) { + self.reconnects = 0; + } + pub fn disabled(&self) -> bool { self.state.disabled() } diff --git a/src/p2p/peers.rs b/src/p2p/peers.rs index 5c5eb80..4e46037 100644 --- a/src/p2p/peers.rs +++ b/src/p2p/peers.rs @@ -10,6 +10,7 @@ use rand::seq::IteratorRandom; #[allow(unused_imports)] use log::{trace, debug, info, warn, error}; use crate::Bytes; +use crate::commons::MAX_RECONNECTS; pub struct Peers { peers: HashMap, @@ -229,6 +230,9 @@ impl Peers { } } + // Remove all peers that are offline for a long time + self.peers.retain(|_, p| { !(p.get_state().need_reconnect() && p.reconnects() >= MAX_RECONNECTS) }); + for (token, peer) in self.peers.iter_mut() { if peer.get_state().need_reconnect() { let addr = peer.get_addr(); @@ -237,6 +241,7 @@ impl Peers { info!("Created connection to peer {}", &addr); registry.register(&mut stream, token.clone(), Interest::WRITABLE).unwrap(); peer.set_state(State::Connecting); + peer.inc_reconnects(); peer.set_stream(stream); } Err(e) => { diff --git a/src/web_ui.rs b/src/web_ui.rs index 30725c9..2a122c5 100644 --- a/src/web_ui.rs +++ b/src/web_ui.rs @@ -17,7 +17,7 @@ use alfis::miner::Miner; use alfis::{keys, check_domain}; use alfis::event::Event; use alfis::dns::protocol::DnsRecord; -use alfis::blockchain::{ZONE_MAX_LENGTH, ZONE_DIFFICULTY}; +use alfis::commons::{ZONE_MAX_LENGTH, ZONE_DIFFICULTY}; use Cmd::*; use alfis::blockchain::transaction::{DomainData, ZoneData}; use self::web_view::WebView;