From 2aae86233057741497661503236be0f233dc2bb3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomasz=20Drwi=C4=99ga?= Date: Thu, 17 Mar 2016 12:47:31 +0100 Subject: [PATCH] Updating sealing when new transactions are received --- miner/src/lib.rs | 2 +- miner/src/miner.rs | 47 +++++++++++------------ rpc/src/v1/tests/helpers/miner_service.rs | 2 +- sync/src/chain.rs | 12 +++--- 4 files changed, 30 insertions(+), 33 deletions(-) diff --git a/miner/src/lib.rs b/miner/src/lib.rs index 648e9b3b5..c70caad66 100644 --- a/miner/src/lib.rs +++ b/miner/src/lib.rs @@ -92,7 +92,7 @@ pub trait MinerService : Send + Sync { fn chain_new_blocks(&self, chain: &BlockChainClient, imported: &[H256], invalid: &[H256], enacted: &[H256], retracted: &[H256]); /// New chain head event. Restart mining operation. - fn prepare_sealing(&self, chain: &BlockChainClient); + fn update_sealing(&self, chain: &BlockChainClient); /// Grab the `ClosedBlock` that we want to be sealed. Comes as a mutex that you have to lock. fn sealing_block(&self, chain: &BlockChainClient) -> &Mutex>; diff --git a/miner/src/miner.rs b/miner/src/miner.rs index 0307c56fc..be90b15af 100644 --- a/miner/src/miner.rs +++ b/miner/src/miner.rs @@ -95,10 +95,26 @@ impl Miner { self.transaction_queue.lock().unwrap().set_minimal_gas_price(min_gas_price); } +<<<<<<< HEAD fn update_gas_limit(&self, chain: &BlockChainClient) { let gas_limit = HeaderView::new(&chain.best_block_header()).gas_limit(); let mut queue = self.transaction_queue.lock().unwrap(); queue.set_gas_limit(gas_limit); +======= + /// Prepares new block for sealing including top transactions from queue. + pub fn prepare_sealing(&self, chain: &BlockChainClient) { + let no_of_transactions = 128; + // TODO: should select transactions orm queue according to gas limit of block. + let transactions = self.transaction_queue.lock().unwrap().top_transactions(no_of_transactions); + + let b = chain.prepare_sealing( + self.author(), + self.gas_floor_target(), + self.extra_data(), + transactions, + ); + *self.sealing_block.lock().unwrap() = b; +>>>>>>> b684bc9... Updating sealing when new transactions are received } } @@ -106,7 +122,7 @@ impl MinerService for Miner { fn clear_and_reset(&self, chain: &BlockChainClient) { self.transaction_queue.lock().unwrap().clear(); - self.prepare_sealing(chain); + self.update_sealing(chain); } fn status(&self) -> MinerStatus { @@ -130,26 +146,10 @@ impl MinerService for Miner { transaction_queue.pending_hashes() } - fn prepare_sealing(&self, chain: &BlockChainClient) { - let transactions = self.transaction_queue.lock().unwrap().top_transactions(); - let b = chain.prepare_sealing( - self.author(), - self.gas_floor_target(), - self.extra_data(), - transactions, - ); - - *self.sealing_block.lock().unwrap() = b.map(|(block, invalid_transactions)| { - let mut queue = self.transaction_queue.lock().unwrap(); - queue.remove_all( - &invalid_transactions.into_iter().collect::>(), - |a: &Address| AccountDetails { - nonce: chain.nonce(a), - balance: chain.balance(a), - } - ); - block - }); + fn update_sealing(&self, chain: &BlockChainClient) { + if self.sealing_enabled.load(atomic::Ordering::Relaxed) { + self.prepare_sealing(chain); + } } fn sealing_block(&self, chain: &BlockChainClient) -> &Mutex> { @@ -239,9 +239,6 @@ impl MinerService for Miner { }); } - // Update mined block - if self.sealing_enabled.load(atomic::Ordering::Relaxed) { - self.prepare_sealing(chain); - } + self.update_sealing(chain); } } diff --git a/rpc/src/v1/tests/helpers/miner_service.rs b/rpc/src/v1/tests/helpers/miner_service.rs index 44b94ac14..ca4151ba7 100644 --- a/rpc/src/v1/tests/helpers/miner_service.rs +++ b/rpc/src/v1/tests/helpers/miner_service.rs @@ -61,7 +61,7 @@ impl MinerService for TestMinerService { fn chain_new_blocks(&self, _chain: &BlockChainClient, _imported: &[H256], _invalid: &[H256], _enacted: &[H256], _retracted: &[H256]) { unimplemented!(); } /// New chain head event. Restart mining operation. - fn prepare_sealing(&self, _chain: &BlockChainClient) { unimplemented!(); } + fn update_sealing(&self, _chain: &BlockChainClient) { unimplemented!(); } /// Grab the `ClosedBlock` that we want to be sealed. Comes as a mutex that you have to lock. fn sealing_block(&self, _chain: &BlockChainClient) -> &Mutex> { diff --git a/sync/src/chain.rs b/sync/src/chain.rs index 8bb0c7c80..d15d1e79c 100644 --- a/sync/src/chain.rs +++ b/sync/src/chain.rs @@ -951,11 +951,11 @@ impl ChainSync { transactions.push(tx); } let chain = io.chain(); - let fetch_account = |a: &Address| AccountDetails { - nonce: chain.nonce(a), - balance: chain.balance(a), - }; - let _ = self.miner.import_transactions(transactions, fetch_account); + let fetch_nonce = |a: &Address| chain.nonce(a); + let res = self.miner.import_transactions(transactions, fetch_nonce); + if res.is_ok() { + self.miner.update_sealing(io.chain()); + } Ok(()) } @@ -1297,7 +1297,7 @@ impl ChainSync { } pub fn chain_new_head(&mut self, io: &mut SyncIo) { - self.miner.prepare_sealing(io.chain()); + self.miner.update_sealing(io.chain()); } }