Commit 8a3ce545 authored by Jeffrey Wilcke's avatar Jeffrey Wilcke

Merge pull request #2311 from obscuren/future-proc-fix

core: added future proc mutex lock
parents 08759b0a 558d18d2
...@@ -85,10 +85,9 @@ type BlockChain struct { ...@@ -85,10 +85,9 @@ type BlockChain struct {
eventMux *event.TypeMux eventMux *event.TypeMux
genesisBlock *types.Block genesisBlock *types.Block
mu sync.RWMutex mu sync.RWMutex // global mutex for locking chain operations
chainmu sync.RWMutex chainmu sync.RWMutex // blockchain insertion lock
tsmu sync.RWMutex procmu sync.RWMutex // block processor lock
procmu sync.RWMutex
checkpoint int // checkpoint counts towards the new checkpoint checkpoint int // checkpoint counts towards the new checkpoint
currentBlock *types.Block // Current head of the block chain currentBlock *types.Block // Current head of the block chain
...@@ -99,15 +98,15 @@ type BlockChain struct { ...@@ -99,15 +98,15 @@ type BlockChain struct {
blockCache *lru.Cache // Cache for the most recent entire blocks blockCache *lru.Cache // Cache for the most recent entire blocks
futureBlocks *lru.Cache // future blocks are blocks added for later processing futureBlocks *lru.Cache // future blocks are blocks added for later processing
quit chan struct{} quit chan struct{} // blockchain quit channel
running int32 // running must be called automically running int32 // running must be called automically
// procInterrupt must be atomically called // procInterrupt must be atomically called
procInterrupt int32 // interrupt signaler for block processing procInterrupt int32 // interrupt signaler for block processing
wg sync.WaitGroup wg sync.WaitGroup // chain processing wait group for shutting down
pow pow.PoW pow pow.PoW
processor Processor processor Processor // block processor interface
validator Validator validator Validator // block and state validator interface
} }
// NewBlockChain returns a fully initialised block chain using information // NewBlockChain returns a fully initialised block chain using information
...@@ -567,10 +566,11 @@ func (bc *BlockChain) Stop() { ...@@ -567,10 +566,11 @@ func (bc *BlockChain) Stop() {
} }
func (self *BlockChain) procFutureBlocks() { func (self *BlockChain) procFutureBlocks() {
blocks := make([]*types.Block, self.futureBlocks.Len()) blocks := make([]*types.Block, 0, self.futureBlocks.Len())
for i, hash := range self.futureBlocks.Keys() { for _, hash := range self.futureBlocks.Keys() {
block, _ := self.futureBlocks.Get(hash) if block, exist := self.futureBlocks.Get(hash); exist {
blocks[i] = block.(*types.Block) blocks = append(blocks, block.(*types.Block))
}
} }
if len(blocks) > 0 { if len(blocks) > 0 {
types.BlockBy(types.Number).Sort(blocks) types.BlockBy(types.Number).Sort(blocks)
...@@ -794,6 +794,7 @@ func (self *BlockChain) WriteBlock(block *types.Block) (status WriteStatus, err ...@@ -794,6 +794,7 @@ func (self *BlockChain) WriteBlock(block *types.Block) (status WriteStatus, err
if err := WriteBlock(self.chainDb, block); err != nil { if err := WriteBlock(self.chainDb, block); err != nil {
glog.Fatalf("filed to write block contents: %v", err) glog.Fatalf("filed to write block contents: %v", err)
} }
self.futureBlocks.Remove(block.Hash()) self.futureBlocks.Remove(block.Hash())
return return
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment