@cryptotaxi247 / kubo / commits / 0f6b1bc73

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