avoid future contact id parsing bugs by passing the contact id as an arg

This commit is contained in:
Jack Robison 2017-10-24 19:17:17 -04:00
parent 0b771c16ba
commit 9479179259
No known key found for this signature in database
GPG key ID: 284699E7404E3CFF

View file

@ -10,6 +10,7 @@ import random
from zope.interface import implements from zope.interface import implements
import constants import constants
import kbucket import kbucket
import protocol
from interface import IRoutingTable from interface import IRoutingTable
import logging import logging
@ -76,17 +77,13 @@ class TreeRoutingTable(object):
# the k-bucket. This implementation follows section # the k-bucket. This implementation follows section
# 2.2 regarding this point. # 2.2 regarding this point.
def replaceContact(failure): def replaceContact(failure, deadContactID):
""" Callback for the deferred PING RPC to see if the head """ Callback for the deferred PING RPC to see if the head
node in the k-bucket is still responding node in the k-bucket is still responding
@type failure: twisted.python.failure.Failure @type failure: twisted.python.failure.Failure
""" """
# 'failure' is a Failure with an error message in the format: failure.trap(protocol.TimeoutError)
# "Timeout connecting to <node id hex>"
error_message = failure.getErrorMessage()
deadContactID = error_message[22:].decode('hex')
if len(deadContactID) != constants.key_bits / 8: if len(deadContactID) != constants.key_bits / 8:
raise ValueError("invalid contact id") raise ValueError("invalid contact id")
log.debug("Replacing dead contact: %s", deadContactID.encode('hex')) log.debug("Replacing dead contact: %s", deadContactID.encode('hex'))
@ -104,7 +101,7 @@ class TreeRoutingTable(object):
df = head_contact.ping() df = head_contact.ping()
# If there's an error (i.e. timeout), remove the head # If there's an error (i.e. timeout), remove the head
# contact, and append the new one # contact, and append the new one
df.addErrback(replaceContact) df.addErrback(replaceContact, head_contact.id)
def findCloseNodes(self, key, count, _rpcNodeID=None): def findCloseNodes(self, key, count, _rpcNodeID=None):
""" Finds a number of known nodes closest to the node/value with the """ Finds a number of known nodes closest to the node/value with the