les: fixed peerSet.Disconnect

This commit is contained in:
Zsolt Felfoldi 2019-12-26 17:52:57 +01:00
parent 0fc06ea8af
commit 6f1abbf2b5

View file

@ -873,10 +873,13 @@ func (ps *peerSet) Register(p *peer) error {
ps.lock.Unlock() ps.lock.Unlock()
return errAlreadyRegistered return errAlreadyRegistered
} }
if _, ok := ps.inactive[p.id]; ok {
delete(ps.inactive, p.id)
} else {
p.sendQueue = newExecQueue(100)
}
ps.active[p.id] = p ps.active[p.id] = p
delete(ps.inactive, p.id)
p.sendQueue = newExecQueue(100)
peers := make([]peerSetNotify, len(ps.notifyList)) peers := make([]peerSetNotify, len(ps.notifyList))
copy(peers, ps.notifyList) copy(peers, ps.notifyList)
ps.lock.Unlock() ps.lock.Unlock()
@ -904,7 +907,6 @@ func (ps *peerSet) Unregister(p *peer) error {
for _, n := range peers { for _, n := range peers {
n.unregisterPeer(p) n.unregisterPeer(p)
} }
p.sendQueue.quit()
return nil return nil
} }
} }
@ -913,17 +915,27 @@ func (ps *peerSet) Unregister(p *peer) error {
// initiates disconnection at the networking layer. // initiates disconnection at the networking layer.
func (ps *peerSet) Disconnect(id string) error { func (ps *peerSet) Disconnect(id string) error {
ps.lock.Lock() ps.lock.Lock()
p, ok := ps.active[id]
if ok { var (
delete(ps.active, id) peers []peerSetNotify
} else { p *peer
if p, ok = ps.inactive[id]; !ok { ok bool
ps.lock.Unlock() )
return errNotRegistered if p, ok = ps.active[id]; ok {
} delete(ps.active, p.id)
peers = make([]peerSetNotify, len(ps.notifyList))
copy(peers, ps.notifyList)
} else if p, ok = ps.inactive[id]; ok {
delete(ps.inactive, id) delete(ps.inactive, id)
} else {
ps.lock.Unlock()
return errNotRegistered
} }
ps.lock.Unlock() ps.lock.Unlock()
for _, n := range peers {
n.unregisterPeer(p)
}
p.sendQueue.quit()
p.Peer.Disconnect(p2p.DiscUselessPeer) p.Peer.Disconnect(p2p.DiscUselessPeer)
return nil return nil
} }