@cryptotaxi247 / kubo / commits / 486536149

dht/query: err return NotFound case

When some queries finished, but we got no result, it should be a simple NotFoundError. Only when every single query ended in error do we externalize those to the client, in case something major is going wrong

Juan Batiz-Benet committed Jan 18, 2015 at 00:59 UTC 486536149e651d3dfeacbf137f43623ff9319308
2 files changed +17 -3
routing/dht/ext_test.go
+10
@@ -49,6 +49,10 @@ func TestGetFailures(t *testing.T) {
49 // u.POut("Timout Test\n")
50 ctx1, _ := context.WithTimeout(context.Background(), 200*time.Millisecond)
51 if _, err := d.GetValue(ctx1, u.Key("test")); err != nil {
52 + if merr, ok := err.(u.MultiErr); ok && len(merr) > 0 {
53 + err = merr[0]
54 + }
55 +
56 if err != context.DeadlineExceeded {
57 t.Fatal("Got different error than we expected", err)
58 }
@@ -86,6 +90,9 @@ func TestGetFailures(t *testing.T) {
90 ctx2, _ := context.WithTimeout(context.Background(), 20*time.Second)
91 _, err = d.GetValue(ctx2, u.Key("test"))
92 if err != nil {
93 + if merr, ok := err.(u.MultiErr); ok && len(merr) > 0 {
94 + err = merr[0]
95 + }
96 if err != routing.ErrNotFound {
97 t.Fatalf("Expected ErrNotFound, got: %s", err)
98 }
@@ -202,6 +209,9 @@ func TestNotFound(t *testing.T) {
209 v, err := d.GetValue(ctx, u.Key("hello"))
210 log.Debugf("get value got %v", v)
211 if err != nil {
212 + if merr, ok := err.(u.MultiErr); ok && len(merr) > 0 {
213 + err = merr[0]
214 + }
215 switch err {
216 case routing.ErrNotFound:
217 //Success!
routing/dht/query.go
+7 -3
@@ -62,7 +62,7 @@ type dhtQueryRunner struct {
62 peersRemaining todoctr.Counter // peersToQuery + currently processing
63
64 result *dhtQueryResult // query result
65 - errs []error // result errors. maybe should be a map[peer.ID]error
65 + errs u.MultiErr // result errors. maybe should be a map[peer.ID]error
66
67 rateLimit chan struct{} // processing semaphore
68 log eventlog.EventLogger
@@ -122,8 +122,12 @@ func (r *dhtQueryRunner) Run(peers []peer.ID) (*dhtQueryResult, error) {
122 r.RLock()
123 defer r.RUnlock()
124
125 - if len(r.errs) > 0 {
126 - err = r.errs[0] // take the first?
125 + err = routing.ErrNotFound
126 +
127 + // if every query to every peer failed, something must be very wrong.
128 + if len(r.errs) > 0 && len(r.errs) == r.peersSeen.Size() {
129 + log.Debugf("query errs: %s", r.errs)
130 + err = r.errs[0]
131 }
132
133 case <-r.cg.Closed():