mirror of
https://github.com/yggdrasil-network/yggdrasil-go.git
synced 2024-12-25 01:07:49 +00:00
Merge pull request #189 from neilalexander/threadsafe
Fix a concurrent map read-write when removing peers
This commit is contained in:
commit
1233371962
@ -127,7 +127,7 @@ func (ps *peers) removePeer(port switchPort) {
|
|||||||
return
|
return
|
||||||
} // Can't remove self peer
|
} // Can't remove self peer
|
||||||
ps.core.router.doAdmin(func() {
|
ps.core.router.doAdmin(func() {
|
||||||
ps.core.switchTable.unlockedRemovePeer(port)
|
ps.core.switchTable.forgetPeer(port)
|
||||||
})
|
})
|
||||||
ps.mutex.Lock()
|
ps.mutex.Lock()
|
||||||
oldPorts := ps.getPorts()
|
oldPorts := ps.getPorts()
|
||||||
|
@ -242,7 +242,9 @@ func (t *switchTable) cleanRoot() {
|
|||||||
// Removes a peer.
|
// Removes a peer.
|
||||||
// Must be called by the router mainLoop goroutine, e.g. call router.doAdmin with a lambda that calls this.
|
// Must be called by the router mainLoop goroutine, e.g. call router.doAdmin with a lambda that calls this.
|
||||||
// If the removed peer was this node's parent, it immediately tries to find a new parent.
|
// If the removed peer was this node's parent, it immediately tries to find a new parent.
|
||||||
func (t *switchTable) unlockedRemovePeer(port switchPort) {
|
func (t *switchTable) forgetPeer(port switchPort) {
|
||||||
|
t.mutex.Lock()
|
||||||
|
defer t.mutex.Unlock()
|
||||||
delete(t.data.peers, port)
|
delete(t.data.peers, port)
|
||||||
t.updater.Store(&sync.Once{})
|
t.updater.Store(&sync.Once{})
|
||||||
if port != t.parent {
|
if port != t.parent {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user