FindPeer
Triggered by CLI or AutoRefresh
Code outline
FindPeer(id)
peers := dht.routingTable.NearestPeers(kb.ConvertPeerID(id), AlphaValue)
// note, LokupFailure if no peer in Routing Table
if len(peers) == 0 {
return peer.AddrInfo{}, kb.ErrLookupFailure
}
.
.
setupQuery
query := dht.newQuery() { dht.findPeerSingle(ctx, p, id) } -> dht.sendRequest
runQuery
resp, err := dht.sendRequest(ctx, p, pmes) // Here we got the response
// resp contain closerPeers which contain peer ids and their addresses
In sendRequest: try to get/create a ms/stream from dht.strmap[p]
dht.messageSenderForPeer -> ms.prepOrInvalidate -> ms.prep
Create the stream: ms.dht.host.NewStream(ctx, ms.p, ms.dht.protocols...)
In ms.SendRequest: The entire Write and Read operations are protected by ms.lk
ms.lk.Lock()
defer ms.lk.Unlock()
retry := false
for {
if err := ms.writeMsg(pmes); err != nil {
ms.s.Reset()
ms.s = nil
if retry {
logger.Info("error writing message, bailing: ", err)
return nil, err
}
logger.Info("error writing message, trying again: ", err)
retry = true
continue
}
mes := new(pb.Message)
if err := ms.ctxReadMsg(ctx, mes); err != nil {
HandleFindPeer
handleFindPeer
closest = dht.betterPeersToQuery(pmes, p, dht.bucketSize)
-> nearestPeersToQuery()
-> dht.routingTable.NearestPeers(kb.ConvertKey(string(pmes.GetKey())), count)
return closerPeers
callstack og handleFindPeer
github.com/libp2p/go-libp2p-kad-dht.(*IpfsDHT).handleFindPeer at handlers.go:264
github.com/libp2p/go-libp2p-kad-dht.(*IpfsDHT).handleFindPeer-fm at handlers.go:263
github.com/libp2p/go-libp2p-kad-dht.(*IpfsDHT).handleNewMessage at dht_net.go:135
github.com/libp2p/go-libp2p-kad-dht.(*IpfsDHT).handleNewStream at dht_net.go:66
github.com/libp2p/go-libp2p-kad-dht.(*IpfsDHT).handleNewStream-fm at dht_net.go:64
github.com/libp2p/go-libp2p/p2p/host/basic.(*BasicHost).SetStreamHandler.func1 at basic_host.go:397
runtime.goexit at asm_amd64.s:1357
- Async stack trace
github.com/libp2p/go-libp2p/p2p/host/basic.(*BasicHost).newStreamHandler at basic_host.go:295