Added support for replacement_nodes pruning in KBuckets for ()

This commit is contained in:
Anders Jensen 2020-05-03 02:36:16 +02:00 committed by GitHub
parent 82d50d3967
commit a0cc40bfe8
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 18 additions and 1 deletions

@ -9,12 +9,13 @@ from kademlia.utils import shared_prefix, bytes_to_bit_string
class KBucket:
def __init__(self, rangeLower, rangeUpper, ksize):
def __init__(self, rangeLower, rangeUpper, ksize, replacementNodeFactor=5):
self.range = (rangeLower, rangeUpper)
self.nodes = OrderedDict()
self.replacement_nodes = OrderedDict()
self.touch_last_updated()
self.ksize = ksize
self.replacement_node_factor = replacementNodeFactor
def touch_last_updated(self):
self.last_updated = time.monotonic()
@ -67,6 +68,9 @@ class KBucket:
if node.id in self.replacement_nodes:
del self.replacement_nodes[node.id]
self.replacement_nodes[node.id] = node
max_replacement_nodes = self.ksize * self.replacement_node_factor
while len(self.replacement_nodes) > max_replacement_nodes:
self.replacement_nodes.popitem(last=False)
return False
return True

@ -65,6 +65,19 @@ class TestKBucket:
assert bucket.has_in_range(mknode(intid=10)) is True
assert bucket.has_in_range(mknode(intid=0)) is True
def test_replacement_factor(self, mknode): # pylint: disable=no-self-use
k = 3
factor = 2
bucket = KBucket(0, 10, k, replacementNodeFactor=factor)
nodes = [mknode() for _ in range(10)]
for node in nodes:
bucket.add_node(node)
replacement_nodes = bucket.replacement_nodes
assert len(list(replacement_nodes.values())) == k * factor
assert list(replacement_nodes.values()) == nodes[k + 1:]
assert nodes[k] not in list(replacement_nodes.values())
# pylint: disable=too-few-public-methods
class TestRoutingTable: