OSDN Git Service

4caf9f751929e002a5e5cade7c90fe21db49dc74
[bytom/vapor.git] / netsync / chainmgr / block_process.go
1 package chainmgr
2
3 import (
4         "sync"
5
6         log "github.com/sirupsen/logrus"
7
8         "github.com/vapor/netsync/peers"
9         "github.com/vapor/p2p/security"
10 )
11
12 type BlockProcessor interface {
13         process(chan struct{}, chan struct{}, *sync.WaitGroup)
14 }
15
16 type blockProcessor struct {
17         chain   Chain
18         storage Storage
19         peers   *peers.PeerSet
20 }
21
22 func newBlockProcessor(chain Chain, storage Storage, peers *peers.PeerSet) *blockProcessor {
23         return &blockProcessor{
24                 chain:   chain,
25                 peers:   peers,
26                 storage: storage,
27         }
28 }
29
30 func (bp *blockProcessor) insert(blockStorage *blockStorage) error {
31         isOrphan, err := bp.chain.ProcessBlock(blockStorage.block)
32         if err != nil || isOrphan {
33                 bp.peers.ProcessIllegal(blockStorage.peerID, security.LevelMsgIllegal, err.Error())
34         }
35         return err
36 }
37
38 func (bp *blockProcessor) process(downloadNotifyCh chan struct{}, ProcessStop chan struct{}, wg *sync.WaitGroup) {
39         defer func() {
40                 close(ProcessStop)
41                 wg.Done()
42         }()
43
44         for {
45                 for {
46                         nextHeight := bp.chain.BestBlockHeight() + 1
47                         block, err := bp.storage.readBlock(nextHeight)
48                         if err != nil {
49                                 break
50                         }
51
52                         if err := bp.insert(block); err != nil {
53                                 log.WithFields(log.Fields{"module": logModule, "err": err}).Error("failed on process block")
54                                 return
55                         }
56
57                         bp.storage.deleteBlock(nextHeight)
58                 }
59
60                 if _, ok := <-downloadNotifyCh; !ok {
61                         return
62                 }
63         }
64 }