dropping of tail shares
authorForrest Voight <forrest@forre.st>
Fri, 5 Aug 2011 00:22:01 +0000 (20:22 -0400)
committerForrest Voight <forrest@forre.st>
Fri, 5 Aug 2011 00:22:01 +0000 (20:22 -0400)
p2pool/bitcoin/data.py
p2pool/data.py

index f0df342..ca4fb73 100644 (file)
@@ -539,6 +539,7 @@ class Tracker(object):
         if share_hash not in self.shares:
             raise KeyError()
         share = self.shares[share_hash]
+        children = self.reverse_shares.get(share_hash, set())
         del share_hash
         
         if share.hash in self.heads and share.previous_hash in self.tails:
@@ -555,7 +556,7 @@ class Tracker(object):
                 self.tails[tail].add(share.previous_hash)
                 self.heads[share.previous_hash] = tail
         elif share.previous_hash in self.tails:
-            raise NotImplementedError() # will break other things..
+            #raise NotImplementedError() # will break other things..
             heads = self.tails[share.previous_hash]
             if len(self.reverse_shares[share.previous_hash]) > 1:
                 raise NotImplementedError()
@@ -567,6 +568,21 @@ class Tracker(object):
         else:
             raise NotImplementedError()
         
+        for share_hash2 in self.heights:
+            height_to, other_share_hash, work_inc = self.heights[share_hash2]
+            if other_share_hash != share.previous_hash:
+                continue
+            assert children
+            if len(children) == 1:
+                height_to -= 1
+                other_share_hash = share.hash
+                work_inc -= target_to_average_attempts(share.target)
+                self.heights[share_hash2] = height_to, other_share_hash, work_inc
+            else:
+                del self.heights[share_hash2]
+        if share.hash in self.heights:
+            del self.heights[share.hash]
+        
         '''
         height, tail = self.get_height_and_last(share.hash)
         
index 1eeb0fa..b4f1eb1 100644 (file)
@@ -377,21 +377,37 @@ class OkayTracker(bitcoin_data.Tracker):
                 )
         
         # eat away at heads
-        for share_hash in list(self.heads):
-            if share_hash in scores[-5:]:
-                continue
-            if self.shares[share_hash].time_seen > time.time() - 30:
-                continue
-            self.remove(share_hash)
-            if share_hash in self.verified.shares:
-                self.verified.remove(share_hash)
+        while True:
+            removed = False
+            for share_hash in list(self.heads):
+                if share_hash in scores[-5:]:
+                    continue
+                if self.shares[share_hash].time_seen > time.time() - 30:
+                    continue
+                self.remove(share_hash)
+                if share_hash in self.verified.shares:
+                    self.verified.remove(share_hash)
+                removed = True
+            if not removed:
+                break
         
-        for tail, heads in list(self.tails.iteritems()):
-            continue
-            if min(self.get_height(head) for head in heads) > 2*self.net.CHAIN_LENGTH + 10:
-                print "removing!"
-                self.remove(tail)
-                self.verified.remove(tail)
+        # drop tails
+        while True:
+            removed = False
+            # if removed from this, it must be removed from verified
+            for tail, heads in list(self.tails.iteritems()):
+                if min(self.get_height(head) for head in heads) < 2*self.net.CHAIN_LENGTH + 10:
+                    continue
+                start = time.time()
+                for aftertail in list(self.reverse_shares.get(tail, set())):
+                    self.remove(aftertail)
+                    if tail in self.verified.shares:
+                        self.verified.remove(aftertail)
+                    removed = True
+                end = time.time()
+                print "removed! %x %f" % (tail, end - start)
+            if not removed:
+                break
         
         best = scores[-1] if scores else None