Fix and add info messages (#1552)
* Display information on journal database on startup. * Minor restyling. * Client handles the enode message to avoid repeats. * Avoid unneeded copies *and* reduce code. * Fix up typo.
This commit is contained in:
parent
095e51c39c
commit
cd7b046d80
@ -119,6 +119,7 @@ pub struct Client {
|
|||||||
liveness: AtomicBool,
|
liveness: AtomicBool,
|
||||||
io_channel: IoChannel<NetSyncMessage>,
|
io_channel: IoChannel<NetSyncMessage>,
|
||||||
queue_transactions: AtomicUsize,
|
queue_transactions: AtomicUsize,
|
||||||
|
previous_enode: Mutex<Option<String>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
const HISTORY: u64 = 1200;
|
const HISTORY: u64 = 1200;
|
||||||
@ -204,6 +205,7 @@ impl Client {
|
|||||||
miner: miner,
|
miner: miner,
|
||||||
io_channel: message_channel,
|
io_channel: message_channel,
|
||||||
queue_transactions: AtomicUsize::new(0),
|
queue_transactions: AtomicUsize::new(0),
|
||||||
|
previous_enode: Mutex::new(None),
|
||||||
};
|
};
|
||||||
Ok(Arc::new(client))
|
Ok(Arc::new(client))
|
||||||
}
|
}
|
||||||
@ -559,6 +561,18 @@ impl Client {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Notify us that the network has been started.
|
||||||
|
pub fn network_started(&self, url: &String) {
|
||||||
|
let mut previous_enode = self.previous_enode.lock().unwrap();
|
||||||
|
if let Some(ref u) = *previous_enode {
|
||||||
|
if u == url {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
*previous_enode = Some(url.clone());
|
||||||
|
info!(target: "mode", "Public node URL: {}", url.apply(Colour::White.bold()));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl BlockChainClient for Client {
|
impl BlockChainClient for Client {
|
||||||
|
@ -20,7 +20,6 @@ use std::time::{Instant, Duration};
|
|||||||
|
|
||||||
use util::*;
|
use util::*;
|
||||||
use util::using_queue::{UsingQueue, GetAction};
|
use util::using_queue::{UsingQueue, GetAction};
|
||||||
use util::Colour::White;
|
|
||||||
use account_provider::AccountProvider;
|
use account_provider::AccountProvider;
|
||||||
use views::{BlockView, HeaderView};
|
use views::{BlockView, HeaderView};
|
||||||
use client::{MiningBlockChainClient, Executive, Executed, EnvInfo, TransactOptions, BlockID, CallAnalytics};
|
use client::{MiningBlockChainClient, Executive, Executed, EnvInfo, TransactOptions, BlockID, CallAnalytics};
|
||||||
@ -655,7 +654,7 @@ impl MinerService for Miner {
|
|||||||
let n = sealed.header().number();
|
let n = sealed.header().number();
|
||||||
let h = sealed.header().hash();
|
let h = sealed.header().hash();
|
||||||
try!(chain.import_sealed_block(sealed));
|
try!(chain.import_sealed_block(sealed));
|
||||||
info!(target: "miner", "Mined block imported OK. #{}: {}", paint(White.bold(), format!("{}", n)), paint(White.bold(), h.hex()));
|
info!(target: "miner", "Mined block imported OK. #{}: {}", format!("{}", n).apply(Colour::White.bold()), h.hex().apply(Colour::White.bold()));
|
||||||
Ok(())
|
Ok(())
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
@ -17,7 +17,6 @@
|
|||||||
//! Creates and registers client and network services.
|
//! Creates and registers client and network services.
|
||||||
|
|
||||||
use util::*;
|
use util::*;
|
||||||
use util::Colour::{Yellow, White};
|
|
||||||
use util::panics::*;
|
use util::panics::*;
|
||||||
use spec::Spec;
|
use spec::Spec;
|
||||||
use error::*;
|
use error::*;
|
||||||
@ -72,7 +71,7 @@ impl ClientService {
|
|||||||
try!(net_service.start());
|
try!(net_service.start());
|
||||||
}
|
}
|
||||||
|
|
||||||
info!("Configured for {} using {} engine", paint(White.bold(), spec.name.clone()), paint(Yellow.bold(), spec.engine.name().to_owned()));
|
info!("Configured for {} using {} engine", spec.name.clone().apply(Colour::White.bold()), spec.engine.name().apply(Colour::Yellow.bold()));
|
||||||
let client = try!(Client::new(config, spec, db_path, miner, net_service.io().channel()));
|
let client = try!(Client::new(config, spec, db_path, miner, net_service.io().channel()));
|
||||||
panic_handler.forward_from(client.deref());
|
panic_handler.forward_from(client.deref());
|
||||||
let client_io = Arc::new(ClientIoHandler {
|
let client_io = Arc::new(ClientIoHandler {
|
||||||
@ -135,16 +134,14 @@ impl IoHandler<NetSyncMessage> for ClientIoHandler {
|
|||||||
|
|
||||||
#[cfg_attr(feature="dev", allow(single_match))]
|
#[cfg_attr(feature="dev", allow(single_match))]
|
||||||
fn message(&self, io: &IoContext<NetSyncMessage>, net_message: &NetSyncMessage) {
|
fn message(&self, io: &IoContext<NetSyncMessage>, net_message: &NetSyncMessage) {
|
||||||
if let UserMessage(ref message) = *net_message {
|
match *net_message {
|
||||||
match *message {
|
UserMessage(ref message) => match *message {
|
||||||
SyncMessage::BlockVerified => {
|
SyncMessage::BlockVerified => { self.client.import_verified_blocks(&io.channel()); }
|
||||||
self.client.import_verified_blocks(&io.channel());
|
SyncMessage::NewTransactions(ref transactions) => { self.client.import_queued_transactions(&transactions); }
|
||||||
},
|
_ => {} // ignore other messages
|
||||||
SyncMessage::NewTransactions(ref transactions) => {
|
},
|
||||||
self.client.import_queued_transactions(&transactions);
|
NetworkIoMessage::NetworkStarted(ref url) => { self.client.network_started(url); }
|
||||||
},
|
_ => {} // ignore other messages
|
||||||
_ => {}, // ignore other messages
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -181,7 +181,7 @@ impl Configuration {
|
|||||||
let wei_per_usd: f32 = 1.0e18 / usd_per_eth;
|
let wei_per_usd: f32 = 1.0e18 / usd_per_eth;
|
||||||
let gas_per_tx: f32 = 21000.0;
|
let gas_per_tx: f32 = 21000.0;
|
||||||
let wei_per_gas: f32 = wei_per_usd * usd_per_tx / gas_per_tx;
|
let wei_per_gas: f32 = wei_per_usd * usd_per_tx / gas_per_tx;
|
||||||
info!("Using a conversion rate of Ξ1 = {} ({} wei/gas)", paint(White.bold(), format!("US${}", usd_per_eth)), paint(Yellow.bold(), format!("{}", wei_per_gas)));
|
info!("Using a conversion rate of Ξ1 = {} ({} wei/gas)", format!("US${}", usd_per_eth).apply(White.bold()), format!("{}", wei_per_gas).apply(Yellow.bold()));
|
||||||
U256::from_dec_str(&format!("{:.0}", wei_per_gas)).unwrap()
|
U256::from_dec_str(&format!("{:.0}", wei_per_gas)).unwrap()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -338,7 +338,7 @@ impl Configuration {
|
|||||||
if let journaldb::Algorithm::Archive = client_config.pruning {
|
if let journaldb::Algorithm::Archive = client_config.pruning {
|
||||||
client_config.trie_spec = TrieSpec::Fat;
|
client_config.trie_spec = TrieSpec::Fat;
|
||||||
} else {
|
} else {
|
||||||
die!("Fatdb is not supported. Please rerun with --pruning=archive")
|
die!("Fatdb is not supported. Please re-run with --pruning=archive")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -353,7 +353,7 @@ impl Configuration {
|
|||||||
};
|
};
|
||||||
|
|
||||||
if self.args.flag_jitvm {
|
if self.args.flag_jitvm {
|
||||||
client_config.vm_type = VMType::jit().unwrap_or_else(|| die!("Parity built without jit vm."))
|
client_config.vm_type = VMType::jit().unwrap_or_else(|| die!("Parity is built without the JIT EVM."))
|
||||||
}
|
}
|
||||||
|
|
||||||
trace!(target: "parity", "Using pruning strategy of {}", client_config.pruning);
|
trace!(target: "parity", "Using pruning strategy of {}", client_config.pruning);
|
||||||
|
@ -80,7 +80,7 @@ use std::thread::sleep;
|
|||||||
use std::time::Duration;
|
use std::time::Duration;
|
||||||
use rustc_serialize::hex::FromHex;
|
use rustc_serialize::hex::FromHex;
|
||||||
use ctrlc::CtrlC;
|
use ctrlc::CtrlC;
|
||||||
use util::{H256, ToPretty, NetworkConfiguration, PayloadInfo, Bytes, UtilError, paint, Colour, version};
|
use util::{H256, ToPretty, NetworkConfiguration, PayloadInfo, Bytes, UtilError, Colour, Applyable, version, journaldb};
|
||||||
use util::panics::{MayPanic, ForwardPanic, PanicHandler};
|
use util::panics::{MayPanic, ForwardPanic, PanicHandler};
|
||||||
use ethcore::client::{Mode, BlockID, BlockChainClient, ClientConfig, get_db_path, BlockImportError};
|
use ethcore::client::{Mode, BlockID, BlockChainClient, ClientConfig, get_db_path, BlockImportError};
|
||||||
use ethcore::error::{ImportError};
|
use ethcore::error::{ImportError};
|
||||||
@ -188,10 +188,21 @@ fn execute_client(conf: Configuration, spec: Spec, client_config: ClientConfig)
|
|||||||
// Raise fdlimit
|
// Raise fdlimit
|
||||||
unsafe { ::fdlimit::raise_fd_limit(); }
|
unsafe { ::fdlimit::raise_fd_limit(); }
|
||||||
|
|
||||||
info!("Starting {}", paint(Colour::White.bold(), format!("{}", version())));
|
info!("Starting {}", format!("{}", version()).apply(Colour::White.bold()));
|
||||||
|
info!("Using state DB journalling strategy {}", match client_config.pruning {
|
||||||
|
journaldb::Algorithm::Archive => "archive",
|
||||||
|
journaldb::Algorithm::EarlyMerge => "light",
|
||||||
|
journaldb::Algorithm::OverlayRecent => "fast",
|
||||||
|
journaldb::Algorithm::RefCounted => "basic",
|
||||||
|
}.apply(Colour::White.bold()));
|
||||||
|
|
||||||
let net_settings = conf.net_settings(&spec);
|
// Display warning about using experimental journaldb types
|
||||||
let sync_config = conf.sync_config(&spec);
|
match client_config.pruning {
|
||||||
|
journaldb::Algorithm::EarlyMerge | journaldb::Algorithm::RefCounted => {
|
||||||
|
warn!("Your chosen strategy is {}! You can re-run with --pruning to change.", "unstable".apply(Colour::Red.bold()));
|
||||||
|
}
|
||||||
|
_ => {}
|
||||||
|
}
|
||||||
|
|
||||||
// Display warning about using unlock with signer
|
// Display warning about using unlock with signer
|
||||||
if conf.signer_enabled() && conf.args.flag_unlock.is_some() {
|
if conf.signer_enabled() && conf.args.flag_unlock.is_some() {
|
||||||
@ -204,6 +215,9 @@ fn execute_client(conf: Configuration, spec: Spec, client_config: ClientConfig)
|
|||||||
warn!("Value given for --policy, yet no proposed forks exist. Ignoring.");
|
warn!("Value given for --policy, yet no proposed forks exist. Ignoring.");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let net_settings = conf.net_settings(&spec);
|
||||||
|
let sync_config = conf.sync_config(&spec);
|
||||||
|
|
||||||
// Secret Store
|
// Secret Store
|
||||||
let account_service = Arc::new(conf.account_service());
|
let account_service = Arc::new(conf.account_service());
|
||||||
|
|
||||||
|
@ -14,11 +14,10 @@
|
|||||||
// You should have received a copy of the GNU General Public License
|
// You should have received a copy of the GNU General Public License
|
||||||
// along with Parity. If not, see <http://www.gnu.org/licenses/>.
|
// along with Parity. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
extern crate ansi_term;
|
|
||||||
use self::ansi_term::Colour::White;
|
|
||||||
use std::io;
|
use std::io;
|
||||||
use std::path::PathBuf;
|
use std::path::PathBuf;
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
|
use util::{Colour, Applyable};
|
||||||
use util::panics::{PanicHandler, ForwardPanic};
|
use util::panics::{PanicHandler, ForwardPanic};
|
||||||
use util::path::restrict_permissions_owner;
|
use util::path::restrict_permissions_owner;
|
||||||
use die::*;
|
use die::*;
|
||||||
@ -67,7 +66,7 @@ pub fn new_token(path: String) -> io::Result<()> {
|
|||||||
let mut codes = try!(signer::AuthCodes::from_file(&path));
|
let mut codes = try!(signer::AuthCodes::from_file(&path));
|
||||||
let code = try!(codes.generate_new());
|
let code = try!(codes.generate_new());
|
||||||
try!(codes.to_file(&path));
|
try!(codes.to_file(&path));
|
||||||
println!("This key code will authorise your System Signer UI: {}", White.bold().paint(code));
|
println!("This key code will authorise your System Signer UI: {}", code.apply(Colour::White.bold()));
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -17,6 +17,7 @@
|
|||||||
//! Common log helper functions
|
//! Common log helper functions
|
||||||
|
|
||||||
use std::env;
|
use std::env;
|
||||||
|
use std::borrow::Cow;
|
||||||
use rlog::{LogLevelFilter};
|
use rlog::{LogLevelFilter};
|
||||||
use env_logger::LogBuilder;
|
use env_logger::LogBuilder;
|
||||||
use std::sync::{RwLock, RwLockReadGuard};
|
use std::sync::{RwLock, RwLockReadGuard};
|
||||||
@ -28,12 +29,20 @@ lazy_static! {
|
|||||||
static ref USE_COLOR: AtomicBool = AtomicBool::new(false);
|
static ref USE_COLOR: AtomicBool = AtomicBool::new(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Paint, using colour if desired.
|
/// Something which can be apply()ed.
|
||||||
pub fn paint(c: Style, t: String) -> String {
|
pub trait Applyable: AsRef<str> {
|
||||||
match USE_COLOR.load(Ordering::Relaxed) {
|
/// Apply the style `c` to ourself, returning us styled in that manner.
|
||||||
true => format!("{}", c.paint(t)),
|
fn apply(&self, c: Style) -> Cow<str>;
|
||||||
false => t,
|
}
|
||||||
}
|
|
||||||
|
impl<T: AsRef<str>> Applyable for T {
|
||||||
|
fn apply(&self, c: Style) -> Cow<str> {
|
||||||
|
let s = self.as_ref();
|
||||||
|
match USE_COLOR.load(Ordering::Relaxed) {
|
||||||
|
true => Cow::Owned(format!("{}", c.paint(s))),
|
||||||
|
false => Cow::Borrowed(s),
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
lazy_static! {
|
lazy_static! {
|
||||||
|
@ -32,8 +32,6 @@ use misc::version;
|
|||||||
use crypto::*;
|
use crypto::*;
|
||||||
use sha3::Hashable;
|
use sha3::Hashable;
|
||||||
use rlp::*;
|
use rlp::*;
|
||||||
use log::Colour::White;
|
|
||||||
use log::paint;
|
|
||||||
use network::session::{Session, SessionData};
|
use network::session::{Session, SessionData};
|
||||||
use error::*;
|
use error::*;
|
||||||
use io::*;
|
use io::*;
|
||||||
@ -162,6 +160,8 @@ pub enum NetworkIoMessage<Message> where Message: Send + Sync + Clone {
|
|||||||
Disconnect(PeerId),
|
Disconnect(PeerId),
|
||||||
/// Disconnect and temporary disable peer.
|
/// Disconnect and temporary disable peer.
|
||||||
DisablePeer(PeerId),
|
DisablePeer(PeerId),
|
||||||
|
/// Network has been started with the host as the given enode.
|
||||||
|
NetworkStarted(String),
|
||||||
/// User message
|
/// User message
|
||||||
User(Message),
|
User(Message),
|
||||||
}
|
}
|
||||||
@ -345,12 +345,13 @@ pub struct Host<Message> where Message: Send + Sync + Clone {
|
|||||||
reserved_nodes: RwLock<HashSet<NodeId>>,
|
reserved_nodes: RwLock<HashSet<NodeId>>,
|
||||||
num_sessions: AtomicUsize,
|
num_sessions: AtomicUsize,
|
||||||
stopping: AtomicBool,
|
stopping: AtomicBool,
|
||||||
first_time: AtomicBool,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<Message> Host<Message> where Message: Send + Sync + Clone {
|
impl<Message> Host<Message> where Message: Send + Sync + Clone {
|
||||||
/// Create a new instance
|
/// Create a new instance
|
||||||
pub fn new(config: NetworkConfiguration, stats: Arc<NetworkStats>) -> Result<Host<Message>, UtilError> {
|
pub fn new(config: NetworkConfiguration, stats: Arc<NetworkStats>) -> Result<Host<Message>, UtilError> {
|
||||||
|
trace!(target: "host", "Creating new Host object");
|
||||||
|
|
||||||
let mut listen_address = match config.listen_address {
|
let mut listen_address = match config.listen_address {
|
||||||
None => SocketAddr::from_str("0.0.0.0:30304").unwrap(),
|
None => SocketAddr::from_str("0.0.0.0:30304").unwrap(),
|
||||||
Some(addr) => addr,
|
Some(addr) => addr,
|
||||||
@ -401,7 +402,6 @@ impl<Message> Host<Message> where Message: Send + Sync + Clone {
|
|||||||
reserved_nodes: RwLock::new(HashSet::new()),
|
reserved_nodes: RwLock::new(HashSet::new()),
|
||||||
num_sessions: AtomicUsize::new(0),
|
num_sessions: AtomicUsize::new(0),
|
||||||
stopping: AtomicBool::new(false),
|
stopping: AtomicBool::new(false),
|
||||||
first_time: AtomicBool::new(true),
|
|
||||||
};
|
};
|
||||||
|
|
||||||
for n in boot_nodes {
|
for n in boot_nodes {
|
||||||
@ -538,9 +538,8 @@ impl<Message> Host<Message> where Message: Send + Sync + Clone {
|
|||||||
|
|
||||||
self.info.write().unwrap().public_endpoint = Some(public_endpoint.clone());
|
self.info.write().unwrap().public_endpoint = Some(public_endpoint.clone());
|
||||||
|
|
||||||
if self.first_time.load(AtomicOrdering::Relaxed) {
|
if let Some(url) = self.external_url() {
|
||||||
info!("Public node URL: {}", paint(White.bold(), self.external_url().unwrap()));
|
io.message(NetworkIoMessage::NetworkStarted(url)).unwrap_or_else(|e| warn!("Error sending IO notification: {:?}", e));
|
||||||
self.first_time.store(false, AtomicOrdering::Relaxed);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Initialize discovery.
|
// Initialize discovery.
|
||||||
@ -1038,6 +1037,7 @@ impl<Message> IoHandler<NetworkIoMessage<Message>> for Host<Message> where Messa
|
|||||||
h.message(&NetworkContext::new(io, p, None, self.sessions.clone(), &reserved), &message);
|
h.message(&NetworkContext::new(io, p, None, self.sessions.clone(), &reserved), &message);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
_ => {} // ignore others.
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user