parent
82d50d3967
commit
a0cc40bfe8
kademlia
@ -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:
|
||||
|
Loading…
x
Reference in New Issue
Block a user