Skip to content

Commit 080cd52

Browse files
authored
Merge pull request #328 from libp2p/fix/error-leak
query: fix error "leak"
2 parents ca611b1 + 3c9f5bc commit 080cd52

File tree

1 file changed

+11
-21
lines changed

1 file changed

+11
-21
lines changed

query.go

+11-21
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,9 @@ package dht
22

33
import (
44
"context"
5+
"errors"
56
"sync"
67

7-
u "github.com/ipfs/go-ipfs-util"
88
logging "github.com/ipfs/go-log"
99
todoctr "github.com/ipfs/go-todocounter"
1010
process "github.com/jbenet/goprocess"
@@ -18,6 +18,9 @@ import (
1818
notif "github.com/libp2p/go-libp2p-routing/notifications"
1919
)
2020

21+
// ErrNoPeersQueried is returned when we failed to connect to any peers.
22+
var ErrNoPeersQueried = errors.New("failed to query any peers")
23+
2124
var maxQueryConcurrency = AlphaValue
2225

2326
type dhtQuery struct {
@@ -77,7 +80,6 @@ type dhtQueryRunner struct {
7780
peersRemaining todoctr.Counter // peersToQuery + currently processing
7881

7982
result *dhtQueryResult // query result
80-
errs u.MultiErr // result errors. maybe should be a map[peer.ID]error
8183

8284
rateLimit chan struct{} // processing semaphore
8385
log logging.EventLogger
@@ -155,23 +157,19 @@ func (r *dhtQueryRunner) Run(ctx context.Context, peers []peer.ID) (*dhtQueryRes
155157
select {
156158
case <-r.peersRemaining.Done():
157159
r.proc.Close()
158-
r.RLock()
159-
defer r.RUnlock()
160-
161-
err = routing.ErrNotFound
162-
163-
// if every query to every peer failed, something must be very wrong.
164-
if len(r.errs) > 0 && len(r.errs) == r.peersSeen.Size() {
165-
logger.Debugf("query errs: %s", r.errs)
166-
err = r.errs[0]
160+
if r.peersQueried.Size() == 0 {
161+
err = ErrNoPeersQueried
162+
} else {
163+
err = routing.ErrNotFound
167164
}
168165

169166
case <-r.proc.Closed():
170-
r.RLock()
171-
defer r.RUnlock()
172167
err = r.runCtx.Err()
173168
}
174169

170+
r.RLock()
171+
defer r.RUnlock()
172+
175173
if r.result != nil && r.result.success {
176174
return r.result, nil
177175
}
@@ -257,10 +255,6 @@ func (r *dhtQueryRunner) dialPeer(ctx context.Context, p peer.ID) error {
257255
ID: p,
258256
})
259257

260-
r.Lock()
261-
r.errs = append(r.errs, err)
262-
r.Unlock()
263-
264258
// This peer is dropping out of the race.
265259
r.peersRemaining.Decrement(1)
266260
return err
@@ -289,10 +283,6 @@ func (r *dhtQueryRunner) queryPeer(proc process.Process, p peer.ID) {
289283

290284
if err != nil {
291285
logger.Debugf("ERROR worker for: %v %v", p, err)
292-
r.Lock()
293-
r.errs = append(r.errs, err)
294-
r.Unlock()
295-
296286
} else if res.success {
297287
logger.Debugf("SUCCESS worker for: %v %s", p, res)
298288
r.Lock()

0 commit comments

Comments
 (0)