Added on_load hooks to important objects.
authorslush <info@bitcoin.cz>
Sun, 9 Sep 2012 22:49:49 +0000 (22:49 +0000)
committerslush <info@bitcoin.cz>
Sun, 9 Sep 2012 22:49:49 +0000 (22:49 +0000)
Report all rejected shares to ShareManager

lib/block_updater.py
lib/coinbaser.py
mining/__init__.py
mining/interfaces.py
mining/service.py

index 3ed44b8..b80a024 100644 (file)
@@ -24,9 +24,9 @@ class BlockUpdater(object):
                         
     def schedule(self):
         when = self._get_next_time()
-        log.debug("Next prevhash update in %.03f sec" % when)
-        log.debug("Merkle update in next %.03f sec" % \
-                  ((self.registry.last_update + settings.MERKLE_REFRESH_INTERVAL)-Interfaces.timestamper.time()))
+        #log.debug("Next prevhash update in %.03f sec" % when)
+        #log.debug("Merkle update in next %.03f sec" % \
+        #          ((self.registry.last_update + settings.MERKLE_REFRESH_INTERVAL)-Interfaces.timestamper.time()))
         self.clock = reactor.callLater(when, self.run)
         
     def _get_next_time(self):
index 04b7d80..f3fd14b 100644 (file)
@@ -1,4 +1,5 @@
 import util
+from twisted.internet import defer
 
 import stratum.logger
 log = stratum.logger.get_logger('coinbaser')
@@ -10,11 +11,13 @@ class SimpleCoinbaser(object):
     for all generated blocks.'''
     
     def __init__(self, bitcoin_rpc, address):
+        # Fire callback when coinbaser is ready
+        self.on_load = defer.Deferred()
+        
         self.address = address
         self.is_valid = False # We need to check if pool can use this address
         
         self.bitcoin_rpc = bitcoin_rpc
-        
         self._validate()
 
     def _validate(self):
@@ -26,6 +29,10 @@ class SimpleCoinbaser(object):
         if result['isvalid'] and result['ismine']:
             self.is_valid = True
             log.info("Coinbase address '%s' is valid" % self.address)
+            
+            if not self.on_load.called:
+                self.on_load.callback(True)
+                
         else:
             self.is_valid = False
             log.error("Coinbase address '%s' is NOT valid!" % self.address)
index 4709e14..03366d3 100644 (file)
@@ -1,16 +1,22 @@
 from service import MiningService
 from subscription import MiningSubscription
+from twisted.internet import defer
 
+@defer.inlineCallbacks
 def setup():
     '''Setup mining service internal environment.
     You should not need to change this. If you
     want to use another Worker manager or Share manager,
     you should set proper reference to Interfaces class
     *before* you call setup() in the launcher script.'''
-        
+
     from stratum import settings
     from interfaces import Interfaces
     
+    # Let's wait until share manager and worker manager boot up
+    (yield Interfaces.share_manager.on_load)
+    (yield Interfaces.worker_manager.on_load)
+    
     from lib.block_updater import BlockUpdater
     from lib.template_registry import TemplateRegistry
     from lib.bitcoin_rpc import BitcoinRPC
@@ -22,8 +28,11 @@ def setup():
                              settings.BITCOIN_TRUSTED_USER,
                              settings.BITCOIN_TRUSTED_PASSWORD)
     
+    coinbaser = SimpleCoinbaser(bitcoin_rpc, settings.CENTRAL_WALLET)
+    (yield coinbaser.on_load)
+    
     registry = TemplateRegistry(BlockTemplate,
-                                SimpleCoinbaser(bitcoin_rpc, settings.CENTRAL_WALLET),
+                                coinbaser,
                                 bitcoin_rpc,
                                 settings.INSTANCE_ID,
                                 MiningSubscription.on_block)
@@ -35,4 +44,8 @@ def setup():
     # Set up polling mechanism for detecting new block on the network
     # This is just failsafe solution when -blocknotify
     # mechanism is not working properly    
-    BlockUpdater(registry, bitcoin_rpc)
\ No newline at end of file
+    BlockUpdater(registry, bitcoin_rpc)
+    
+    import stratum.logger
+    log = stratum.logger.get_logger('mining')
+    log.info("MINING SERVICE IS READY")    
index 812f0d0..88f5417 100644 (file)
@@ -5,17 +5,28 @@
 ''' 
 
 import time
+from twisted.internet import reactor, defer
 
 import stratum.logger
 log = stratum.logger.get_logger('interfaces')
 
 class WorkerManagerInterface(object):
+    def __init__(self):
+        # Fire deferred when manager is ready
+        self.on_load = defer.Deferred()
+        self.on_load.callback(True)
+        
     def authorize(self, worker_name, worker_password):
         return True
 
 class ShareManagerInterface(object):
+    def __init__(self):
+        # Fire deferred when manager is ready
+        self.on_load = defer.Deferred()
+        self.on_load.callback(True)
+
     def on_submit_share(self, worker_name, block_header, block_hash, shares, timestamp, is_valid):
-        log.info("%s %s %s" % ('Valid' if is_valid else 'INVALID', worker_name, block_hash))
+        log.info("%s %s %s" % (block_hash, 'valid' if is_valid else 'INVALID', worker_name))
     
     def on_submit_block(self, worker_name, block_header, block_hash, timestamp, is_accepted):
         log.info("Block %s %s" % (block_hash, 'ACCEPTED' if is_accepted else 'REJECTED'))
index f3a6861..8bdccd2 100644 (file)
@@ -83,13 +83,10 @@ class MiningService(GenericService):
         (is_valid, reason, block_header, block_hash) = Interfaces.template_registry.submit_share(job_id,
                                                 worker_name, extranonce1_bin, extranonce2, ntime, nonce, difficulty,
                                                 Interfaces.share_manager.on_submit_block)
-        
-        if block_header != None:
-            # block header is missing when template registry was unable to build it
-            # from given parameters. Client side is probably broken, storing such
-            # submit don't have any sense.                   
-            Interfaces.share_manager.on_submit_share(worker_name, block_header, block_hash, difficulty,
-                                              Interfaces.timestamper.time(), is_valid)
+   
+        # block_header and block_hash may be None when submitted data are corrupted     
+        Interfaces.share_manager.on_submit_share(worker_name, block_header, block_hash, difficulty,
+                                                 Interfaces.timestamper.time(), is_valid)
         
         if not is_valid:
             raise SubmitException(reason)