aboutsummaryrefslogtreecommitdiffstats
path: root/core/blockchain.go
diff options
context:
space:
mode:
authorWei-Ning Huang <w@dexon.org>2018-11-19 10:54:12 +0800
committerWei-Ning Huang <w@byzantine-lab.io>2019-06-12 17:27:18 +0800
commit8a0b917def2d80b112d7d8a5854aba62afc0a630 (patch)
treee0df071307b6aeba138fe180992aa7e978f42b50 /core/blockchain.go
parente5ebb174d61a6f7b0b9c6023b15c33a246b2c14f (diff)
downloadgo-tangerine-8a0b917def2d80b112d7d8a5854aba62afc0a630.tar.gz
go-tangerine-8a0b917def2d80b112d7d8a5854aba62afc0a630.tar.zst
go-tangerine-8a0b917def2d80b112d7d8a5854aba62afc0a630.zip
core: blockchain: fix concurrent map read and write (#34)
Diffstat (limited to 'core/blockchain.go')
-rw-r--r--core/blockchain.go11
1 files changed, 7 insertions, 4 deletions
diff --git a/core/blockchain.go b/core/blockchain.go
index f4f4c425c..a67e2a13f 100644
--- a/core/blockchain.go
+++ b/core/blockchain.go
@@ -150,7 +150,7 @@ type BlockChain struct {
addressNonce map[uint32]map[common.Address]uint64
addressCost map[uint32]map[common.Address]*big.Int
addressCounter map[uint32]map[common.Address]uint64
- chainLastHeight map[uint32]uint64
+ chainLastHeight sync.Map
pendingBlockMu sync.RWMutex
lastPendingHeight uint64
@@ -201,7 +201,6 @@ func NewBlockChain(db ethdb.Database, cacheConfig *CacheConfig, chainConfig *par
addressNonce: make(map[uint32]map[common.Address]uint64),
addressCost: make(map[uint32]map[common.Address]*big.Int),
addressCounter: make(map[uint32]map[common.Address]uint64),
- chainLastHeight: make(map[uint32]uint64),
}
bc.SetValidator(NewBlockValidator(chainConfig, bc, engine))
bc.SetProcessor(NewStateProcessor(chainConfig, bc, engine))
@@ -301,7 +300,7 @@ func (bc *BlockChain) AddConfirmedBlock(block *coreTypes.Block) error {
block: block,
txs: transactions,
}
- bc.chainLastHeight[chainID] = block.Position.Height
+ bc.chainLastHeight.Store(chainID, block.Position.Height)
return nil
}
@@ -344,7 +343,11 @@ func (bc *BlockChain) GetCostInConfirmedBlocks(chainID uint32, address common.Ad
}
func (bc *BlockChain) GetChainLastConfirmedHeight(chainID uint32) uint64 {
- return bc.chainLastHeight[chainID]
+ val, ok := bc.chainLastHeight.Load(chainID)
+ if !ok {
+ panic(fmt.Errorf("failed to get chain last height, chainID = %d", chainID))
+ }
+ return val.(uint64)
}
// loadLastState loads the last known chain state from the database. This method