mirror of
https://github.com/slackhq/nebula.git
synced 2025-11-11 11:23:58 +01:00
avoid deadlock in lighthouse queryWorker
If the lighthouse queryWorker tries to grab to call StartHandshake on a lighthouse vpnIp, we can deadlock on the handshake_manager lock. This change drops the handshake_manager lock before we send on the lighthouse queryChan (which could block), and also avoids sending to the channel if this is a lighthouse IP itself.
This commit is contained in:
parent
a390125935
commit
c7f1bed882
@ -374,9 +374,9 @@ func (hm *HandshakeManager) GetOrHandshake(vpnIp iputil.VpnIp, cacheCb func(*Han
|
||||
// StartHandshake will ensure a handshake is currently being attempted for the provided vpn ip
|
||||
func (hm *HandshakeManager) StartHandshake(vpnIp iputil.VpnIp, cacheCb func(*HandshakeHostInfo)) *HostInfo {
|
||||
hm.Lock()
|
||||
defer hm.Unlock()
|
||||
|
||||
if hh, ok := hm.vpnIps[vpnIp]; ok {
|
||||
hm.Unlock()
|
||||
// We are already trying to handshake with this vpn ip
|
||||
if cacheCb != nil {
|
||||
cacheCb(hh)
|
||||
@ -421,7 +421,10 @@ func (hm *HandshakeManager) StartHandshake(vpnIp iputil.VpnIp, cacheCb func(*Han
|
||||
}
|
||||
}
|
||||
|
||||
hm.lightHouse.QueryServer(vpnIp)
|
||||
hm.Unlock()
|
||||
if !hm.lightHouse.IsLighthouseIP(vpnIp) {
|
||||
hm.lightHouse.QueryServer(vpnIp)
|
||||
}
|
||||
return hostinfo
|
||||
}
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user