ipfs, libp2p, dht findpeer procedure

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   
发布了11 篇原创文章 · 获赞 4 · 访问量 564

猜你喜欢

转载自blog.csdn.net/m0_37889044/article/details/104394172
DHT