diff --git a/dht.go b/dht.go index 43223290..824c17e5 100644 --- a/dht.go +++ b/dht.go @@ -737,7 +737,7 @@ func (dht *IpfsDHT) FindLocal(ctx context.Context, id peer.ID) peer.AddrInfo { _, span := internal.StartSpan(ctx, "IpfsDHT.FindLocal", trace.WithAttributes(attribute.Stringer("PeerID", id))) defer span.End() - if dht.host.Network().Connectedness(id) == network.Connected { + if HasValidConnectedness(dht.host, id) { return dht.peerstore.PeerInfo(id) } return peer.AddrInfo{} @@ -926,7 +926,7 @@ func (dht *IpfsDHT) newContextWithLocalTags(ctx context.Context, extraTags ...ta func (dht *IpfsDHT) maybeAddAddrs(p peer.ID, addrs []ma.Multiaddr, ttl time.Duration) { // Don't add addresses for self or our connected peers. We have better ones. - if p == dht.self || dht.host.Network().Connectedness(p) == network.Connected { + if p == dht.self || HasValidConnectedness(dht.host, p) { return } dht.peerstore.AddAddrs(p, dht.filterAddrs(addrs), ttl) diff --git a/dht_filters.go b/dht_filters.go index 27e9e8d9..c56c3ca1 100644 --- a/dht_filters.go +++ b/dht_filters.go @@ -238,3 +238,8 @@ func inAddrRange(ip net.IP, ipnets []*net.IPNet) bool { return false } + +func HasValidConnectedness(host host.Host, id peer.ID) bool { + connectedness := host.Network().Connectedness(id) + return connectedness == network.Connected || connectedness == network.Limited +} diff --git a/fullrt/dht.go b/fullrt/dht.go index 99cf188d..3383b27e 100644 --- a/fullrt/dht.go +++ b/fullrt/dht.go @@ -1459,8 +1459,7 @@ func (dht *FullRT) FindPeer(ctx context.Context, id peer.ID) (pi peer.AddrInfo, // Return peer information if we tried to dial the peer during the query or we are (or recently were) connected // to the peer. - connectedness := dht.h.Network().Connectedness(id) - if connectedness == network.Connected { + if kaddht.HasValidConnectedness(dht.h, id) { return dht.h.Peerstore().PeerInfo(id), nil } @@ -1538,7 +1537,7 @@ func (dht *FullRT) getRecordFromDatastore(ctx context.Context, dskey ds.Key) (*r // FindLocal looks for a peer with a given ID connected to this dht and returns the peer and the table it was found in. func (dht *FullRT) FindLocal(id peer.ID) peer.AddrInfo { - if dht.h.Network().Connectedness(id) == network.Connected { + if kaddht.HasValidConnectedness(dht.h, id) { return dht.h.Peerstore().PeerInfo(id) } return peer.AddrInfo{} @@ -1546,7 +1545,7 @@ func (dht *FullRT) FindLocal(id peer.ID) peer.AddrInfo { func (dht *FullRT) maybeAddAddrs(p peer.ID, addrs []multiaddr.Multiaddr, ttl time.Duration) { // Don't add addresses for self or our connected peers. We have better ones. - if p == dht.h.ID() || dht.h.Network().Connectedness(p) == network.Connected { + if p == dht.h.ID() || kaddht.HasValidConnectedness(dht.h, p) { return } dht.h.Peerstore().AddAddrs(p, addrs, ttl) diff --git a/query_test.go b/query_test.go index 99c10d96..ee4f8e1c 100644 --- a/query_test.go +++ b/query_test.go @@ -34,18 +34,18 @@ func TestRTEvictionOnFailedQuery(t *testing.T) { // peers should be in the RT because of fixLowPeers require.NoError(t, tu.WaitFor(ctx, func() error { if !checkRoutingTable(d1, d2) { - return fmt.Errorf("should have routes 0") + return fmt.Errorf("should have routes") } return nil })) - // close both hosts so query fails - require.NoError(t, d1.host.Close()) - require.NoError(t, d2.host.Close()) - // peers will still be in the RT because we have decoupled membership from connectivity + // clear the addresses of the peers so that the next queries fail + d1.host.Peerstore().ClearAddrs(d2.self) + d2.host.Peerstore().ClearAddrs(d1.self) + // peers will still be in the RT because RT is decoupled with the host and peerstore require.NoError(t, tu.WaitFor(ctx, func() error { if !checkRoutingTable(d1, d2) { - return fmt.Errorf("should have routes 1") + return fmt.Errorf("should have routes") } return nil })) @@ -59,7 +59,7 @@ func TestRTEvictionOnFailedQuery(t *testing.T) { require.NoError(t, tu.WaitFor(ctx, func() error { if checkRoutingTable(d1, d2) { - return fmt.Errorf("should not have routes 2") + return fmt.Errorf("should not have routes") } return nil })) diff --git a/routing.go b/routing.go index 890cec82..bba9bdb1 100644 --- a/routing.go +++ b/routing.go @@ -8,7 +8,6 @@ import ( "sync" "time" - "github.com/libp2p/go-libp2p/core/network" "github.com/libp2p/go-libp2p/core/peer" "github.com/libp2p/go-libp2p/core/peerstore" "github.com/libp2p/go-libp2p/core/routing" @@ -664,7 +663,7 @@ func (dht *IpfsDHT) FindPeer(ctx context.Context, id peer.ID) (pi peer.AddrInfo, return peers, err }, func(*qpeerset.QueryPeerset) bool { - return dht.host.Network().Connectedness(id) == network.Connected + return HasValidConnectedness(dht.host, id) }, ) @@ -685,8 +684,7 @@ func (dht *IpfsDHT) FindPeer(ctx context.Context, id peer.ID) (pi peer.AddrInfo, // Return peer information if we tried to dial the peer during the query or we are (or recently were) connected // to the peer. - connectedness := dht.host.Network().Connectedness(id) - if dialedPeerDuringQuery || connectedness == network.Connected { + if dialedPeerDuringQuery || HasValidConnectedness(dht.host, id) { return dht.peerstore.PeerInfo(id), nil }