diff options
author | Wei-Ning Huang <w@dexon.org> | 2018-11-19 10:54:12 +0800 |
---|---|---|
committer | Wei-Ning Huang <w@dexon.org> | 2019-04-09 21:32:53 +0800 |
commit | 637fa3808231dea5083a8fd5a7b10c318902d9fa (patch) | |
tree | 151fce3009eec7809438d347d4efbc7c48a58774 | |
parent | bdfdd7cd028518e0bbbc6a7e0ed8322190b80582 (diff) | |
download | dexon-637fa3808231dea5083a8fd5a7b10c318902d9fa.tar.gz dexon-637fa3808231dea5083a8fd5a7b10c318902d9fa.tar.zst dexon-637fa3808231dea5083a8fd5a7b10c318902d9fa.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 |