Skip to content

Commit ee85784

Browse files
committed
perf: kad less work
1 parent 8e853b9 commit ee85784

File tree

1 file changed

+13
-6
lines changed

1 file changed

+13
-6
lines changed

pkg/topology/kademlia/kademlia.go

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1279,7 +1279,15 @@ func (k *Kad) ClosestPeer(addr swarm.Address, includeSelf bool, filter topology.
12791279
closest = k.base
12801280
}
12811281

1282-
err := k.EachConnectedPeerRev(func(peer swarm.Address, po uint8) (bool, bool, error) {
1282+
prox := swarm.Proximity(k.base.Bytes(), addr.Bytes())
1283+
1284+
// iterate starting from bin 0 to the maximum bin
1285+
err := k.EachConnectedPeerRev(func(peer swarm.Address, bin uint8) (bool, bool, error) {
1286+
1287+
if bin > prox && !closest.IsZero() {
1288+
return true, false, nil
1289+
}
1290+
12831291
if swarm.ContainsAddress(skipPeers, peer) {
12841292
return false, false, nil
12851293
}
@@ -1317,9 +1325,9 @@ func (k *Kad) ClosestPeer(addr swarm.Address, includeSelf bool, filter topology.
13171325

13181326
// EachConnectedPeer implements topology.PeerIterator interface.
13191327
func (k *Kad) EachConnectedPeer(f topology.EachPeerFunc, filter topology.Select) error {
1320-
filters := excludeFromIterator(filter)
1328+
excludeFunc := k.opt.ExcludeFunc(excludeFromIterator(filter)...)
13211329
return k.connectedPeers.EachBin(func(addr swarm.Address, po uint8) (bool, bool, error) {
1322-
if k.opt.ExcludeFunc(filters...)(addr) {
1330+
if excludeFunc(addr) {
13231331
return false, false, nil
13241332
}
13251333
return f(addr, po)
@@ -1328,9 +1336,9 @@ func (k *Kad) EachConnectedPeer(f topology.EachPeerFunc, filter topology.Select)
13281336

13291337
// EachConnectedPeerRev implements topology.PeerIterator interface.
13301338
func (k *Kad) EachConnectedPeerRev(f topology.EachPeerFunc, filter topology.Select) error {
1331-
filters := excludeFromIterator(filter)
1339+
excludeFunc := k.opt.ExcludeFunc(excludeFromIterator(filter)...)
13321340
return k.connectedPeers.EachBinRev(func(addr swarm.Address, po uint8) (bool, bool, error) {
1333-
if k.opt.ExcludeFunc(filters...)(addr) {
1341+
if excludeFunc(addr) {
13341342
return false, false, nil
13351343
}
13361344
return f(addr, po)
@@ -1397,7 +1405,6 @@ func (k *Kad) SubscribeTopologyChange() (c <-chan struct{}, unsubscribe func())
13971405
func excludeFromIterator(filter topology.Select) []im.ExcludeOp {
13981406

13991407
ops := make([]im.ExcludeOp, 0, 3)
1400-
14011408
ops = append(ops, im.Bootnode())
14021409

14031410
if filter.Reachable {

0 commit comments

Comments
 (0)