From 6e5ddbe59f656c3429b7720a4512609fd980dbed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomasz=20Drwi=C4=99ga?= Date: Fri, 29 Jun 2018 14:30:58 +0200 Subject: [PATCH 01/11] Clear cache only when block is enacted. --- ethcore/src/miner/miner.rs | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/ethcore/src/miner/miner.rs b/ethcore/src/miner/miner.rs index db496e40dc0..2a622bdc1d4 100644 --- a/ethcore/src/miner/miner.rs +++ b/ethcore/src/miner/miner.rs @@ -1065,13 +1065,18 @@ impl miner::MinerService for Miner { // 2. We ignore blocks that are `invalid` because it doesn't have any meaning in terms of the transactions that // are in those blocks - // Clear nonce cache - self.nonce_cache.write().clear(); + let has_new_best_block = enacted.len() > 0; + + if has_new_best_block { + // Clear nonce cache + self.nonce_cache.write().clear(); + } // First update gas limit in transaction queue and minimal gas price. let gas_limit = *chain.best_block_header().gas_limit(); self.update_transaction_queue_limits(gas_limit); + // Then import all transactions... let client = self.pool_client(chain); { @@ -1091,10 +1096,12 @@ impl miner::MinerService for Miner { }); } - // ...and at the end remove the old ones - self.transaction_queue.cull(client); + if has_new_best_block { + // ...and at the end remove the old ones + self.transaction_queue.cull(client); + } - if enacted.len() > 0 || (imported.len() > 0 && self.options.reseal_on_uncle) { + if has_new_best_block || (imported.len() > 0 && self.options.reseal_on_uncle) { // Reset `next_allowed_reseal` in case a block is imported. // Even if min_period is high, we will always attempt to create // new pending block. From 729ebe56b175d87ef4e11d4b1e77b70817400fd1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomasz=20Drwi=C4=99ga?= Date: Fri, 29 Jun 2018 14:39:05 +0200 Subject: [PATCH 02/11] Add tracing for cull. --- miner/src/pool/queue.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/miner/src/pool/queue.rs b/miner/src/pool/queue.rs index 450075faa6e..33b42ff0d29 100644 --- a/miner/src/pool/queue.rs +++ b/miner/src/pool/queue.rs @@ -326,6 +326,7 @@ impl TransactionQueue { &self, client: C, ) { + trace_time!("pool::cull"); // We don't care about future transactions, so nonce_cap is not important. let nonce_cap = None; // We want to clear stale transactions from the queue as well. From 8c5af99bb6cf5376fe2e85e62f79d8b12d937d4a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomasz=20Drwi=C4=99ga?= Date: Fri, 29 Jun 2018 18:20:56 +0200 Subject: [PATCH 03/11] Cull split. --- Cargo.toml | 2 +- ethcore/private-tx/src/lib.rs | 12 +++++++++--- ethcore/src/miner/miner.rs | 8 +++++--- ethcore/src/miner/pool_client.rs | 27 ++++++++++++++------------- miner/src/pool/queue.rs | 16 ++++++++++++---- transaction-pool/src/pool.rs | 5 +++++ 6 files changed, 46 insertions(+), 24 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 7424ba38bfa..85d9201c17c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -117,7 +117,7 @@ name = "parity" [profile.dev] [profile.release] -debug = false +debug = true [workspace] members = [ diff --git a/ethcore/private-tx/src/lib.rs b/ethcore/private-tx/src/lib.rs index 38285ed85b5..65f88b32456 100644 --- a/ethcore/private-tx/src/lib.rs +++ b/ethcore/private-tx/src/lib.rs @@ -244,7 +244,7 @@ impl Provider where { Ok(original_transaction) } - fn pool_client<'a>(&'a self, nonce_cache: &'a RwLock>) -> miner::pool_client::PoolClient<'a, Client> { + fn pool_client<'a>(&'a self, nonce_cache: &'a NonceCache) -> miner::pool_client::PoolClient<'a, Client> { let engine = self.client.engine(); let refuse_service_transactions = true; miner::pool_client::PoolClient::new( @@ -263,7 +263,7 @@ impl Provider where { /// can be replaced with a single `drain()` method instead. /// Thanks to this we also don't really need to lock the entire verification for the time of execution. fn process_queue(&self) -> Result<(), Error> { - let nonce_cache = Default::default(); + let nonce_cache = default_nonce_cache(); let mut verification_queue = self.transactions_for_verification.lock(); let ready_transactions = verification_queue.ready_transactions(self.pool_client(&nonce_cache)); for transaction in ready_transactions { @@ -584,7 +584,7 @@ impl Importer for Arc { trace!("Validating transaction: {:?}", original_tx); // Verify with the first account available trace!("The following account will be used for verification: {:?}", validation_account); - let nonce_cache = Default::default(); + let nonce_cache = default_nonce_cache(); self.transactions_for_verification.lock().add_transaction( original_tx, contract, @@ -690,3 +690,9 @@ impl ChainNotify for Provider { } } } + +fn default_nonce_cache() -> NonceCache { + (Default::default(), 1024) +} + +type NonceCache = (RwLock>, usize); diff --git a/ethcore/src/miner/miner.rs b/ethcore/src/miner/miner.rs index 2a622bdc1d4..70391fb5786 100644 --- a/ethcore/src/miner/miner.rs +++ b/ethcore/src/miner/miner.rs @@ -14,6 +14,7 @@ // You should have received a copy of the GNU General Public License // along with Parity. If not, see . +use std::cmp; use std::time::{Instant, Duration}; use std::collections::{BTreeMap, HashSet, HashMap}; use std::sync::Arc; @@ -201,7 +202,7 @@ pub struct Miner { sealing: Mutex, params: RwLock, listeners: RwLock>>, - nonce_cache: RwLock>, + nonce_cache: (RwLock>, usize), gas_pricer: Mutex, options: MinerOptions, // TODO [ToDr] Arc is only required because of price updater @@ -227,6 +228,7 @@ impl Miner { let limits = options.pool_limits.clone(); let verifier_options = options.pool_verification_options.clone(); let tx_queue_strategy = options.tx_queue_strategy; + let nonce_cache_size = cmp::max(4096, limits.max_count / 4); Miner { sealing: Mutex::new(SealingWork { @@ -240,7 +242,7 @@ impl Miner { params: RwLock::new(AuthoringParams::default()), listeners: RwLock::new(vec![]), gas_pricer: Mutex::new(gas_pricer), - nonce_cache: RwLock::new(HashMap::with_capacity(1024)), + nonce_cache: (RwLock::new(HashMap::with_capacity(nonce_cache_size / 2)), nonce_cache_size), options, transaction_queue: Arc::new(TransactionQueue::new(limits, verifier_options, tx_queue_strategy)), accounts, @@ -1069,7 +1071,7 @@ impl miner::MinerService for Miner { if has_new_best_block { // Clear nonce cache - self.nonce_cache.write().clear(); + self.nonce_cache.0.write().clear(); } // First update gas limit in transaction queue and minimal gas price. diff --git a/ethcore/src/miner/pool_client.rs b/ethcore/src/miner/pool_client.rs index bcf93d37532..3f955d6a353 100644 --- a/ethcore/src/miner/pool_client.rs +++ b/ethcore/src/miner/pool_client.rs @@ -36,10 +36,7 @@ use header::Header; use miner; use miner::service_transaction_checker::ServiceTransactionChecker; -type NoncesCache = RwLock>; - -const MAX_NONCE_CACHE_SIZE: usize = 4096; -const EXPECTED_NONCE_CACHE_SIZE: usize = 2048; +type NoncesCache = (RwLock>, usize); /// Blockchain accesss for transaction pool. pub struct PoolClient<'a, C: 'a> { @@ -176,7 +173,8 @@ impl<'a, C: 'a> Clone for CachedNonceClient<'a, C> { impl<'a, C: 'a> fmt::Debug for CachedNonceClient<'a, C> { fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result { fmt.debug_struct("CachedNonceClient") - .field("cache", &self.cache.read().len()) + .field("cache", &self.cache.0.read().len()) + .field("limit", &self.cache.1) .finish() } } @@ -194,27 +192,30 @@ impl<'a, C: 'a> NonceClient for CachedNonceClient<'a, C> where C: Nonce + Sync, { fn account_nonce(&self, address: &Address) -> U256 { - if let Some(nonce) = self.cache.read().get(address) { + if let Some(nonce) = self.cache.0.read().get(address) { return *nonce; } // We don't check again if cache has been populated. // It's not THAT expensive to fetch the nonce from state. - let mut cache = self.cache.write(); + let mut cache = self.cache.0.write(); let nonce = self.client.latest_nonce(address); cache.insert(*address, nonce); + warn!("NonceCache: inserting: [{:?}]", address); - if cache.len() < MAX_NONCE_CACHE_SIZE { + if cache.len() < self.cache.1 { return nonce } + warn!("NonceCache: reached limit."); + trace_time!("nonce_cache:clear"); + // Remove excessive amount of entries from the cache - while cache.len() > EXPECTED_NONCE_CACHE_SIZE { - // Just remove random entry - if let Some(key) = cache.keys().next().cloned() { - cache.remove(&key); - } + let to_remove: Vec<_> = cache.keys().take(self.cache.1 / 2).cloned().collect(); + for x in to_remove { + cache.remove(&x); } + nonce } } diff --git a/miner/src/pool/queue.rs b/miner/src/pool/queue.rs index 33b42ff0d29..f0f64790a1a 100644 --- a/miner/src/pool/queue.rs +++ b/miner/src/pool/queue.rs @@ -322,7 +322,7 @@ impl TransactionQueue { } /// Culls all stalled transactions from the pool. - pub fn cull( + pub fn cull( &self, client: C, ) { @@ -341,9 +341,17 @@ impl TransactionQueue { current_id.checked_sub(gap) }; - let state_readiness = ready::State::new(client, stale_id, nonce_cap); - - let removed = self.pool.write().cull(None, state_readiness); + let mut removed = 0; + let senders: Vec
= { + let pool = self.pool.read(); + let senders = pool.senders().cloned().collect(); + senders + }; + for chunk in senders.chunks(2048) { + trace_time!("pool::cull::chunk"); + let state_readiness = ready::State::new(client.clone(), stale_id, nonce_cap); + removed += self.pool.write().cull(Some(chunk), state_readiness); + } debug!(target: "txqueue", "Removed {} stalled transactions. {}", removed, self.status()); } diff --git a/transaction-pool/src/pool.rs b/transaction-pool/src/pool.rs index 67da1b1d49c..2173abc8772 100644 --- a/transaction-pool/src/pool.rs +++ b/transaction-pool/src/pool.rs @@ -399,6 +399,11 @@ impl Pool where || self.mem_usage >= self.options.max_mem_usage } + /// Returns senders ordered by priority of their transactions. + pub fn senders(&self) -> impl Iterator { + self.best_transactions.iter().map(|tx| tx.transaction.sender()) + } + /// Returns an iterator of pending (ready) transactions. pub fn pending>(&self, ready: R) -> PendingIterator { PendingIterator { From 515a0cbf9cf184d38b12ffb912f3954e98db8fe3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomasz=20Drwi=C4=99ga?= Date: Mon, 2 Jul 2018 10:48:06 +0200 Subject: [PATCH 04/11] Cull after creating pending block. --- ethcore/src/miner/miner.rs | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/ethcore/src/miner/miner.rs b/ethcore/src/miner/miner.rs index 70391fb5786..99fcc83b9bc 100644 --- a/ethcore/src/miner/miner.rs +++ b/ethcore/src/miner/miner.rs @@ -1079,7 +1079,7 @@ impl miner::MinerService for Miner { self.update_transaction_queue_limits(gas_limit); - // Then import all transactions... + // Then import all transactions from retracted blocks. let client = self.pool_client(chain); { retracted @@ -1098,11 +1098,6 @@ impl miner::MinerService for Miner { }); } - if has_new_best_block { - // ...and at the end remove the old ones - self.transaction_queue.cull(client); - } - if has_new_best_block || (imported.len() > 0 && self.options.reseal_on_uncle) { // Reset `next_allowed_reseal` in case a block is imported. // Even if min_period is high, we will always attempt to create @@ -1117,6 +1112,15 @@ impl miner::MinerService for Miner { self.update_sealing(chain); } } + + if has_new_best_block { + // Make sure to cull transactions after we update sealing. + // Not culling won't lead to old transactions being added to the block + // (thanks to Ready), but culling can take significant amount of time, + // so best to leave it after we create some work for miners to prevent increased + // uncle rate. + self.transaction_queue.cull(client); + } } fn pending_state(&self, latest_block_number: BlockNumber) -> Option { From c4e23a64f582a94de67cd0ae7a3a9dd95a37627a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomasz=20Drwi=C4=99ga?= Date: Mon, 2 Jul 2018 14:05:37 +0200 Subject: [PATCH 05/11] Add constant, remove sync::read tracing. --- ethcore/sync/src/api.rs | 1 - miner/src/pool/queue.rs | 10 +++++++++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/ethcore/sync/src/api.rs b/ethcore/sync/src/api.rs index 56bc579ad88..ef54a4802d9 100644 --- a/ethcore/sync/src/api.rs +++ b/ethcore/sync/src/api.rs @@ -384,7 +384,6 @@ impl NetworkProtocolHandler for SyncProtocolHandler { } fn read(&self, io: &NetworkContext, peer: &PeerId, packet_id: u8, data: &[u8]) { - trace_time!("sync::read"); ChainSync::dispatch_packet(&self.sync, &mut NetSyncIo::new(io, &*self.chain, &*self.snapshot_service, &self.overlay), *peer, packet_id, data); } diff --git a/miner/src/pool/queue.rs b/miner/src/pool/queue.rs index f0f64790a1a..cba391955b4 100644 --- a/miner/src/pool/queue.rs +++ b/miner/src/pool/queue.rs @@ -43,6 +43,14 @@ type Pool = txpool::Pool Date: Mon, 2 Jul 2018 14:18:01 +0200 Subject: [PATCH 06/11] Reset debug. --- Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Cargo.toml b/Cargo.toml index 85d9201c17c..7424ba38bfa 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -117,7 +117,7 @@ name = "parity" [profile.dev] [profile.release] -debug = true +debug = false [workspace] members = [ From 93ad8b590c7f82e5b75f53053ba632f772b396d5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomasz=20Drwi=C4=99ga?= Date: Mon, 2 Jul 2018 14:10:12 +0200 Subject: [PATCH 07/11] Remove excessive tracing. --- ethcore/src/miner/pool_client.rs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/ethcore/src/miner/pool_client.rs b/ethcore/src/miner/pool_client.rs index 3f955d6a353..73820caaaf9 100644 --- a/ethcore/src/miner/pool_client.rs +++ b/ethcore/src/miner/pool_client.rs @@ -201,13 +201,12 @@ impl<'a, C: 'a> NonceClient for CachedNonceClient<'a, C> where let mut cache = self.cache.0.write(); let nonce = self.client.latest_nonce(address); cache.insert(*address, nonce); - warn!("NonceCache: inserting: [{:?}]", address); if cache.len() < self.cache.1 { return nonce } - warn!("NonceCache: reached limit."); + debug!(target: "txpool", "NonceCache: reached limit."); trace_time!("nonce_cache:clear"); // Remove excessive amount of entries from the cache From a2892e26b829fdb363e3aee50758bfbe4023a0ff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomasz=20Drwi=C4=99ga?= Date: Tue, 3 Jul 2018 13:57:41 +0200 Subject: [PATCH 08/11] Use struct for NonceCache. --- ethcore/private-tx/src/lib.rs | 15 +++++------- ethcore/src/miner/miner.rs | 10 ++++---- ethcore/src/miner/pool_client.rs | 40 ++++++++++++++++++++++++-------- 3 files changed, 41 insertions(+), 24 deletions(-) diff --git a/ethcore/private-tx/src/lib.rs b/ethcore/private-tx/src/lib.rs index 2caa7d41cdd..2034ea7fa7c 100644 --- a/ethcore/private-tx/src/lib.rs +++ b/ethcore/private-tx/src/lib.rs @@ -83,7 +83,7 @@ use ethcore::client::{ Client, ChainNotify, ChainRoute, ChainMessageType, ClientIoMessage, BlockId, CallContract }; use ethcore::account_provider::AccountProvider; -use ethcore::miner::{self, Miner, MinerService}; +use ethcore::miner::{self, Miner, MinerService, pool_client::NonceCache}; use ethcore::trace::{Tracer, VMTracer}; use rustc_hex::FromHex; use ethkey::Password; @@ -96,6 +96,9 @@ use_contract!(private, "PrivateContract", "res/private.json"); /// Initialization vector length. const INIT_VEC_LEN: usize = 16; +/// Size of nonce cache +const NONCE_CACHE_SIZE: usize = 128; + /// Configurtion for private transaction provider #[derive(Default, PartialEq, Debug, Clone)] pub struct ProviderConfig { @@ -264,7 +267,7 @@ impl Provider where { /// can be replaced with a single `drain()` method instead. /// Thanks to this we also don't really need to lock the entire verification for the time of execution. fn process_queue(&self) -> Result<(), Error> { - let nonce_cache = default_nonce_cache(); + let nonce_cache = NonceCache::new(NONCE_CACHE_SIZE); let mut verification_queue = self.transactions_for_verification.lock(); let ready_transactions = verification_queue.ready_transactions(self.pool_client(&nonce_cache)); for transaction in ready_transactions { @@ -585,7 +588,7 @@ impl Importer for Arc { trace!("Validating transaction: {:?}", original_tx); // Verify with the first account available trace!("The following account will be used for verification: {:?}", validation_account); - let nonce_cache = default_nonce_cache(); + let nonce_cache = NonceCache::new(NONCE_CACHE_SIZE); self.transactions_for_verification.lock().add_transaction( original_tx, contract, @@ -691,9 +694,3 @@ impl ChainNotify for Provider { } } } - -fn default_nonce_cache() -> NonceCache { - (Default::default(), 1024) -} - -type NonceCache = (RwLock>, usize); diff --git a/ethcore/src/miner/miner.rs b/ethcore/src/miner/miner.rs index 99fcc83b9bc..d860589e8c2 100644 --- a/ethcore/src/miner/miner.rs +++ b/ethcore/src/miner/miner.rs @@ -16,7 +16,7 @@ use std::cmp; use std::time::{Instant, Duration}; -use std::collections::{BTreeMap, HashSet, HashMap}; +use std::collections::{BTreeMap, HashSet}; use std::sync::Arc; use ansi_term::Colour; @@ -47,7 +47,7 @@ use client::BlockId; use executive::contract_address; use header::{Header, BlockNumber}; use miner; -use miner::pool_client::{PoolClient, CachedNonceClient}; +use miner::pool_client::{PoolClient, CachedNonceClient, NonceCache}; use receipt::{Receipt, RichReceipt}; use spec::Spec; use state::State; @@ -202,7 +202,7 @@ pub struct Miner { sealing: Mutex, params: RwLock, listeners: RwLock>>, - nonce_cache: (RwLock>, usize), + nonce_cache: NonceCache, gas_pricer: Mutex, options: MinerOptions, // TODO [ToDr] Arc is only required because of price updater @@ -242,7 +242,7 @@ impl Miner { params: RwLock::new(AuthoringParams::default()), listeners: RwLock::new(vec![]), gas_pricer: Mutex::new(gas_pricer), - nonce_cache: (RwLock::new(HashMap::with_capacity(nonce_cache_size / 2)), nonce_cache_size), + nonce_cache: NonceCache::new(nonce_cache_size), options, transaction_queue: Arc::new(TransactionQueue::new(limits, verifier_options, tx_queue_strategy)), accounts, @@ -1071,7 +1071,7 @@ impl miner::MinerService for Miner { if has_new_best_block { // Clear nonce cache - self.nonce_cache.0.write().clear(); + self.nonce_cache.clear(); } // First update gas limit in transaction queue and minimal gas price. diff --git a/ethcore/src/miner/pool_client.rs b/ethcore/src/miner/pool_client.rs index 73820caaaf9..789b2574f8e 100644 --- a/ethcore/src/miner/pool_client.rs +++ b/ethcore/src/miner/pool_client.rs @@ -36,7 +36,27 @@ use header::Header; use miner; use miner::service_transaction_checker::ServiceTransactionChecker; -type NoncesCache = (RwLock>, usize); +/// Cache for state nonces. +#[derive(Debug)] +pub struct NonceCache { + nonces: RwLock>, + limit: usize +} + +impl NonceCache { + /// Create new cache with a limit of `limit` entries. + pub fn new(limit: usize) -> Self { + NonceCache { + nonces: RwLock::new(HashMap::with_capacity(limit / 2)), + limit, + } + } + + /// Clear all entries from the cache. + pub fn clear(&self) { + self.nonces.write().clear(); + } +} /// Blockchain accesss for transaction pool. pub struct PoolClient<'a, C: 'a> { @@ -67,7 +87,7 @@ C: BlockInfo + CallContract, /// Creates new client given chain, nonce cache, accounts and service transaction verifier. pub fn new( chain: &'a C, - cache: &'a NoncesCache, + cache: &'a NonceCache, engine: &'a EthEngine, accounts: Option<&'a AccountProvider>, refuse_service_transactions: bool, @@ -158,7 +178,7 @@ impl<'a, C: 'a> NonceClient for PoolClient<'a, C> where pub(crate) struct CachedNonceClient<'a, C: 'a> { client: &'a C, - cache: &'a NoncesCache, + cache: &'a NonceCache, } impl<'a, C: 'a> Clone for CachedNonceClient<'a, C> { @@ -173,14 +193,14 @@ impl<'a, C: 'a> Clone for CachedNonceClient<'a, C> { impl<'a, C: 'a> fmt::Debug for CachedNonceClient<'a, C> { fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result { fmt.debug_struct("CachedNonceClient") - .field("cache", &self.cache.0.read().len()) - .field("limit", &self.cache.1) + .field("cache", &self.cache.nonces.read().len()) + .field("limit", &self.cache.limit) .finish() } } impl<'a, C: 'a> CachedNonceClient<'a, C> { - pub fn new(client: &'a C, cache: &'a NoncesCache) -> Self { + pub fn new(client: &'a C, cache: &'a NonceCache) -> Self { CachedNonceClient { client, cache, @@ -192,17 +212,17 @@ impl<'a, C: 'a> NonceClient for CachedNonceClient<'a, C> where C: Nonce + Sync, { fn account_nonce(&self, address: &Address) -> U256 { - if let Some(nonce) = self.cache.0.read().get(address) { + if let Some(nonce) = self.cache.nonces.read().get(address) { return *nonce; } // We don't check again if cache has been populated. // It's not THAT expensive to fetch the nonce from state. - let mut cache = self.cache.0.write(); + let mut cache = self.cache.nonces.write(); let nonce = self.client.latest_nonce(address); cache.insert(*address, nonce); - if cache.len() < self.cache.1 { + if cache.len() < self.cache.limit { return nonce } @@ -210,7 +230,7 @@ impl<'a, C: 'a> NonceClient for CachedNonceClient<'a, C> where trace_time!("nonce_cache:clear"); // Remove excessive amount of entries from the cache - let to_remove: Vec<_> = cache.keys().take(self.cache.1 / 2).cloned().collect(); + let to_remove: Vec<_> = cache.keys().take(self.cache.limit / 2).cloned().collect(); for x in to_remove { cache.remove(&x); } From 326330ed589bd8ea60a4aa63abcc950357148d85 Mon Sep 17 00:00:00 2001 From: Andrew Jones Date: Thu, 5 Jul 2018 11:22:41 +0100 Subject: [PATCH 09/11] Fix build --- ethcore/src/miner/miner.rs | 4 ++-- ethcore/src/miner/pool_client.rs | 5 +++++ 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/ethcore/src/miner/miner.rs b/ethcore/src/miner/miner.rs index cbc89b4a9fc..d196dc2f08c 100644 --- a/ethcore/src/miner/miner.rs +++ b/ethcore/src/miner/miner.rs @@ -16,7 +16,7 @@ use std::cmp; use std::time::{Instant, Duration}; -use std::collections::{BTreeMap, BTreeSet, HashSet, HashMap}; +use std::collections::{BTreeMap, BTreeSet, HashSet}; use std::sync::Arc; use ansi_term::Colour; @@ -885,7 +885,7 @@ impl miner::MinerService for Miner { let chain_info = chain.chain_info(); let from_queue = || self.transaction_queue.pending_hashes( - |sender| self.nonce_cache.read().get(sender).cloned(), + |sender| self.nonce_cache.get(sender), ); let from_pending = || { diff --git a/ethcore/src/miner/pool_client.rs b/ethcore/src/miner/pool_client.rs index 789b2574f8e..b423b1a87f8 100644 --- a/ethcore/src/miner/pool_client.rs +++ b/ethcore/src/miner/pool_client.rs @@ -56,6 +56,11 @@ impl NonceCache { pub fn clear(&self) { self.nonces.write().clear(); } + + /// Get an entry from the cache + pub fn get(&self, sender: &Address) -> Option { + self.nonces.read().get(sender).cloned() + } } /// Blockchain accesss for transaction pool. From 832d171b2e8dc4257a9e5fe86f15c37e30f25734 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomasz=20Drwi=C4=99ga?= Date: Thu, 5 Jul 2018 14:23:53 +0200 Subject: [PATCH 10/11] Remove warnings. --- Cargo.lock | 1 - ethcore/res/wasm-tests | 2 +- ethcore/src/client/config.rs | 2 +- ethcore/src/miner/pool_client.rs | 5 +++++ 4 files changed, 7 insertions(+), 3 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 855cc5e628d..64fffe0e1a3 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -558,7 +558,6 @@ dependencies = [ "ethstore 0.2.0", "evm 0.1.0", "fake-hardware-wallet 0.0.1", - "fetch 0.1.0", "hardware-wallet 1.12.0", "hashdb 0.2.0", "heapsize 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", diff --git a/ethcore/res/wasm-tests b/ethcore/res/wasm-tests index fb111c82def..474110de59a 160000 --- a/ethcore/res/wasm-tests +++ b/ethcore/res/wasm-tests @@ -1 +1 @@ -Subproject commit fb111c82deff8759f54a5038d07cecc77cb5a663 +Subproject commit 474110de59a0f632b20615256c913b144c49354c diff --git a/ethcore/src/client/config.rs b/ethcore/src/client/config.rs index 1045ea610c3..c8b931dee28 100644 --- a/ethcore/src/client/config.rs +++ b/ethcore/src/client/config.rs @@ -152,7 +152,7 @@ impl Default for ClientConfig { } #[cfg(test)] mod test { - use super::{DatabaseCompactionProfile, Mode}; + use super::{DatabaseCompactionProfile}; #[test] fn test_default_compaction_profile() { diff --git a/ethcore/src/miner/pool_client.rs b/ethcore/src/miner/pool_client.rs index b423b1a87f8..3f4ff4194bb 100644 --- a/ethcore/src/miner/pool_client.rs +++ b/ethcore/src/miner/pool_client.rs @@ -52,6 +52,11 @@ impl NonceCache { } } + /// Retrieve a cached nonce for given sender. + pub fn get(&self, sender: &Address) -> Option { + self.nonces.read().get(sender).cloned() + } + /// Clear all entries from the cache. pub fn clear(&self) { self.nonces.write().clear(); From d3e7cc1dd6f29cdf33188391ab1e2b2b326c9e8b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomasz=20Drwi=C4=99ga?= Date: Thu, 5 Jul 2018 16:30:46 +0200 Subject: [PATCH 11/11] Fix build again. --- ethcore/src/miner/pool_client.rs | 5 ----- 1 file changed, 5 deletions(-) diff --git a/ethcore/src/miner/pool_client.rs b/ethcore/src/miner/pool_client.rs index 3f4ff4194bb..f537a2757e2 100644 --- a/ethcore/src/miner/pool_client.rs +++ b/ethcore/src/miner/pool_client.rs @@ -61,11 +61,6 @@ impl NonceCache { pub fn clear(&self) { self.nonces.write().clear(); } - - /// Get an entry from the cache - pub fn get(&self, sender: &Address) -> Option { - self.nonces.read().get(sender).cloned() - } } /// Blockchain accesss for transaction pool.