diff options
author | Wei-Ning Huang <w@dexon.org> | 2018-11-19 10:54:12 +0800 |
---|---|---|
committer | Wei-Ning Huang <w@byzantine-lab.io> | 2019-06-12 17:27:18 +0800 |
commit | 8a0b917def2d80b112d7d8a5854aba62afc0a630 (patch) | |
tree | e0df071307b6aeba138fe180992aa7e978f42b50 | |
parent | e5ebb174d61a6f7b0b9c6023b15c33a246b2c14f (diff) | |
download | go-tangerine-8a0b917def2d80b112d7d8a5854aba62afc0a630.tar go-tangerine-8a0b917def2d80b112d7d8a5854aba62afc0a630.tar.gz go-tangerine-8a0b917def2d80b112d7d8a5854aba62afc0a630.tar.bz2 go-tangerine-8a0b917def2d80b112d7d8a5854aba62afc0a630.tar.lz go-tangerine-8a0b917def2d80b112d7d8a5854aba62afc0a630.tar.xz go-tangerine-8a0b917def2d80b112d7d8a5854aba62afc0a630.tar.zst go-tangerine-8a0b917def2d80b112d7d8a5854aba62afc0a630.zip |
core: blockchain: fix concurrent map read and write (#34)
-rw-r--r-- | core/blockchain.go | 11 |
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 |