From 980c6ad85a7d4176d85c9673b373d049fdaacfb2 Mon Sep 17 00:00:00 2001 From: aarshkshah1992 Date: Mon, 18 Jan 2021 15:22:14 +0530 Subject: [PATCH 1/2] unblock refresh --- rtrefresh/rt_refresh_manager.go | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/rtrefresh/rt_refresh_manager.go b/rtrefresh/rt_refresh_manager.go index 1e3dbaeab..44d22c38a 100644 --- a/rtrefresh/rt_refresh_manager.go +++ b/rtrefresh/rt_refresh_manager.go @@ -102,15 +102,16 @@ 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() - } + go func() { + select { + case r.triggerRefresh <- &triggerRefreshReq{respCh: resp, forceCplRefresh: force}: + case <-r.ctx.Done(): + resp <- r.ctx.Err() + } + }() + return resp } From e7422200e822f5e2b3c6251c0fad58c35717ac3c Mon Sep 17 00:00:00 2001 From: aarshkshah1992 Date: Mon, 18 Jan 2021 15:23:19 +0530 Subject: [PATCH 2/2] correct refcount --- rtrefresh/rt_refresh_manager.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/rtrefresh/rt_refresh_manager.go b/rtrefresh/rt_refresh_manager.go index 44d22c38a..1dc9b7e7e 100644 --- a/rtrefresh/rt_refresh_manager.go +++ b/rtrefresh/rt_refresh_manager.go @@ -104,7 +104,9 @@ func (r *RtRefreshManager) Close() error { // error and close. The channel is buffered and safe to ignore. func (r *RtRefreshManager) Refresh(force bool) <-chan error { resp := make(chan error, 1) + r.refcount.Add(1) go func() { + defer r.refcount.Done() select { case r.triggerRefresh <- &triggerRefreshReq{respCh: resp, forceCplRefresh: force}: case <-r.ctx.Done():