Disallow p2p or raft port reuse for raft consensus (#524)

This commit is contained in:
Brian Schroeder 2018-09-21 11:57:26 -04:00 committed by fixanoid
parent 6c9ec6b1d9
commit 8c9ed51fa0
1 changed files with 19 additions and 8 deletions

View File

@ -274,17 +274,28 @@ func (pm *ProtocolManager) isRaftIdUsed(raftId uint16) bool {
return pm.peers[raftId] != nil return pm.peers[raftId] != nil
} }
func (pm *ProtocolManager) isP2pNodeInCluster(node *discover.Node) bool { func (pm *ProtocolManager) isNodeAlreadyInCluster(node *discover.Node) error {
pm.mu.RLock() pm.mu.RLock()
defer pm.mu.RUnlock() defer pm.mu.RUnlock()
for _, peer := range pm.peers { for _, peer := range pm.peers {
if peer.p2pNode.ID == node.ID { peerRaftId := peer.address.RaftId
return true peerNode := peer.p2pNode
if peerNode.ID == node.ID {
return fmt.Errorf("node with this enode has already been added to the cluster: %v", node.ID)
}
if peerNode.IP.Equal(node.IP) {
if peerNode.TCP == node.TCP {
return fmt.Errorf("existing node %v with raft ID %v is already using eth p2p at %v:%v", peerNode.ID, peerRaftId, node.IP, node.TCP)
} else if peer.address.RaftPort == node.RaftPort {
return fmt.Errorf("existing node %v with raft ID %v is already using raft at %v:%v", peerNode.ID, peerRaftId, node.IP, node.RaftPort)
}
} }
} }
return false return nil
} }
func (pm *ProtocolManager) ProposeNewPeer(enodeId string) (uint16, error) { func (pm *ProtocolManager) ProposeNewPeer(enodeId string) (uint16, error) {
@ -293,10 +304,6 @@ func (pm *ProtocolManager) ProposeNewPeer(enodeId string) (uint16, error) {
return 0, err return 0, err
} }
if pm.isP2pNodeInCluster(node) {
return 0, fmt.Errorf("node is already in the cluster: %v", enodeId)
}
if len(node.IP) != 4 { if len(node.IP) != 4 {
return 0, fmt.Errorf("expected IPv4 address (with length 4), but got IP of length %v", len(node.IP)) return 0, fmt.Errorf("expected IPv4 address (with length 4), but got IP of length %v", len(node.IP))
} }
@ -305,6 +312,10 @@ func (pm *ProtocolManager) ProposeNewPeer(enodeId string) (uint16, error) {
return 0, fmt.Errorf("enodeId is missing raftport querystring parameter: %v", enodeId) return 0, fmt.Errorf("enodeId is missing raftport querystring parameter: %v", enodeId)
} }
if err := pm.isNodeAlreadyInCluster(node); err != nil {
return 0, err
}
raftId := pm.nextRaftId() raftId := pm.nextRaftId()
address := newAddress(raftId, node.RaftPort, node) address := newAddress(raftId, node.RaftPort, node)