split Tracker's subset_of handling into separate SubsetTracker class
authorForrest Voight <forrest@forre.st>
Fri, 19 Oct 2012 02:51:39 +0000 (22:51 -0400)
committerForrest Voight <forrest@forre.st>
Sat, 20 Oct 2012 20:00:09 +0000 (16:00 -0400)
p2pool/data.py
p2pool/util/forest.py

index 1815907..2aa0efc 100644 (file)
@@ -607,7 +607,7 @@ class OkayTracker(forest.Tracker):
             min_work=lambda share: bitcoin_data.target_to_average_attempts(share.max_target),
         )))
         self.net = net
-        self.verified = forest.Tracker(delta_type=forest.get_attributedelta_type(dict(forest.AttributeDelta.attrs,
+        self.verified = forest.SubsetTracker(delta_type=forest.get_attributedelta_type(dict(forest.AttributeDelta.attrs,
             work=lambda share: bitcoin_data.target_to_average_attempts(share.target),
             my_count=lambda share: 1 if share.hash in my_share_hashes else 0,
             my_doa_count=lambda share: 1 if share.hash in my_doa_share_hashes else 0,
index c9fe9e7..245e909 100644 (file)
@@ -88,7 +88,7 @@ AttributeDelta = get_attributedelta_type(dict(
 ))
 
 class Tracker(object):
-    def __init__(self, items=[], delta_type=AttributeDelta, subset_of=None):
+    def __init__(self, items=[], delta_type=AttributeDelta):
         self.items = {} # hash -> item
         self.reverse = {} # delta.tail -> set of item_hashes
         
@@ -105,13 +105,9 @@ class Tracker(object):
         self.added = variable.Event()
         self.removed = variable.Event()
         
-        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.get_nth_parent_hash = DistanceSkipList(self)
         
         self._delta_type = delta_type
-        self._subset_of = subset_of
         
         for item in items:
             self.add(item)
@@ -119,8 +115,6 @@ class Tracker(object):
     def add(self, item):
         assert not isinstance(item, (int, long, type(None)))
         delta = self._delta_type.from_element(item)
-        if self._subset_of is not None:
-            assert delta.head in self._subset_of.items
         
         if delta.head in self.items:
             raise ValueError('item already present')
@@ -151,8 +145,6 @@ class Tracker(object):
         assert isinstance(item_hash, (int, long, type(None)))
         if item_hash not in self.items:
             raise KeyError()
-        if self._subset_of is not None:
-            assert item_hash in self._subset_of.items
         
         item = self.items[item_hash]
         del item_hash
@@ -291,3 +283,20 @@ class Tracker(object):
             return None # not connected, so can't be determined
         height_up = child_height - height
         return height_up >= 0 and self.get_nth_parent_hash(possible_child_hash, height_up) == item_hash
+
+class SubsetTracker(Tracker):
+    def __init__(self, subset_of, **kwargs):
+        Tracker.__init__(self, **kwargs)
+        self.get_nth_parent_hash = subset_of.get_nth_parent_hash # overwrites Tracker.__init__'s
+        self._subset_of = subset_of
+    
+    def add(self, item):
+        delta = self._delta_type.from_element(item)
+        if self._subset_of is not None:
+            assert delta.head in self._subset_of.items
+        Tracker.add(self, item)
+    
+    def remove(self, item_hash):
+        if self._subset_of is not None:
+            assert item_hash in self._subset_of.items
+        Tracker.remove(self, item_hash)