fix(dht/routing) buffer promise response to prevent resource leak
When performing this "promise" pattern, it is important to provide a channel with space for one value. Otherwise the sender may block forever in the case of a receiver that decides to abandon the request. A subtle detail, but one that is important for avoiding leaked goroutines. cc @whyrusleeping @jbenet License: MIT Signed-off-by: Brian Tiger Chow <brian@perfmode.com> License: MIT Signed-off-by: Brian Tiger Chow <brian@perfmode.com>
Brian Tiger Chow committed
Dec 2, 2014 at 00:55 UTC
0f6b1bc73ec213f3df82d6f5e3daba5ff0d9758f
1 file changed
+4
-3
routing/dht/providers.go
+4
-3
@@ -102,9 +102,10 @@ func (pm *ProviderManager) AddProvider(k u.Key, val peer.Peer) {
102
}
103
104
func (pm *ProviderManager) GetProviders(ctx context.Context, k u.Key) []peer.Peer {
105
- gp := new(getProv)
106
- gp.k = k
107
- gp.resp = make(chan []peer.Peer)
105
+ gp := &getProv{
106
+ k: k,
107
+ resp: make(chan []peer.Peer, 1), // buffered to prevent sender from blocking
108
+ }
109
select {
110
case pm.getprovs <- gp:
111
return <-gp.resp