OSDN Git Service

Format netsync module code directory (#88)
[bytom/vapor.git] / netsync / sync_manager.go
1 package netsync
2
3 import (
4         "errors"
5
6         log "github.com/sirupsen/logrus"
7
8         cfg "github.com/vapor/config"
9         "github.com/vapor/consensus"
10         "github.com/vapor/event"
11         "github.com/vapor/netsync/chainmgr"
12         "github.com/vapor/netsync/peers"
13         "github.com/vapor/p2p"
14         core "github.com/vapor/protocol"
15 )
16
17 const (
18         logModule = "netsync"
19 )
20
21 var (
22         errVaultModeDialPeer = errors.New("can't dial peer in vault mode")
23 )
24
25 type ChainMgr interface {
26         Start() error
27         IsCaughtUp() bool
28         Stop()
29 }
30
31 type Switch interface {
32         Start() (bool, error)
33         Stop() bool
34         IsListening() bool
35         DialPeerWithAddress(addr *p2p.NetAddress) error
36         Peers() *p2p.PeerSet
37 }
38
39 //SyncManager Sync Manager is responsible for the business layer information synchronization
40 type SyncManager struct {
41         config   *cfg.Config
42         sw       Switch
43         chainMgr ChainMgr
44         peers    *peers.PeerSet
45 }
46
47 // NewSyncManager create sync manager and set switch.
48 func NewSyncManager(config *cfg.Config, chain *core.Chain, txPool *core.TxPool, dispatcher *event.Dispatcher) (*SyncManager, error) {
49         sw, err := p2p.NewSwitch(config)
50         if err != nil {
51                 return nil, err
52         }
53         peers := peers.NewPeerSet(sw)
54
55         chainManger, err := chainmgr.NewChainManager(config, sw, chain, txPool, dispatcher, peers)
56         if err != nil {
57                 return nil, err
58         }
59
60         return &SyncManager{
61                 config:   config,
62                 sw:       sw,
63                 chainMgr: chainManger,
64                 peers:    peers,
65         }, nil
66 }
67
68 func (sm *SyncManager) Start() error {
69         if _, err := sm.sw.Start(); err != nil {
70                 log.WithFields(log.Fields{"module": logModule, "err": err}).Error("failed start switch")
71                 return err
72         }
73
74         return sm.chainMgr.Start()
75 }
76
77 func (sm *SyncManager) Stop() {
78         sm.chainMgr.Stop()
79         if !sm.config.VaultMode {
80                 sm.sw.Stop()
81         }
82
83 }
84
85 func (sm *SyncManager) IsListening() bool {
86         if sm.config.VaultMode {
87                 return false
88         }
89         return sm.sw.IsListening()
90
91 }
92
93 //IsCaughtUp check wheather the peer finish the sync
94 func (sm *SyncManager) IsCaughtUp() bool {
95         return sm.chainMgr.IsCaughtUp()
96 }
97
98 func (sm *SyncManager) PeerCount() int {
99         if sm.config.VaultMode {
100                 return 0
101         }
102         return len(sm.sw.Peers().List())
103 }
104
105 func (sm *SyncManager) GetNetwork() string {
106         return sm.config.ChainID
107 }
108
109 func (sm *SyncManager) BestPeer() *peers.PeerInfo {
110         bestPeer := sm.peers.BestPeer(consensus.SFFullNode)
111         if bestPeer != nil {
112                 return bestPeer.GetPeerInfo()
113         }
114         return nil
115 }
116
117 func (sm *SyncManager) DialPeerWithAddress(addr *p2p.NetAddress) error {
118         if sm.config.VaultMode {
119                 return errVaultModeDialPeer
120         }
121
122         return sm.sw.DialPeerWithAddress(addr)
123 }
124
125 //GetPeerInfos return peer info of all peers
126 func (sm *SyncManager) GetPeerInfos() []*peers.PeerInfo {
127         return sm.peers.GetPeerInfos()
128 }
129
130 //StopPeer try to stop peer by given ID
131 func (sm *SyncManager) StopPeer(peerID string) error {
132         if peer := sm.peers.GetPeer(peerID); peer == nil {
133                 return errors.New("peerId not exist")
134         }
135         sm.peers.RemovePeer(peerID)
136         return nil
137 }