aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--core/consensus.go4
-rw-r--r--core/lattice.go5
2 files changed, 7 insertions, 2 deletions
diff --git a/core/consensus.go b/core/consensus.go
index ab59a67..05f93e1 100644
--- a/core/consensus.go
+++ b/core/consensus.go
@@ -830,6 +830,10 @@ func (con *Consensus) processBlock(block *types.Block) (err error) {
if err = con.db.Put(*block); err != nil && err != blockdb.ErrBlockExists {
return
}
+ con.lock.Lock()
+ defer con.lock.Unlock()
+ // Block processed by lattice can be out-of-order. But the output of lattice
+ // (deliveredBlocks) cannot.
deliveredBlocks, err := con.lattice.ProcessBlock(block)
if err != nil {
return
diff --git a/core/lattice.go b/core/lattice.go
index 69ad51c..06005c1 100644
--- a/core/lattice.go
+++ b/core/lattice.go
@@ -161,8 +161,6 @@ func (s *Lattice) SanityCheck(b *types.Block) (err error) {
// NOTE: assume the block passed sanity check.
func (s *Lattice) addBlockToLattice(
input *types.Block) (outputBlocks []*types.Block, err error) {
- s.lock.Lock()
- defer s.lock.Unlock()
if tip := s.data.chains[input.Position.ChainID].tip; tip != nil {
if !input.Position.Newer(&tip.Position) {
return
@@ -226,6 +224,9 @@ func (s *Lattice) ProcessBlock(
deliveredMode uint32
)
+ s.lock.Lock()
+ defer s.lock.Unlock()
+
if inLattice, err = s.addBlockToLattice(input); err != nil {
return
}