getFromPeerList and peerFromInfo
Juan Batiz-Benet committed
Sep 16, 2014 at 06:33 UTC
3ae702170057ae1cc3b617a632733c725fbefb9d
1 file changed
+44
-31
routing/dht/dht.go
+44
-31
@@ -225,13 +225,14 @@ func (dht *IpfsDHT) getValueOrPeers(ctx context.Context, p *peer.Peer,
225
continue
226
}
227
228
- np, err := dht.network.GetConnection(peer.ID(pb.GetId()), addr)
229
- if err != nil {
230
- u.PErr("%v\n", err.Error())
231
- continue
228
+ // check if we already have this peer.
229
+ pr, _ := dht.peerstore.Get(peer.ID(pb.GetId()))
230
+ if pr == nil {
231
+ pr = &peer.Peer{ID: peer.ID(pb.GetId())}
232
+ dht.peerstore.Put(pr)
233
}
233
-
234
- peers = append(peers, np)
234
+ pr.AddAddress(addr) // idempotent
235
+ peers = append(peers, pr)
236
}
237
238
if len(peers) > 0 {
@@ -257,33 +258,26 @@ func (dht *IpfsDHT) getValueSingle(ctx context.Context, p *peer.Peer,
258
// from someone what do we do with it? Connect to each of them? randomly pick
259
// one to get the value from? Or just connect to one at a time until we get a
260
// successful connection and request the value from it?
260
-func (dht *IpfsDHT) getFromPeerList(key u.Key, timeout time.Duration,
261
- peerlist []*Message_PBPeer, level int) ([]byte, error) {
262
- for _, pinfo := range peerlist {
263
- p, _ := dht.Find(peer.ID(pinfo.GetId()))
264
- if p == nil {
265
- maddr, err := ma.NewMultiaddr(pinfo.GetAddr())
266
- if err != nil {
267
- u.PErr("getValue error: %s\n", err)
268
- continue
269
- }
261
+func (dht *IpfsDHT) getFromPeerList(ctx context.Context, key u.Key,
262
+ peerlist []*Message_Peer, level int) ([]byte, error) {
263
271
- p, err = dht.network.GetConnection(peer.ID(pinfo.GetId()), maddr)
272
- if err != nil {
273
- u.PErr("getValue error: %s\n", err)
274
- continue
275
- }
264
+ for _, pinfo := range peerlist {
265
+ p, err := dht.peerFromInfo(pinfo)
266
+ if err != nil {
267
+ u.DErr("getFromPeers error: %s\n", err)
268
+ continue
269
}
277
- pmes, err := dht.getValueSingle(p, key, timeout, level)
270
+
271
+ pmes, err := dht.getValueSingle(ctx, p, key, level)
272
if err != nil {
273
u.DErr("getFromPeers error: %s\n", err)
274
continue
275
}
282
- dht.providers.AddProvider(key, p)
276
284
- // Make sure it was a successful get
285
- if pmes.GetSuccess() && pmes.Value != nil {
286
- return pmes.GetValue(), nil
277
+ if value := pmes.GetValue(); value != nil {
278
+ // Success! We were given the value
279
+ dht.providers.AddProvider(key, p)
280
+ return value, nil
281
}
282
}
283
return nil, u.ErrNotFound
@@ -463,13 +457,32 @@ func (dht *IpfsDHT) betterPeerToQuery(pmes *Message) *peer.Peer {
457
return closer
458
}
459
466
-func (dht *IpfsDHT) peerFromInfo(pbp *Message_PBPeer) (*peer.Peer, error) {
467
- maddr, err := ma.NewMultiaddr(pbp.GetAddr())
468
- if err != nil {
469
- return nil, err
460
+func (dht *IpfsDHT) peerFromInfo(pbp *Message_Peer) (*peer.Peer, error) {
461
+
462
+ id := peer.ID(pbp.GetId())
463
+ p, _ := dht.peerstore.Get(id)
464
+ if p == nil {
465
+ p, _ = dht.Find(id)
466
+ if p != nil {
467
+ panic("somehow peer not getting into peerstore")
468
+ }
469
+ }
470
+
471
+ if p == nil {
472
+ maddr, err := ma.NewMultiaddr(pbp.GetAddr())
473
+ if err != nil {
474
+ return nil, err
475
+ }
476
+
477
+ // create new Peer
478
+ p := &peer.Peer{ID: id}
479
+ p.AddAddress(maddr)
480
+ dht.peerstore.Put(pr)
481
}
482
472
- return dht.network.GetConnection(peer.ID(pbp.GetId()), maddr)
483
+ // dial connection
484
+ err = dht.network.Dial(p)
485
+ return p, err
486
}
487
488
func (dht *IpfsDHT) loadProvidableKeys() error {