Use copies of the routing table nodes in actions.
authorCameron Dale <camrdale@gmail.com>
Thu, 27 Mar 2008 00:09:04 +0000 (17:09 -0700)
committerCameron Dale <camrdale@gmail.com>
Thu, 27 Mar 2008 00:09:04 +0000 (17:09 -0700)
The recursive actions need to use copies of the nodes in the routing
table, otherwise the token and num_values could be preset or set
twice by multiple actions.

apt_p2p_Khashmir/khashmir.py
apt_p2p_Khashmir/node.py

index f8c718fc3e549c6bb2b94c71fc3dbfaaefca7afd..aa1a181c167dbb2094b35b42c38ae1b347419bb5 100644 (file)
@@ -9,6 +9,7 @@ warnings.simplefilter("ignore", DeprecationWarning)
 from datetime import datetime, timedelta
 from random import randrange, shuffle
 from sha import sha
 from datetime import datetime, timedelta
 from random import randrange, shuffle
 from sha import sha
+from copy import copy
 import os
 
 from twisted.internet.defer import Deferred
 import os
 
 from twisted.internet.defer import Deferred
@@ -175,6 +176,7 @@ class KhashmirBase(protocol.Factory):
         """
         # Get K nodes out of local table/cache
         nodes = self.table.findNodes(id)
         """
         # Get K nodes out of local table/cache
         nodes = self.table.findNodes(id)
+        nodes = [copy(node) for node in nodes]
         d = Deferred()
         if errback:
             d.addCallbacks(callback, errback)
         d = Deferred()
         if errback:
             d.addCallbacks(callback, errback)
@@ -374,6 +376,7 @@ class KhashmirRead(KhashmirBase):
         """
         # Get K nodes out of local table/cache
         nodes = self.table.findNodes(key)
         """
         # Get K nodes out of local table/cache
         nodes = self.table.findNodes(key)
+        nodes = [copy(node) for node in nodes]
         d = Deferred()
         if errback:
             d.addCallbacks(callback, errback)
         d = Deferred()
         if errback:
             d.addCallbacks(callback, errback)
index 49b8fe75a06923379d5bfecad8d86f083262a5aa..c1300c74a08ee2f9e4538d531cd442ebd8fe3688 100644 (file)
@@ -105,6 +105,17 @@ class Node:
     def __repr__(self):
         return `(self.id, self.host, self.port)`
     
     def __repr__(self):
         return `(self.id, self.host, self.port)`
     
+    def __copy__(self):
+        """Create a shallow copy of the node, resetting some values."""
+        cp = self.__class__(self.id, self.host, self.port)
+        cp.fails = self.fails
+        cp.lastSeen = self.lastSeen
+        if getattr(self, 'table', None) is not None:
+            cp.table = self.table
+        if getattr(self, 'conn', None) is not None:
+            cp.conn = self.conn
+        return cp
+    
     #{ Comparators to bisect/index a list of nodes with either a node or a long
     def __lt__(self, a):
         if type(a) == InstanceType:
     #{ Comparators to bisect/index a list of nodes with either a node or a long
     def __lt__(self, a):
         if type(a) == InstanceType: