mirror of
https://github.com/ethereum/go-ethereum.git
synced 2026-08-17 09:23:48 +00:00
les: fixed peer register/head announce order
This commit is contained in:
parent
e9b9945242
commit
8307f21605
1 changed files with 22 additions and 13 deletions
35
les/peer.go
35
les/peer.go
|
|
@ -456,11 +456,15 @@ func newPeerSet() *peerSet {
|
||||||
// notify adds a service to be notified about added or removed peers
|
// notify adds a service to be notified about added or removed peers
|
||||||
func (ps *peerSet) notify(n peerSetNotify) {
|
func (ps *peerSet) notify(n peerSetNotify) {
|
||||||
ps.lock.Lock()
|
ps.lock.Lock()
|
||||||
defer ps.lock.Unlock()
|
|
||||||
|
|
||||||
ps.notifyList = append(ps.notifyList, n)
|
ps.notifyList = append(ps.notifyList, n)
|
||||||
|
peers := make([]*peer, 0, len(ps.peers))
|
||||||
for _, p := range ps.peers {
|
for _, p := range ps.peers {
|
||||||
go n.registerPeer(p)
|
peers = append(peers, p)
|
||||||
|
}
|
||||||
|
ps.lock.Unlock()
|
||||||
|
|
||||||
|
for _, p := range peers {
|
||||||
|
n.registerPeer(p)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -468,8 +472,6 @@ func (ps *peerSet) notify(n peerSetNotify) {
|
||||||
// peer is already known.
|
// peer is already known.
|
||||||
func (ps *peerSet) Register(p *peer) error {
|
func (ps *peerSet) Register(p *peer) error {
|
||||||
ps.lock.Lock()
|
ps.lock.Lock()
|
||||||
defer ps.lock.Unlock()
|
|
||||||
|
|
||||||
if ps.closed {
|
if ps.closed {
|
||||||
return errClosed
|
return errClosed
|
||||||
}
|
}
|
||||||
|
|
@ -478,8 +480,12 @@ func (ps *peerSet) Register(p *peer) error {
|
||||||
}
|
}
|
||||||
ps.peers[p.id] = p
|
ps.peers[p.id] = p
|
||||||
p.sendQueue = newExecQueue(100)
|
p.sendQueue = newExecQueue(100)
|
||||||
for _, n := range ps.notifyList {
|
peers := make([]peerSetNotify, len(ps.notifyList))
|
||||||
go n.registerPeer(p)
|
copy(peers, ps.notifyList)
|
||||||
|
ps.lock.Unlock()
|
||||||
|
|
||||||
|
for _, n := range peers {
|
||||||
|
n.registerPeer(p)
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
@ -488,19 +494,22 @@ func (ps *peerSet) Register(p *peer) error {
|
||||||
// actions to/from that particular entity. It also initiates disconnection at the networking layer.
|
// actions to/from that particular entity. It also initiates disconnection at the networking layer.
|
||||||
func (ps *peerSet) Unregister(id string) error {
|
func (ps *peerSet) Unregister(id string) error {
|
||||||
ps.lock.Lock()
|
ps.lock.Lock()
|
||||||
defer ps.lock.Unlock()
|
|
||||||
|
|
||||||
if p, ok := ps.peers[id]; !ok {
|
if p, ok := ps.peers[id]; !ok {
|
||||||
|
ps.lock.Unlock()
|
||||||
return errNotRegistered
|
return errNotRegistered
|
||||||
} else {
|
} else {
|
||||||
for _, n := range ps.notifyList {
|
delete(ps.peers, id)
|
||||||
go n.unregisterPeer(p)
|
peers := make([]peerSetNotify, len(ps.notifyList))
|
||||||
|
copy(peers, ps.notifyList)
|
||||||
|
ps.lock.Unlock()
|
||||||
|
|
||||||
|
for _, n := range peers {
|
||||||
|
n.unregisterPeer(p)
|
||||||
}
|
}
|
||||||
p.sendQueue.quit()
|
p.sendQueue.quit()
|
||||||
p.Peer.Disconnect(p2p.DiscUselessPeer)
|
p.Peer.Disconnect(p2p.DiscUselessPeer)
|
||||||
}
|
|
||||||
delete(ps.peers, id)
|
|
||||||
return nil
|
return nil
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// AllPeerIDs returns a list of all registered peer IDs
|
// AllPeerIDs returns a list of all registered peer IDs
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue