Fixing miner deadlock (#1885)

This commit is contained in:
Tomasz Drwięga 2016-08-09 11:45:07 +02:00 committed by arkpar
parent ff84f36f89
commit 6af33f4309

View File

@ -96,12 +96,10 @@ pub struct Miner {
// NOTE [ToDr] When locking always lock in this order! // NOTE [ToDr] When locking always lock in this order!
transaction_queue: Mutex<TransactionQueue>, transaction_queue: Mutex<TransactionQueue>,
sealing_work: Mutex<SealingWork>, sealing_work: Mutex<SealingWork>,
// for sealing...
options: MinerOptions,
next_allowed_reseal: Mutex<Instant>, next_allowed_reseal: Mutex<Instant>,
sealing_block_last_request: Mutex<u64>, sealing_block_last_request: Mutex<u64>,
// for sealing...
options: MinerOptions,
gas_range_target: RwLock<(U256, U256)>, gas_range_target: RwLock<(U256, U256)>,
author: RwLock<Address>, author: RwLock<Address>,
extra_data: RwLock<Bytes>, extra_data: RwLock<Bytes>,
@ -651,11 +649,11 @@ impl MinerService for Miner {
fn update_sealing(&self, chain: &MiningBlockChainClient) { fn update_sealing(&self, chain: &MiningBlockChainClient) {
trace!(target: "miner", "update_sealing"); trace!(target: "miner", "update_sealing");
let requires_reseal = { let requires_reseal = {
let has_local_transactions = self.transaction_queue.lock().unwrap().has_local_pending_transactions();
let mut sealing_work = self.sealing_work.lock().unwrap(); let mut sealing_work = self.sealing_work.lock().unwrap();
if sealing_work.enabled { if sealing_work.enabled {
trace!(target: "miner", "update_sealing: sealing enabled"); trace!(target: "miner", "update_sealing: sealing enabled");
let current_no = chain.chain_info().best_block_number; let current_no = chain.chain_info().best_block_number;
let has_local_transactions = self.transaction_queue.lock().unwrap().has_local_pending_transactions();
let last_request = *self.sealing_block_last_request.lock().unwrap(); let last_request = *self.sealing_block_last_request.lock().unwrap();
let should_disable_sealing = !self.forced_sealing() let should_disable_sealing = !self.forced_sealing()
&& !has_local_transactions && !has_local_transactions