p2p: no peer reconnect if explicitly disconnected (#2115)
This commit is contained in:
parent
69531d67a8
commit
5853329c63
@ -225,7 +225,8 @@ type Server struct {
|
|||||||
checkpointAddPeer chan *conn
|
checkpointAddPeer chan *conn
|
||||||
|
|
||||||
// State of run loop and listenLoop.
|
// State of run loop and listenLoop.
|
||||||
inboundHistory expHeap
|
inboundHistory expHeap
|
||||||
|
disconnectEnodeSet map[enode.ID]struct{}
|
||||||
}
|
}
|
||||||
|
|
||||||
type peerOpFunc func(map[enode.ID]*Peer)
|
type peerOpFunc func(map[enode.ID]*Peer)
|
||||||
@ -513,6 +514,7 @@ func (srv *Server) Start() (err error) {
|
|||||||
srv.removetrusted = make(chan *enode.Node)
|
srv.removetrusted = make(chan *enode.Node)
|
||||||
srv.peerOp = make(chan peerOpFunc)
|
srv.peerOp = make(chan peerOpFunc)
|
||||||
srv.peerOpDone = make(chan struct{})
|
srv.peerOpDone = make(chan struct{})
|
||||||
|
srv.disconnectEnodeSet = make(map[enode.ID]struct{})
|
||||||
|
|
||||||
if err := srv.setupLocalNode(); err != nil {
|
if err := srv.setupLocalNode(); err != nil {
|
||||||
return err
|
return err
|
||||||
@ -836,6 +838,9 @@ running:
|
|||||||
case pd := <-srv.delpeer:
|
case pd := <-srv.delpeer:
|
||||||
// A peer disconnected.
|
// A peer disconnected.
|
||||||
d := common.PrettyDuration(mclock.Now() - pd.created)
|
d := common.PrettyDuration(mclock.Now() - pd.created)
|
||||||
|
if !pd.requested && pd.err == DiscRequested {
|
||||||
|
srv.disconnectEnodeSet[pd.ID()] = struct{}{}
|
||||||
|
}
|
||||||
delete(peers, pd.ID())
|
delete(peers, pd.ID())
|
||||||
srv.log.Debug("Removing p2p peer", "peercount", len(peers), "id", pd.ID(), "duration", d, "req", pd.requested, "err", pd.err)
|
srv.log.Debug("Removing p2p peer", "peercount", len(peers), "id", pd.ID(), "duration", d, "req", pd.requested, "err", pd.err)
|
||||||
srv.dialsched.peerRemoved(pd.rw)
|
srv.dialsched.peerRemoved(pd.rw)
|
||||||
@ -889,6 +894,11 @@ func (srv *Server) addPeerChecks(peers map[enode.ID]*Peer, inboundCount int, c *
|
|||||||
if len(srv.Protocols) > 0 && countMatchingProtocols(srv.Protocols, c.caps) == 0 {
|
if len(srv.Protocols) > 0 && countMatchingProtocols(srv.Protocols, c.caps) == 0 {
|
||||||
return DiscUselessPeer
|
return DiscUselessPeer
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if _, ok := srv.disconnectEnodeSet[c.node.ID()]; ok {
|
||||||
|
return errors.New("explicitly disconnected peer previously")
|
||||||
|
}
|
||||||
|
|
||||||
// Repeat the post-handshake checks because the
|
// Repeat the post-handshake checks because the
|
||||||
// peer set might have changed since those checks were performed.
|
// peer set might have changed since those checks were performed.
|
||||||
return srv.postHandshakeChecks(peers, inboundCount, c)
|
return srv.postHandshakeChecks(peers, inboundCount, c)
|
||||||
@ -967,6 +977,7 @@ func (srv *Server) checkInboundConn(remoteIP net.IP) error {
|
|||||||
if remoteIP == nil {
|
if remoteIP == nil {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// Reject connections that do not match NetRestrict.
|
// Reject connections that do not match NetRestrict.
|
||||||
if srv.NetRestrict != nil && !srv.NetRestrict.Contains(remoteIP) {
|
if srv.NetRestrict != nil && !srv.NetRestrict.Contains(remoteIP) {
|
||||||
return fmt.Errorf("not in netrestrict list")
|
return fmt.Errorf("not in netrestrict list")
|
||||||
|
Loading…
Reference in New Issue
Block a user