les: fixed peer register/head announce order

This commit is contained in:
Zsolt Felfoldi 2017-09-17 15:36:41 +02:00
parent e9b9945242
commit 8307f21605

View file

@ -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