From: Forrest Voight Date: Sat, 7 Apr 2012 05:01:39 +0000 (-0400) Subject: added subset_of argument to Tracker, letting skiplist be cleanly shared X-Git-Tag: 0.10.4~10 X-Git-Url: https://git.novaco.in/?p=p2pool.git;a=commitdiff_plain;h=968c9c1f9bc5b51171bcfda7dc8827052972b560 added subset_of argument to Tracker, letting skiplist be cleanly shared --- diff --git a/p2pool/data.py b/p2pool/data.py index 633ce6b..9ee2595 100644 --- a/p2pool/data.py +++ b/p2pool/data.py @@ -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)) diff --git a/p2pool/util/forest.py b/p2pool/util/forest.py index 32e6fff..7222322 100644 --- a/p2pool/util/forest.py +++ b/p2pool/util/forest.py @@ -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