@cryptotaxi247 / kubo / commits / 3ae702170

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 {