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  }