forked from LBRYCommunity/lbry-sdk
remove OptimizedTreeRoutingTable for now, use TreeRoutingTable
This commit is contained in:
parent
d65dc0aec3
commit
e52689a33d
2 changed files with 1 additions and 73 deletions
|
@ -110,7 +110,7 @@ class Node(object):
|
||||||
|
|
||||||
# Create k-buckets (for storing contacts)
|
# Create k-buckets (for storing contacts)
|
||||||
if routingTableClass is None:
|
if routingTableClass is None:
|
||||||
self._routingTable = routingtable.OptimizedTreeRoutingTable(self.node_id, self.clock.seconds)
|
self._routingTable = routingtable.TreeRoutingTable(self.node_id, self.clock.seconds)
|
||||||
else:
|
else:
|
||||||
self._routingTable = routingTableClass(self.node_id, self.clock.seconds)
|
self._routingTable = routingTableClass(self.node_id, self.clock.seconds)
|
||||||
|
|
||||||
|
|
|
@ -285,75 +285,3 @@ class TreeRoutingTable(object):
|
||||||
oldBucket.removeContact(contact)
|
oldBucket.removeContact(contact)
|
||||||
|
|
||||||
|
|
||||||
class OptimizedTreeRoutingTable(TreeRoutingTable):
|
|
||||||
""" A version of the "tree"-type routing table specified by Kademlia,
|
|
||||||
along with contact accounting optimizations specified in section 4.1 of
|
|
||||||
of the 13-page version of the Kademlia paper.
|
|
||||||
"""
|
|
||||||
|
|
||||||
def __init__(self, parentNodeID, getTime=None):
|
|
||||||
TreeRoutingTable.__init__(self, parentNodeID, getTime)
|
|
||||||
# Cache containing nodes eligible to replace stale k-bucket entries
|
|
||||||
self._replacementCache = {}
|
|
||||||
|
|
||||||
def addContact(self, contact):
|
|
||||||
""" Add the given contact to the correct k-bucket; if it already
|
|
||||||
exists, its status will be updated
|
|
||||||
|
|
||||||
@param contact: The contact to add to this node's k-buckets
|
|
||||||
@type contact: kademlia.contact.Contact
|
|
||||||
"""
|
|
||||||
|
|
||||||
if contact.id == self._parentNodeID:
|
|
||||||
return
|
|
||||||
|
|
||||||
# Initialize/reset the "successively failed RPC" counter
|
|
||||||
contact.failedRPCs = 0
|
|
||||||
|
|
||||||
bucketIndex = self._kbucketIndex(contact.id)
|
|
||||||
try:
|
|
||||||
self._buckets[bucketIndex].addContact(contact)
|
|
||||||
except kbucket.BucketFull:
|
|
||||||
# The bucket is full; see if it can be split (by checking
|
|
||||||
# if its range includes the host node's id)
|
|
||||||
if self._buckets[bucketIndex].keyInRange(self._parentNodeID):
|
|
||||||
self._splitBucket(bucketIndex)
|
|
||||||
# Retry the insertion attempt
|
|
||||||
self.addContact(contact)
|
|
||||||
else:
|
|
||||||
# We can't split the k-bucket
|
|
||||||
# NOTE: This implementation follows section 4.1 of the 13 page version
|
|
||||||
# of the Kademlia paper (optimized contact accounting without PINGs
|
|
||||||
# - results in much less network traffic, at the expense of some memory)
|
|
||||||
|
|
||||||
# Put the new contact in our replacement cache for the
|
|
||||||
# corresponding k-bucket (or update it's position if
|
|
||||||
# it exists already)
|
|
||||||
if bucketIndex not in self._replacementCache:
|
|
||||||
self._replacementCache[bucketIndex] = []
|
|
||||||
if contact in self._replacementCache[bucketIndex]:
|
|
||||||
self._replacementCache[bucketIndex].remove(contact)
|
|
||||||
elif len(self._replacementCache[bucketIndex]) >= constants.replacementCacheSize:
|
|
||||||
self._replacementCache[bucketIndex].pop(0)
|
|
||||||
self._replacementCache[bucketIndex].append(contact)
|
|
||||||
|
|
||||||
def removeContact(self, contactID):
|
|
||||||
""" Remove the contact with the specified node ID from the routing
|
|
||||||
table
|
|
||||||
|
|
||||||
@param contactID: The node ID of the contact to remove
|
|
||||||
@type contactID: str
|
|
||||||
"""
|
|
||||||
bucketIndex = self._kbucketIndex(contactID)
|
|
||||||
try:
|
|
||||||
contact = self._buckets[bucketIndex].getContact(contactID)
|
|
||||||
except ValueError:
|
|
||||||
return
|
|
||||||
contact.failedRPCs += 1
|
|
||||||
if contact.failedRPCs >= constants.rpcAttempts:
|
|
||||||
self._buckets[bucketIndex].removeContact(contactID)
|
|
||||||
# Replace this stale contact with one from our replacement cache, if we have any
|
|
||||||
if bucketIndex in self._replacementCache:
|
|
||||||
if len(self._replacementCache[bucketIndex]) > 0:
|
|
||||||
self._buckets[bucketIndex].addContact(
|
|
||||||
self._replacementCache[bucketIndex].pop())
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue