restrict removed raft node in p2p connection (#884)

This commit is contained in:
Zhou Zhiyao 2019-11-29 23:55:31 +08:00 committed by Samer Falah
parent e3089e30be
commit 0c43425d2f
2 changed files with 28 additions and 0 deletions

View File

@ -190,6 +190,9 @@ type Server struct {
loopWG sync.WaitGroup // loop, listenLoop
peerFeed event.Feed
log log.Logger
// raft peers info
checkPeerInRaft func(*enode.Node) bool
}
type peerOpFunc func(map[enode.ID]*Peer)
@ -927,6 +930,13 @@ func (srv *Server) setupConn(c *conn, flags connFlag, dialDest *enode.Node) erro
}
clog := srv.log.New("id", c.node.ID(), "addr", c.fd.RemoteAddr(), "conn", c.flags)
// If raft is running, check if the dialing node is in the raft cluster
// Node doesn't belong to raft cluster is not allowed to join the p2p network
if srv.checkPeerInRaft != nil && !srv.checkPeerInRaft(c.node) {
log.Trace("incoming connection peer is not in the raft cluster", "enode.id", c.node.ID())
return nil
}
//START - QUORUM Permissioning
currentNode := srv.NodeInfo().ID
cnodeName := srv.NodeInfo().Name
@ -1116,3 +1126,7 @@ func (srv *Server) PeersInfo() []*PeerInfo {
}
return infos
}
func (srv *Server) SetCheckPeerInRaft(f func(*enode.Node) bool) {
srv.checkPeerInRaft = f
}

View File

@ -143,6 +143,8 @@ func (pm *ProtocolManager) Start(p2pServer *p2p.Server) {
pm.p2pServer = p2pServer
pm.minedBlockSub = pm.eventMux.Subscribe(core.NewMinedBlockEvent{})
pm.startRaft()
// update raft peers info to p2p server
pm.p2pServer.SetCheckPeerInRaft(pm.peerExist)
go pm.minedBroadcastLoop()
}
@ -305,6 +307,18 @@ func (pm *ProtocolManager) isNodeAlreadyInCluster(node *enode.Node) error {
return nil
}
func (pm *ProtocolManager) peerExist(node *enode.Node) bool {
pm.mu.RLock()
defer pm.mu.RUnlock()
for _, p := range pm.peers {
if node.ID() == p.p2pNode.ID() {
return true
}
}
return false
}
func (pm *ProtocolManager) ProposeNewPeer(enodeId string) (uint16, error) {
parsedUrl, _ := url.Parse(enodeId)
node, err := enode.ParseV4(enodeId)