From 9454ef5c287fc95dfae08bcc129a7539e2f25d5d Mon Sep 17 00:00:00 2001 From: Roman Khimov Date: Tue, 12 May 2020 17:45:17 +0300 Subject: [PATCH] core: improve locking in storeBlock Getting batch, updating Prometheus metrics and pushing events doesn't require any locking: batch is a local cache batch that no one outside cares about, Prometheus metrics are not critical to be in perfect sync and events are asynchronous anyway. --- pkg/core/blockchain.go | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/pkg/core/blockchain.go b/pkg/core/blockchain.go index ab54b8d09..243f6bbbf 100644 --- a/pkg/core/blockchain.go +++ b/pkg/core/blockchain.go @@ -818,21 +818,23 @@ func (bc *Blockchain) storeBlock(block *block.Block) error { } } } - bc.lock.Lock() - defer bc.lock.Unlock() if bc.config.SaveStorageBatch { bc.lastBatch = cache.DAO.GetBatch() } + bc.lock.Lock() _, err := cache.Persist() if err != nil { + bc.lock.Unlock() return err } bc.topBlock.Store(block) atomic.StoreUint32(&bc.blockHeight, block.Index) - updateBlockHeightMetric(block.Index) bc.memPool.RemoveStale(bc.isTxStillRelevant) + bc.lock.Unlock() + + updateBlockHeightMetric(block.Index) // Genesis block is stored when Blockchain is not yet running, so there // is no one to read this event. And it doesn't make much sense as event // anyway.