6 log "github.com/sirupsen/logrus"
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"
22 errVaultModeDialPeer = errors.New("can't dial peer in vault mode")
25 type ChainMgr interface {
31 type Switch interface {
35 DialPeerWithAddress(addr *p2p.NetAddress) error
39 //SyncManager Sync Manager is responsible for the business layer information synchronization
40 type SyncManager struct {
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)
53 peers := peers.NewPeerSet(sw)
55 chainManger, err := chainmgr.NewChainManager(config, sw, chain, txPool, dispatcher, peers)
63 chainMgr: chainManger,
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")
74 return sm.chainMgr.Start()
77 func (sm *SyncManager) Stop() {
79 if !sm.config.VaultMode {
85 func (sm *SyncManager) IsListening() bool {
86 if sm.config.VaultMode {
89 return sm.sw.IsListening()
93 //IsCaughtUp check wheather the peer finish the sync
94 func (sm *SyncManager) IsCaughtUp() bool {
95 return sm.chainMgr.IsCaughtUp()
98 func (sm *SyncManager) PeerCount() int {
99 if sm.config.VaultMode {
102 return len(sm.sw.Peers().List())
105 func (sm *SyncManager) GetNetwork() string {
106 return sm.config.ChainID
109 func (sm *SyncManager) BestPeer() *peers.PeerInfo {
110 bestPeer := sm.peers.BestPeer(consensus.SFFullNode)
112 return bestPeer.GetPeerInfo()
117 func (sm *SyncManager) DialPeerWithAddress(addr *p2p.NetAddress) error {
118 if sm.config.VaultMode {
119 return errVaultModeDialPeer
122 return sm.sw.DialPeerWithAddress(addr)
125 //GetPeerInfos return peer info of all peers
126 func (sm *SyncManager) GetPeerInfos() []*peers.PeerInfo {
127 return sm.peers.GetPeerInfos()
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")
135 sm.peers.RemovePeer(peerID)