diff options
author | obscuren <geffobscura@gmail.com> | 2015-04-20 22:02:50 +0800 |
---|---|---|
committer | obscuren <geffobscura@gmail.com> | 2015-04-20 22:02:50 +0800 |
commit | 72d065d49102dd07c929d1e147186604c5e4ab05 (patch) | |
tree | db62f3c8eabf88269707eaba69b0755b920df50a | |
parent | 97a9753f87cce4f0072feba63f2e137138a16063 (diff) | |
download | go-tangerine-72d065d49102dd07c929d1e147186604c5e4ab05.tar.gz go-tangerine-72d065d49102dd07c929d1e147186604c5e4ab05.tar.zst go-tangerine-72d065d49102dd07c929d1e147186604c5e4ab05.zip |
core: force block process & fixed chain manager test
-rw-r--r-- | core/block_processor.go | 14 | ||||
-rw-r--r-- | core/chain_manager.go | 7 | ||||
-rw-r--r-- | core/chain_manager_test.go | 7 |
3 files changed, 24 insertions, 4 deletions
diff --git a/core/block_processor.go b/core/block_processor.go index b624037a5..3030af27d 100644 --- a/core/block_processor.go +++ b/core/block_processor.go @@ -149,6 +149,20 @@ func (self *BlockProcessor) ApplyTransactions(coinbase *state.StateObject, state return receipts, err } +func (sm *BlockProcessor) RetryProcess(block *types.Block) (logs state.Logs, err error) { + // Processing a blocks may never happen simultaneously + sm.mutex.Lock() + defer sm.mutex.Unlock() + + header := block.Header() + if !sm.bc.HasBlock(header.ParentHash) { + return nil, ParentError(header.ParentHash) + } + parent := sm.bc.GetBlock(header.ParentHash) + + return sm.processWithParent(block, parent) +} + // Process block will attempt to process the given block's transactions and applies them // on top of the block's parent state (given it exists) and will return wether it was // successful or not. diff --git a/core/chain_manager.go b/core/chain_manager.go index dcd8df28f..3f2b3a26a 100644 --- a/core/chain_manager.go +++ b/core/chain_manager.go @@ -322,7 +322,12 @@ func (self *ChainManager) Export(w io.Writer) error { last := self.currentBlock.NumberU64() for nr := uint64(0); nr <= last; nr++ { - if err := self.GetBlockByNumber(nr).EncodeRLP(w); err != nil { + block := self.GetBlockByNumber(nr) + if block == nil { + return fmt.Errorf("export failed on #%d: not found", nr) + } + + if err := block.EncodeRLP(w); err != nil { return err } } diff --git a/core/chain_manager_test.go b/core/chain_manager_test.go index 19afe0d5c..f16c0f0c3 100644 --- a/core/chain_manager_test.go +++ b/core/chain_manager_test.go @@ -69,15 +69,16 @@ func printChain(bc *ChainManager) { func testChain(chainB types.Blocks, bman *BlockProcessor) (*big.Int, error) { td := new(big.Int) for _, block := range chainB { - td2, _, err := bman.bc.processor.Process(block) + _, err := bman.bc.processor.Process(block) if err != nil { if IsKnownBlockErr(err) { continue } return nil, err } - block.Td = td2 - td = td2 + parent := bman.bc.GetBlock(block.ParentHash()) + block.Td = CalculateTD(block, parent) + td = block.Td bman.bc.mu.Lock() { |