mirror of
https://github.com/osrg/gobgp.git
synced 2024-05-11 05:55:10 +00:00
server: dynamic neighbor deletion panic
https://github.com/osrg/gobgp/commit/318a91e31b8baed86bb66a3767525da68ae49a5d The above commit added a bug to close a closed channel; after deleting a dynamic neighbor, handleFSMMessage() must return. Otherwise cleanInfiniteChannel() is called twice. https://travis-ci.org/osrg/gobgp/jobs/483896487 Signed-off-by: FUJITA Tomonori <[email protected]>
This commit is contained in:
+12
-11
@@ -1151,15 +1151,12 @@ func (s *BgpServer) propagateUpdateToNeighbors(source *peer, newPath *table.Path
|
||||
}
|
||||
|
||||
func (s *BgpServer) deleteDynamicNeighbor(peer *peer, oldState bgp.FSMState, e *fsmMsg) {
|
||||
if peer.isDynamicNeighbor() {
|
||||
peer.stopPeerRestarting()
|
||||
go peer.stopFSM()
|
||||
peer.fsm.lock.RLock()
|
||||
delete(s.neighborMap, peer.fsm.pConf.State.NeighborAddress)
|
||||
peer.fsm.lock.RUnlock()
|
||||
s.broadcastPeerState(peer, oldState, e)
|
||||
return
|
||||
}
|
||||
peer.stopPeerRestarting()
|
||||
go peer.stopFSM()
|
||||
peer.fsm.lock.RLock()
|
||||
delete(s.neighborMap, peer.fsm.pConf.State.NeighborAddress)
|
||||
peer.fsm.lock.RUnlock()
|
||||
s.broadcastPeerState(peer, oldState, e)
|
||||
}
|
||||
|
||||
func (s *BgpServer) handleFSMMessage(peer *peer, e *fsmMsg) {
|
||||
@@ -1208,8 +1205,9 @@ func (s *BgpServer) handleFSMMessage(peer *peer, e *fsmMsg) {
|
||||
}
|
||||
peer.fsm.lock.Unlock()
|
||||
|
||||
if !graceful {
|
||||
if !graceful && peer.isDynamicNeighbor() {
|
||||
s.deleteDynamicNeighbor(peer, oldState, e)
|
||||
return
|
||||
}
|
||||
|
||||
} else if nextStateIdle {
|
||||
@@ -1282,7 +1280,10 @@ func (s *BgpServer) handleFSMMessage(peer *peer, e *fsmMsg) {
|
||||
peer.DropAll(peer.configuredRFlist())
|
||||
s.dropPeerAllRoutes(peer, peer.configuredRFlist())
|
||||
|
||||
s.deleteDynamicNeighbor(peer, oldState, e)
|
||||
if peer.isDynamicNeighbor() {
|
||||
s.deleteDynamicNeighbor(peer, oldState, e)
|
||||
return
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user