diff --git a/rtrefresh/rt_refresh_manager.go b/rtrefresh/rt_refresh_manager.go index 1e3dbaeab..1dc9b7e7e 100644 --- a/rtrefresh/rt_refresh_manager.go +++ b/rtrefresh/rt_refresh_manager.go @@ -102,15 +102,18 @@ func (r *RtRefreshManager) Close() error { // // The returned channel will block until the refresh finishes, then yield the // error and close. The channel is buffered and safe to ignore. -// FIXME: this can block. Ideally, we'd return a channel without blocking. -// https://github.com/libp2p/go-libp2p-kad-dht/issues/609 func (r *RtRefreshManager) Refresh(force bool) <-chan error { resp := make(chan error, 1) - select { - case r.triggerRefresh <- &triggerRefreshReq{respCh: resp, forceCplRefresh: force}: - case <-r.ctx.Done(): - resp <- r.ctx.Err() - } + r.refcount.Add(1) + go func() { + defer r.refcount.Done() + select { + case r.triggerRefresh <- &triggerRefreshReq{respCh: resp, forceCplRefresh: force}: + case <-r.ctx.Done(): + resp <- r.ctx.Err() + } + }() + return resp }