]> git.mxchange.org Git - quix0rs-apt-p2p.git/blobdiff - apt_dht_Khashmir/actions.py
Return a token in find_node responses, use it in store_value requests.
[quix0rs-apt-p2p.git] / apt_dht_Khashmir / actions.py
index 9bfa2e8a708be3a5726b35fff76f7dad0772d9bf..6766cd9c6169dd8301cd6ff6c052d663175b0541 100644 (file)
@@ -2,8 +2,10 @@
 # see LICENSE.txt for license information
 
 from twisted.internet import reactor
+from twisted.python import log
 
 from khash import intify
+from util import uncompact
 
 class ActionBase:
     """ base class for some long running asynchronous proccesses like finding nodes or values """
@@ -43,13 +45,16 @@ class FindNode(ActionBase):
         dict = dict['rsp']
         n = self.caller.Node(dict["id"], _krpc_sender[0], _krpc_sender[1])
         self.caller.insertNode(n)
+        if dict["id"] in self.found:
+            self.found[dict["id"]].updateToken(dict.get('token', ''))
         l = dict["nodes"]
         if self.finished or self.answered.has_key(dict["id"]):
             # a day late and a dollar short
             return
         self.outstanding = self.outstanding - 1
         self.answered[dict["id"]] = 1
-        for node in l:
+        for compact_node in l:
+            node = uncompact(compact_node)
             n = self.caller.Node(node)
             if not self.found.has_key(n.id):
                 self.found[n.id] = n
@@ -83,7 +88,8 @@ class FindNode(ActionBase):
     
     def makeMsgFailed(self, node):
         def defaultGotNodes(err, self=self, node=node):
-            print ">>> find failed (%s) %s/%s" % (self.config['PORT'], node.host, node.port), err
+            log.msg("find failed (%s) %s/%s" % (self.config['PORT'], node.host, node.port))
+            log.err(err)
             self.caller.table.nodeFailed(node)
             self.outstanding = self.outstanding - 1
             self.schedule()
@@ -123,7 +129,8 @@ class GetValue(FindNode):
         # go through nodes
         # if we have any closer than what we already got, query them
         if dict.has_key('nodes'):
-            for node in dict['nodes']:
+            for compact_node in dict['nodes']:
+                node = uncompact(compact_node)
                 n = self.caller.Node(node)
                 if not self.found.has_key(n.id):
                     self.found[n.id] = n
@@ -153,7 +160,7 @@ class GetValue(FindNode):
                 try:
                     f = getattr(node, self.findValue)
                 except AttributeError:
-                    print ">>> findValue %s doesn't have a %s method!" % (node, self.findValue)
+                    log.msg("findValue %s doesn't have a %s method!" % (node, self.findValue))
                 else:
                     df = f(self.target, self.caller.node.id)
                     df.addCallback(self.handleGotNodes)
@@ -205,7 +212,7 @@ class StoreValue(ActionBase):
         return t
     
     def storeFailed(self, t, node):
-        print ">>> store failed %s/%s" % (node.host, node.port)
+        log.msg("store failed %s/%s" % (node.host, node.port))
         self.caller.nodeFailed(node)
         self.outstanding -= 1
         if self.finished:
@@ -232,9 +239,9 @@ class StoreValue(ActionBase):
                     try:
                         f = getattr(node, self.store)
                     except AttributeError:
-                        print ">>> %s doesn't have a %s method!" % (node, self.store)
+                        log.msg("%s doesn't have a %s method!" % (node, self.store))
                     else:
-                        df = f(self.target, self.value, self.caller.node.id)
+                        df = f(self.target, self.value, node.token, self.caller.node.id)
                         df.addCallback(self.storedValue, node=node)
                         df.addErrback(self.storeFailed, node=node)