diff --git a/lbrynet/dht/node.py b/lbrynet/dht/node.py index c7393366b..03f56ca9d 100644 --- a/lbrynet/dht/node.py +++ b/lbrynet/dht/node.py @@ -110,7 +110,7 @@ class Node(object): # Create k-buckets (for storing contacts) 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: self._routingTable = routingTableClass(self.node_id, self.clock.seconds) diff --git a/lbrynet/dht/routingtable.py b/lbrynet/dht/routingtable.py index 02f8e9686..05acb56f6 100644 --- a/lbrynet/dht/routingtable.py +++ b/lbrynet/dht/routingtable.py @@ -285,75 +285,3 @@ class TreeRoutingTable(object): 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())