mirror of
https://github.com/ethereum/go-ethereum.git
synced 2026-08-19 18:32:23 +00:00
swarm/network: Cover edge case when only proxpeers and more than one farthest
This commit is contained in:
parent
08eb59bd6a
commit
b5717a7a13
2 changed files with 32 additions and 2 deletions
|
|
@ -454,20 +454,32 @@ func (k *Kademlia) neighbourhoodDepth() (depth int) {
|
||||||
}
|
}
|
||||||
var size int
|
var size int
|
||||||
var b bool
|
var b bool
|
||||||
|
var lastPo int
|
||||||
f := func(v pot.Val, i int) bool {
|
f := func(v pot.Val, i int) bool {
|
||||||
size++
|
size++
|
||||||
|
|
||||||
|
// the actual depth of the farthest nn
|
||||||
if size == k.MinProxBinSize {
|
if size == k.MinProxBinSize {
|
||||||
b = true
|
b = true
|
||||||
depth = i
|
depth = i
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// if there are empty bins between farthest nn and current node, the depth should be the farthest of those empty bins
|
||||||
if b && i < depth {
|
if b && i < depth {
|
||||||
depth = i + 1
|
depth = i + 1
|
||||||
|
lastPo = i
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
lastPo = i
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
k.conns.EachNeighbour(k.base, pof, f)
|
k.conns.EachNeighbour(k.base, pof, f)
|
||||||
|
|
||||||
|
// cover edge case where more than one farthest nn and only proxpeers
|
||||||
|
if lastPo == depth {
|
||||||
|
depth = 0
|
||||||
|
}
|
||||||
return depth
|
return depth
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -76,7 +76,7 @@ func Register(k *Kademlia, regs ...string) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestNeighborhoodDepth(t *testing.T) {
|
func TestNeighbourhoodDepth(t *testing.T) {
|
||||||
baseAddressBytes := RandomAddr().OAddr
|
baseAddressBytes := RandomAddr().OAddr
|
||||||
kad := NewKademlia(baseAddressBytes, NewKadParams())
|
kad := NewKademlia(baseAddressBytes, NewKadParams())
|
||||||
|
|
||||||
|
|
@ -103,7 +103,7 @@ func TestNeighborhoodDepth(t *testing.T) {
|
||||||
kad.On(midPeer)
|
kad.On(midPeer)
|
||||||
depth = kad.NeighbourhoodDepth()
|
depth = kad.NeighbourhoodDepth()
|
||||||
if depth != 5 {
|
if depth != 5 {
|
||||||
t.Fatalf("expected depth 4, was %d", depth)
|
t.Fatalf("expected depth 5, was %d", depth)
|
||||||
}
|
}
|
||||||
|
|
||||||
kad.Off(midPeer)
|
kad.Off(midPeer)
|
||||||
|
|
@ -119,6 +119,24 @@ func TestNeighborhoodDepth(t *testing.T) {
|
||||||
if depth != 2 {
|
if depth != 2 {
|
||||||
t.Fatalf("expected depth 2, was %d", depth)
|
t.Fatalf("expected depth 2, was %d", depth)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
midSameAddress := pot.RandomAddressAt(baseAddress, 4)
|
||||||
|
midSamePeer := newTestDiscoveryPeer(midSameAddress, kad)
|
||||||
|
kad.Off(closerPeer)
|
||||||
|
kad.On(midPeer)
|
||||||
|
kad.On(midSamePeer)
|
||||||
|
depth = kad.NeighbourhoodDepth()
|
||||||
|
if depth != 2 {
|
||||||
|
t.Fatalf("expected depth 2, was %d", depth)
|
||||||
|
}
|
||||||
|
|
||||||
|
kad.Off(fartherPeer)
|
||||||
|
log.Trace(kad.string())
|
||||||
|
time.Sleep(time.Millisecond)
|
||||||
|
depth = kad.NeighbourhoodDepth()
|
||||||
|
if depth != 0 {
|
||||||
|
t.Fatalf("expected depth 0, was %d", depth)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func testSuggestPeer(k *Kademlia, expAddr string, expPo int, expWant bool) error {
|
func testSuggestPeer(k *Kademlia, expAddr string, expPo int, expWant bool) error {
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue