aboutsummaryrefslogtreecommitdiffstats
path: root/core/chain_manager.go
diff options
context:
space:
mode:
authorobscuren <geffobscura@gmail.com>2015-04-28 23:48:46 +0800
committerobscuren <geffobscura@gmail.com>2015-04-29 18:51:04 +0800
commit7ac24d551bf41bca4deec9f47239c4c0d052e721 (patch)
tree6370f226e394e8587acce93e988b0ac730ff4e5a /core/chain_manager.go
parent9f32117457505f49001c324658f00833ab724667 (diff)
downloaddexon-7ac24d551bf41bca4deec9f47239c4c0d052e721.tar.gz
dexon-7ac24d551bf41bca4deec9f47239c4c0d052e721.tar.zst
dexon-7ac24d551bf41bca4deec9f47239c4c0d052e721.zip
core: seperated proccing mutex and getting mutex
Diffstat (limited to 'core/chain_manager.go')
-rw-r--r--core/chain_manager.go88
1 files changed, 47 insertions, 41 deletions
diff --git a/core/chain_manager.go b/core/chain_manager.go
index 9bb14b0cd..56895b73e 100644
--- a/core/chain_manager.go
+++ b/core/chain_manager.go
@@ -74,8 +74,10 @@ type ChainManager struct {
eventMux *event.TypeMux
genesisBlock *types.Block
// Last known total difficulty
- mu sync.RWMutex
- tsmu sync.RWMutex
+ mu sync.RWMutex
+ tsmu sync.RWMutex
+ insertMu sync.Mutex
+
td *big.Int
currentBlock *types.Block
lastBlockHash common.Hash
@@ -496,8 +498,8 @@ func (self *ChainManager) procFutureBlocks() {
}
func (self *ChainManager) InsertChain(chain types.Blocks) error {
- self.mu.Lock()
- defer self.mu.Unlock()
+ self.insertMu.Lock()
+ defer self.insertMu.Unlock()
// A queued approach to delivering events. This is generally faster than direct delivery and requires much less mutex acquiring.
var (
@@ -546,51 +548,55 @@ func (self *ChainManager) InsertChain(chain types.Blocks) error {
block.Td = new(big.Int).Set(CalculateTD(block, self.GetBlock(block.ParentHash())))
- cblock := self.currentBlock
- // Write block to database. Eventually we'll have to improve on this and throw away blocks that are
- // not in the canonical chain.
- self.write(block)
- // Compare the TD of the last known block in the canonical chain to make sure it's greater.
- // At this point it's possible that a different chain (fork) becomes the new canonical chain.
- if block.Td.Cmp(self.td) > 0 {
- //if block.Header().Number.Cmp(new(big.Int).Add(cblock.Header().Number, common.Big1)) < 0 {
- if block.Number().Cmp(cblock.Number()) <= 0 {
- chash := cblock.Hash()
- hash := block.Hash()
-
- if glog.V(logger.Info) {
- glog.Infof("Split detected. New head #%v (%x) TD=%v, was #%v (%x) TD=%v\n", block.Header().Number, hash[:4], block.Td, cblock.Header().Number, chash[:4], self.td)
- }
- // during split we merge two different chains and create the new canonical chain
- self.merge(self.getBlockByNumber(block.NumberU64()), block)
+ self.mu.Lock()
+ {
+ cblock := self.currentBlock
+ // Write block to database. Eventually we'll have to improve on this and throw away blocks that are
+ // not in the canonical chain.
+ self.write(block)
+ // Compare the TD of the last known block in the canonical chain to make sure it's greater.
+ // At this point it's possible that a different chain (fork) becomes the new canonical chain.
+ if block.Td.Cmp(self.td) > 0 {
+ //if block.Header().Number.Cmp(new(big.Int).Add(cblock.Header().Number, common.Big1)) < 0 {
+ if block.Number().Cmp(cblock.Number()) <= 0 {
+ chash := cblock.Hash()
+ hash := block.Hash()
+
+ if glog.V(logger.Info) {
+ glog.Infof("Split detected. New head #%v (%x) TD=%v, was #%v (%x) TD=%v\n", block.Header().Number, hash[:4], block.Td, cblock.Header().Number, chash[:4], self.td)
+ }
+ // during split we merge two different chains and create the new canonical chain
+ self.merge(self.getBlockByNumber(block.NumberU64()), block)
- queue[i] = ChainSplitEvent{block, logs}
- queueEvent.splitCount++
- }
+ queue[i] = ChainSplitEvent{block, logs}
+ queueEvent.splitCount++
+ }
- self.setTotalDifficulty(block.Td)
- self.insert(block)
+ self.setTotalDifficulty(block.Td)
+ self.insert(block)
- jsonlogger.LogJson(&logger.EthChainNewHead{
- BlockHash: block.Hash().Hex(),
- BlockNumber: block.Number(),
- ChainHeadHash: cblock.Hash().Hex(),
- BlockPrevHash: block.ParentHash().Hex(),
- })
+ jsonlogger.LogJson(&logger.EthChainNewHead{
+ BlockHash: block.Hash().Hex(),
+ BlockNumber: block.Number(),
+ ChainHeadHash: cblock.Hash().Hex(),
+ BlockPrevHash: block.ParentHash().Hex(),
+ })
- self.setTransState(state.New(block.Root(), self.stateDb))
- self.txState.SetState(state.New(block.Root(), self.stateDb))
+ self.setTransState(state.New(block.Root(), self.stateDb))
+ self.txState.SetState(state.New(block.Root(), self.stateDb))
- queue[i] = ChainEvent{block, logs}
- queueEvent.canonicalCount++
+ queue[i] = ChainEvent{block, logs}
+ queueEvent.canonicalCount++
- if glog.V(logger.Debug) {
- glog.Infof("inserted block #%d (%d TXs %d UNCs) (%x...)\n", block.Number(), len(block.Transactions()), len(block.Uncles()), block.Hash().Bytes()[0:4])
+ if glog.V(logger.Debug) {
+ glog.Infof("inserted block #%d (%d TXs %d UNCs) (%x...)\n", block.Number(), len(block.Transactions()), len(block.Uncles()), block.Hash().Bytes()[0:4])
+ }
+ } else {
+ queue[i] = ChainSideEvent{block, logs}
+ queueEvent.sideCount++
}
- } else {
- queue[i] = ChainSideEvent{block, logs}
- queueEvent.sideCount++
}
+ self.mu.Unlock()
stats.processed++