added subset_of argument to Tracker, letting skiplist be cleanly shared
authorForrest Voight <forrest.voight@gmail.com>
Sat, 7 Apr 2012 05:01:39 +0000 (01:01 -0400)
committerForrest Voight <forrest@forre.st>
Fri, 13 Apr 2012 16:43:52 +0000 (12:43 -0400)
p2pool/data.py
p2pool/util/forest.py

index 633ce6b..9ee2595 100644 (file)
@@ -304,9 +304,7 @@ class OkayTracker(forest.Tracker):
             my_doa_count=lambda share: 1 if share.hash in my_doa_share_hashes else 0,
             my_orphan_announce_count=lambda share: 1 if share.hash in my_share_hashes and share.share_data['stale_info'] == 253 else 0,
             my_dead_announce_count=lambda share: 1 if share.hash in my_share_hashes and share.share_data['stale_info'] == 254 else 0,
-        )))
-        self.verified.get_nth_parent_hash = self.get_nth_parent_hash # self is a superset of self.verified
-        
+        )), subset_of=self)
         self.get_cumulative_weights = WeightsSkipList(self)
     
     def attempt_verify(self, share):
@@ -416,9 +414,9 @@ class OkayTracker(forest.Tracker):
                 if not to_remove:
                     break
                 for share_hash in to_remove:
-                    self.remove(share_hash)
                     if share_hash in self.verified.shares:
                         self.verified.remove(share_hash)
+                    self.remove(share_hash)
                 #print "_________", to_remove
         
         # drop tails
@@ -440,9 +438,9 @@ class OkayTracker(forest.Tracker):
                 if self.shares[aftertail].previous_hash not in self.tails:
                     print "erk", aftertail, self.shares[aftertail].previous_hash
                     continue
-                self.remove(aftertail)
                 if aftertail in self.verified.shares:
                     self.verified.remove(aftertail)
+                self.remove(aftertail)
             #end = time.time()
             #print "removed! %i %f" % (len(to_remove), (end - start)/len(to_remove))
         
index 32e6fff..7222322 100644 (file)
@@ -88,7 +88,7 @@ AttributeDelta = get_attributedelta_type(dict(
 ))
 
 class Tracker(object):
-    def __init__(self, shares=[], delta_type=AttributeDelta):
+    def __init__(self, shares=[], delta_type=AttributeDelta, subset_of=None):
         self.shares = {} # hash -> share
         self.reverse_shares = {} # delta.tail -> set of share_hashes
         
@@ -105,9 +105,13 @@ class Tracker(object):
         self.added = variable.Event()
         self.removed = variable.Event()
         
-        self.get_nth_parent_hash = DistanceSkipList(self)
+        if subset_of is None:
+            self.get_nth_parent_hash = DistanceSkipList(self)
+        else:
+            self.get_nth_parent_hash = subset_of.get_nth_parent_hash
         
         self.delta_type = delta_type
+        self.subset_of = subset_of
         
         for share in shares:
             self.add(share)
@@ -115,6 +119,8 @@ class Tracker(object):
     def add(self, share):
         assert not isinstance(share, (int, long, type(None)))
         delta = self.delta_type.from_element(share)
+        if self.subset_of is not None:
+            assert delta.head in self.subset_of.shares
         
         if delta.head in self.shares:
             raise ValueError('share already present')
@@ -145,6 +151,8 @@ class Tracker(object):
         assert isinstance(share_hash, (int, long, type(None)))
         if share_hash not in self.shares:
             raise KeyError()
+        if self.subset_of is not None:
+            assert share_hash in self.subset_of.shares
         
         share = self.shares[share_hash]
         del share_hash