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):
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
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))
))
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
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)
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')
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