github.com/sixexorg/magnetic-ring@v0.0.0-20191119090307-31705a21e419/p2pserver/sync/sync_router.go (about) 1 package sync 2 3 import ( 4 "github.com/ontio/ontology-eventbus/actor" 5 "github.com/sixexorg/magnetic-ring/log" 6 msgCommon "github.com/sixexorg/magnetic-ring/p2pserver/common" 7 "github.com/sixexorg/magnetic-ring/p2pserver/net/protocol" 8 ) 9 10 // MessageHandler defines the unified api for each net message 11 type MessageHandler func(data *msgCommon.MsgPayload, p2p p2p.P2P, pid *actor.PID, args ...interface{}) 12 13 // MessageRouter mostly route different message type-based to the 14 // related message handler 15 type MessageRouter struct { 16 msgHandlers map[string]MessageHandler // Msg handler mapped to msg type 17 RecvSyncChan chan *msgCommon.MsgPayload // The channel to handle sync msg 18 // RecvConsChan chan *msgCommon.MsgPayload // The channel to handle consensus msg 19 stopSyncCh chan bool // To stop sync channel 20 // stopConsCh chan bool // To stop consensus channel 21 p2p p2p.P2P // Refer to the p2p network 22 pid *actor.PID // P2P actor 23 } 24 25 // NewMsgRouter returns a message router object 26 func NewMsgRouter(p2p p2p.P2P) *MessageRouter { 27 msgRouter := &MessageRouter{} 28 msgRouter.init(p2p) 29 return msgRouter 30 } 31 32 // init initializes the message router's attributes 33 func (this *MessageRouter) init(p2p p2p.P2P) { 34 this.msgHandlers = make(map[string]MessageHandler) 35 this.RecvSyncChan = p2p.GetMsgChan(false) 36 // this.RecvConsChan = p2p.GetMsgChan(true) 37 this.stopSyncCh = make(chan bool) 38 // this.stopConsCh = make(chan bool) 39 this.p2p = p2p 40 41 // Register message handler 42 this.RegisterMsgHandler(msgCommon.VERSION_TYPE, VersionHandle) 43 this.RegisterMsgHandler(msgCommon.VERACK_TYPE, VerAckHandle) 44 this.RegisterMsgHandler(msgCommon.GetADDR_TYPE, AddrReqHandle) 45 this.RegisterMsgHandler(msgCommon.ADDR_TYPE, AddrHandle) 46 this.RegisterMsgHandler(msgCommon.PING_TYPE, PingHandle) 47 this.RegisterMsgHandler(msgCommon.PONG_TYPE, PongHandle) 48 49 //header 50 this.RegisterMsgHandler(msgCommon.GET_HEADERS_TYPE, HeadersReqHandle) 51 this.RegisterMsgHandler(msgCommon.HEADERS_TYPE, BlkHeaderHandle) 52 53 this.RegisterMsgHandler(msgCommon.INV_TYPE, InvHandle) 54 55 this.RegisterMsgHandler(msgCommon.GET_DATA_TYPE, DataReqHandle) 56 this.RegisterMsgHandler(msgCommon.BLOCK_TYPE, BlockHandle) 57 58 this.RegisterMsgHandler(msgCommon.CONSENSUS_TYPE, ConsensusHandle) 59 this.RegisterMsgHandler(msgCommon.NOT_FOUND_TYPE, NotFoundHandle) 60 61 this.RegisterMsgHandler(msgCommon.TX_TYPE, TransactionHandle) 62 this.RegisterMsgHandler(msgCommon.DISCONNECT_TYPE, DisconnectHandle) 63 64 this.RegisterMsgHandler(msgCommon.PINGSPC_TYPE, PingSpcHandle) 65 this.RegisterMsgHandler(msgCommon.PONGSPC_TYPE, PongSpcHandle) 66 67 this.RegisterMsgHandler(msgCommon.EARTHNOTIFYHASH, EarthNotifyHashHandle) 68 this.RegisterMsgHandler(msgCommon.NODE_LEAGUE_HEIGHT, NodeLeagueHeigtNtfHandle) 69 70 this.RegisterMsgHandler(msgCommon.EXTDATA_REQ_TYPE, ExtDataRequestHandle) 71 this.RegisterMsgHandler(msgCommon.EXTDATA_RSP_TYPE, ExtDataResponseHandle) 72 73 } 74 75 // RegisterMsgHandler registers msg handler with the msg type 76 func (this *MessageRouter) RegisterMsgHandler(key string, 77 handler MessageHandler) { 78 this.msgHandlers[key] = handler 79 } 80 81 // UnRegisterMsgHandler un-registers the msg handler with 82 // the msg type 83 func (this *MessageRouter) UnRegisterMsgHandler(key string) { 84 delete(this.msgHandlers, key) 85 } 86 87 // SetPID sets p2p actor 88 func (this *MessageRouter) SetPID(pid *actor.PID) { 89 this.pid = pid 90 } 91 92 // Start starts the loop to handle the message from the network 93 func (this *MessageRouter) Start() { 94 go this.hookChan(this.RecvSyncChan, this.stopSyncCh) 95 // go this.hookChan(this.RecvConsChan, this.stopConsCh) 96 log.Debug("[p2p]MessageRouter start to parse p2p message...") 97 } 98 99 // hookChan loops to handle the message from the network 100 func (this *MessageRouter) hookChan(channel chan *msgCommon.MsgPayload, 101 stopCh chan bool) { 102 for { 103 select { 104 case data, ok := <-channel: 105 if ok { 106 msgType := data.Payload.CmdType() 107 108 handler, ok := this.msgHandlers[msgType] 109 if ok { 110 go handler(data, this.p2p, this.pid) 111 } else { 112 log.Warn("unknown message handler for the msg", "msgType", msgType) 113 } 114 } 115 case <-stopCh: 116 return 117 } 118 } 119 } 120 121 // Stop stops the message router's loop 122 func (this *MessageRouter) Stop() { 123 124 if this.stopSyncCh != nil { 125 this.stopSyncCh <- true 126 } 127 // if this.stopConsCh != nil { 128 // this.stopConsCh <- true 129 // } 130 }