]> git.mxchange.org Git - quix0rs-apt-p2p.git/blobdiff - apt_p2p_Khashmir/actions.py
Added the new paper targetting INFOCOM to the docs.
[quix0rs-apt-p2p.git] / apt_p2p_Khashmir / actions.py
index c49959ff82741efba5570109209dcb480b74ad0e..883bccbd29ee5c126be3d10f2c607d4429936fd7 100644 (file)
@@ -191,13 +191,22 @@ class ActionBase:
 
     def gotResponse(self, dict, node):
         """Receive a response from a remote node."""
-        if node.id != self.caller.node.id:
-            reactor.callLater(0, self.caller.insertNode, node)
-        if self.finished or self.answered.has_key(node.id):
+        if self.finished or self.answered.has_key(node.id) or self.failed.has_key(node.id):
             # a day late and a dollar short
             return
-        self.answered[node.id] = 1
-        self.processResponse(dict)
+        try:
+            # Process the response
+            self.processResponse(dict)
+        except Exception, e:
+            # Unexpected error with the response
+            log.msg("action %s failed on %s/%s: %r" % (self.action, node.host, node.port, e))
+            if node.id != self.caller.node.id:
+                self.caller.nodeFailed(node)
+            self.failed[node.id] = 1
+        else:
+            self.answered[node.id] = 1
+            if node.id != self.caller.node.id:
+                reactor.callLater(0, self.caller.insertNode, node)
         if self.outstanding.has_key(node.id):
             self.outstanding_results -= self.outstanding[node.id]
             del self.outstanding[node.id]
@@ -220,6 +229,8 @@ class ActionBase:
         Not called by default, but suitable for being called by
         L{processResponse} in a recursive node search.
         """
+        if nodes and type(nodes) != list:
+            raise ValueError, "got a malformed response, from bittorrent perhaps"
         for compact_node in nodes:
             node_contact = uncompact(compact_node)
             node = self.caller.Node(node_contact)