Fix a deadlock (#9952)

* Update informant:
  - decimal in Mgas/s
  - print every 5s (not randomly between 5s and 10s)

* Fix dead-lock in `blockchain.rs`

* Update locks ordering
This commit is contained in:
Nicolas Gotchac 2018-11-25 08:53:41 +01:00 committed by Wei Tang
parent 1fdfa1e6c6
commit f20f4c74d2
2 changed files with 6 additions and 8 deletions

View File

@ -1187,8 +1187,8 @@ impl BlockChain {
let mut pending_block_details = self.pending_block_details.write(); let mut pending_block_details = self.pending_block_details.write();
let mut pending_write_txs = self.pending_transaction_addresses.write(); let mut pending_write_txs = self.pending_transaction_addresses.write();
let mut best_ancient_block = self.best_ancient_block.write();
let mut best_block = self.best_block.write(); let mut best_block = self.best_block.write();
let mut best_ancient_block = self.best_ancient_block.write();
let mut write_block_details = self.block_details.write(); let mut write_block_details = self.block_details.write();
let mut write_hashes = self.block_hashes.write(); let mut write_hashes = self.block_hashes.write();
let mut write_txs = self.transaction_addresses.write(); let mut write_txs = self.transaction_addresses.write();

View File

@ -256,16 +256,13 @@ impl<T: InformantData> Informant<T> {
} }
pub fn tick(&self) { pub fn tick(&self) {
let elapsed = self.last_tick.read().elapsed(); let now = Instant::now();
if elapsed < Duration::from_secs(5) { let elapsed = now.duration_since(*self.last_tick.read());
return;
}
let (client_report, full_report) = { let (client_report, full_report) = {
let mut last_report = self.last_report.lock(); let mut last_report = self.last_report.lock();
let full_report = self.target.report(); let full_report = self.target.report();
let diffed = full_report.client_report.clone() - &*last_report; let diffed = full_report.client_report.clone() - &*last_report;
*last_report = full_report.client_report.clone();
(diffed, full_report) (diffed, full_report)
}; };
@ -289,7 +286,8 @@ impl<T: InformantData> Informant<T> {
return; return;
} }
*self.last_tick.write() = Instant::now(); *self.last_tick.write() = now;
*self.last_report.lock() = full_report.client_report.clone();
let paint = |c: Style, t: String| match self.with_color && atty::is(atty::Stream::Stdout) { let paint = |c: Style, t: String| match self.with_color && atty::is(atty::Stream::Stdout) {
true => format!("{}", c.paint(t)), true => format!("{}", c.paint(t)),
@ -306,7 +304,7 @@ impl<T: InformantData> Informant<T> {
format!("{} blk/s {} tx/s {} Mgas/s", format!("{} blk/s {} tx/s {} Mgas/s",
paint(Yellow.bold(), format!("{:7.2}", (client_report.blocks_imported * 1000) as f64 / elapsed.as_milliseconds() as f64)), paint(Yellow.bold(), format!("{:7.2}", (client_report.blocks_imported * 1000) as f64 / elapsed.as_milliseconds() as f64)),
paint(Yellow.bold(), format!("{:6.1}", (client_report.transactions_applied * 1000) as f64 / elapsed.as_milliseconds() as f64)), paint(Yellow.bold(), format!("{:6.1}", (client_report.transactions_applied * 1000) as f64 / elapsed.as_milliseconds() as f64)),
paint(Yellow.bold(), format!("{:4}", (client_report.gas_processed / (elapsed.as_milliseconds() * 1000)).low_u64())) paint(Yellow.bold(), format!("{:6.1}", (client_report.gas_processed / 1000).low_u64() as f64 / elapsed.as_milliseconds() as f64))
) )
} else { } else {
format!("{} hdr/s", format!("{} hdr/s",