From 7f2e2158c8d2081e6e54684c9455e00cbfba4daa Mon Sep 17 00:00:00 2001 From: Ignotus Peverell Date: Fri, 5 Oct 2018 12:17:58 -0700 Subject: [PATCH] Reduce the scope of the chain new block lock (#1666) When processing a new block, attemps to make the scope of the corresponding `txhashet` lock as small as possible. The idea is to avoid bad interactions with orphan locks or block post processing (i.e. adapter events, etc) --- chain/src/chain.rs | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/chain/src/chain.rs b/chain/src/chain.rs index d8fb5493f..829d8269c 100644 --- a/chain/src/chain.rs +++ b/chain/src/chain.rs @@ -217,11 +217,19 @@ impl Chain { /// Returns true if it has been added to the longest chain /// or false if it has added to a fork (or orphan?). fn process_block_single(&self, b: Block, opts: Options) -> Result, Error> { - let batch = self.store.batch()?; - let mut txhashset = self.txhashset.write().unwrap(); - let mut ctx = self.new_ctx(opts, batch, &mut txhashset)?; + let maybe_new_head: Result, Error>; + { + let batch = self.store.batch()?; + let mut txhashset = self.txhashset.write().unwrap(); + let mut ctx = self.new_ctx(opts, batch, &mut txhashset)?; + + maybe_new_head = pipe::process_block(&b, &mut ctx); + if let Ok(_) = maybe_new_head { + ctx.batch.commit()?; + } + // release the lock and let the batch go before post-processing + } - // let hash = b.hash(); let add_to_hash_cache = |hash: Hash| { // only add to hash cache below if block is definitively accepted // or rejected @@ -229,11 +237,8 @@ impl Chain { cache.insert(hash, true); }; - match pipe::process_block(&b, &mut ctx) { + match maybe_new_head { Ok(head) => { - // Commit the batch in the ctx to the db. - ctx.batch.commit()?; - add_to_hash_cache(b.hash()); // notifying other parts of the system of the update @@ -251,10 +256,6 @@ impl Chain { added: Instant::now(), }; - // In the case of a fork - it is possible to have multiple blocks - // that are children of a given block. - // We do not handle this currently for orphans (future enhancement?). - // We just assume "last one wins" for now. &self.orphans.add(orphan); debug!(