From b7caa24c2eb76536a33177301efdf7e202ab8ae2 Mon Sep 17 00:00:00 2001 From: Arkadiy Paronyan Date: Fri, 15 Jul 2016 10:13:12 +0200 Subject: [PATCH] don't batch best block for branches (#1623) (#1626) --- ethcore/src/blockchain/blockchain.rs | 41 +++++++++++++++++++++++----- 1 file changed, 34 insertions(+), 7 deletions(-) diff --git a/ethcore/src/blockchain/blockchain.rs b/ethcore/src/blockchain/blockchain.rs index 3cde32e59b0..811c9596e7a 100644 --- a/ethcore/src/blockchain/blockchain.rs +++ b/ethcore/src/blockchain/blockchain.rs @@ -488,7 +488,6 @@ impl BlockChain { /// Applies extras update. fn apply_update(&self, update: ExtrasUpdate) { let batch = DBTransaction::new(); - batch.put(b"best", &update.info.hash).unwrap(); { for hash in update.block_details.keys().cloned() { @@ -511,14 +510,12 @@ impl BlockChain { // These cached values must be updated last and togeterh { - let mut best_block = self.best_block.write().unwrap(); - let mut write_hashes = self.block_hashes.write().unwrap(); - let mut write_txs = self.transaction_addresses.write().unwrap(); - // update best block match update.info.location { BlockLocation::Branch => (), _ => { + batch.put(b"best", &update.info.hash).unwrap(); + let mut best_block = self.best_block.write().unwrap(); *best_block = BestBlock { hash: update.info.hash, number: update.info.number, @@ -527,8 +524,11 @@ impl BlockChain { } } - batch.extend_with_cache(write_hashes.deref_mut(), update.block_hashes, CacheUpdatePolicy::Remove); - batch.extend_with_cache(write_txs.deref_mut(), update.transactions_addresses, CacheUpdatePolicy::Remove); + let mut write_hashes = self.block_hashes.write().unwrap(); + let mut write_txs = self.transaction_addresses.write().unwrap(); + + batch.extend_with_cache(&mut *write_hashes, update.block_hashes, CacheUpdatePolicy::Remove); + batch.extend_with_cache(&mut *write_txs, update.transactions_addresses, CacheUpdatePolicy::Remove); // update extras database self.extras_db.write(batch).unwrap(); @@ -1189,4 +1189,31 @@ mod tests { assert_eq!(blocks_b2, vec![2]); assert_eq!(blocks_ba, vec![3]); } + + #[test] + fn test_best_block_update() { + let mut canon_chain = ChainGenerator::default(); + let mut finalizer = BlockFinalizer::default(); + let genesis = canon_chain.generate(&mut finalizer).unwrap(); + + let temp = RandomTempPath::new(); + + { + let bc = BlockChain::new(Config::default(), &genesis, temp.as_path()); + let uncle = canon_chain.fork(1).generate(&mut finalizer.fork()).unwrap(); + + // create a longer fork + for _ in 0..5 { + let canon_block = canon_chain.generate(&mut finalizer).unwrap(); + bc.insert_block(&canon_block, vec![]); + } + + assert_eq!(bc.best_block_number(), 5); + bc.insert_block(&uncle, vec![]); + } + + // re-loading the blockchain should load the correct best block. + let bc = BlockChain::new(Config::default(), &genesis, temp.as_path()); + assert_eq!(bc.best_block_number(), 5); + } }