in worker_interface, cache merkle roots by moving timestamp forward
authorForrest Voight <forrest@forre.st>
Fri, 23 Dec 2011 06:32:53 +0000 (01:32 -0500)
committerForrest Voight <forrest@forre.st>
Fri, 23 Dec 2011 07:06:28 +0000 (02:06 -0500)
p2pool/bitcoin/worker_interface.py
p2pool/main.py

index 8c03255..5d82312 100644 (file)
@@ -2,6 +2,7 @@ from __future__ import division
 
 import base64
 import random
+import weakref
 
 from twisted.internet import defer
 
@@ -37,6 +38,10 @@ class WorkerInterface(jsonrpc.Server):
         
         self.worker_views = {}
         
+        self.work_cache = {} # username -> (blockattempt, work-identifier-string)
+        watch_id = new_work_event.watch(lambda *args: self_ref().work_cache.clear())
+        self_ref = weakref.ref(self, lambda _: new_work_event.unwatch(watch_id))
+        
         self.putChild('long-polling', LongPollingWorkerInterface(self))
         self.putChild('', self)
     
@@ -46,7 +51,7 @@ class WorkerInterface(jsonrpc.Server):
     @defer.inlineCallbacks
     def getwork(self, request, data, long_poll):
         request.setHeader('X-Long-Polling', '/long-polling')
-        request.setHeader('X-Roll-NTime', 'expire=60')
+        request.setHeader('X-Roll-NTime', 'expire=10')
         
         if data is not None:
             defer.returnValue(self.response_callback(getwork.decode_data(data), request))
@@ -65,7 +70,14 @@ class WorkerInterface(jsonrpc.Server):
                 print 'POLL %i WAITING user=%r' % (id, get_username(request))
             yield self.new_work_event.get_deferred()
         
-        res, identifier = self.compute(request)
+        username = get_username(request)
+        
+        if username in self.work_cache:
+            res, identifier = self.work_cache[username]
+        else:
+            res, identifier = self.compute(username)
+        
+        self.work_cache[username] = res.update(timestamp=res.timestamp + 12), identifier # XXX doesn't bound timestamp
         
         if long_poll:
             self.worker_views[request_id].set(self.new_work_event.times)
index bbc352d..a69c106 100644 (file)
@@ -418,9 +418,8 @@ def main(args, net, datadir_path):
             except: # XXX blah
                 return None
         
-        def compute(request):
+        def compute(user):
             state = current_work.value
-            user = worker_interface.get_username(request)
             
             payout_script = get_payout_script_from_username(user)
             if payout_script is None or random.uniform(0, 100) < args.worker_fee: