diff --git a/waku/v2/service/common_discovery_service.go b/waku/v2/service/common_discovery_service.go index c22f18f11..09d9a2144 100644 --- a/waku/v2/service/common_discovery_service.go +++ b/waku/v2/service/common_discovery_service.go @@ -49,16 +49,29 @@ func (sp *CommonDiscoveryService) GetListeningChan() <-chan PeerData { return sp.channel } func (sp *CommonDiscoveryService) PushToChan(data PeerData) bool { - sp.RLock() - defer sp.RUnlock() - if err := sp.ErrOnNotRunning(); err != nil { - return false - } + done := make(chan bool, 1) + go func() { + sp.RLock() + defer sp.RUnlock() + if err := sp.ErrOnNotRunning(); err != nil { + done <- false + return + } + select { + case sp.channel <- data: + done <- true + case <-sp.Context().Done(): + done <- false + } + }() + select { - case sp.channel <- data: - return true case <-sp.Context().Done(): + // should always check if the context is done, otherwise there is a potential for a deadlock. + // see https://github.com/status-im/status-go/issues/4527#issuecomment-2047231127 return false + case result := <-done: + return result } }