[Checkins] SVN: zc.resumelb/branches/jinty-external-pool/src/zc/resumelb/ Allow the default pool class to be overridden.

Brian Sutherland cvs-admin at zope.org
Tue Jul 24 08:36:27 UTC 2012


Log message for revision 127383:
  Allow the default pool class to be overridden.
  

Changed:
  U   zc.resumelb/branches/jinty-external-pool/src/zc/resumelb/lb.py
  U   zc.resumelb/branches/jinty-external-pool/src/zc/resumelb/tests.py
  U   zc.resumelb/branches/jinty-external-pool/src/zc/resumelb/zk.py
  U   zc.resumelb/branches/jinty-external-pool/src/zc/resumelb/zk.test

-=-
Modified: zc.resumelb/branches/jinty-external-pool/src/zc/resumelb/lb.py
===================================================================
--- zc.resumelb/branches/jinty-external-pool/src/zc/resumelb/lb.py	2012-07-24 08:29:16 UTC (rev 127382)
+++ zc.resumelb/branches/jinty-external-pool/src/zc/resumelb/lb.py	2012-07-24 08:36:24 UTC (rev 127383)
@@ -30,10 +30,13 @@
 
     def __init__(self, worker_addrs, classifier,
                  disconnect_message=default_disconnect_message,
+                 pool_factory=None,
                  **pool_settings):
         self.classifier = classifier
         self.disconnect_message = disconnect_message
-        self.pool = Pool(**pool_settings)
+        if pool_factory is None:
+            pool_factory = Pool
+        self.pool = pool_factory(**pool_settings)
         self.update_settings = self.pool.update_settings
         self.workletts = {}
         self.set_worker_addrs(worker_addrs)

Modified: zc.resumelb/branches/jinty-external-pool/src/zc/resumelb/tests.py
===================================================================
--- zc.resumelb/branches/jinty-external-pool/src/zc/resumelb/tests.py	2012-07-24 08:29:16 UTC (rev 127382)
+++ zc.resumelb/branches/jinty-external-pool/src/zc/resumelb/tests.py	2012-07-24 08:36:24 UTC (rev 127383)
@@ -300,6 +300,9 @@
 def test_classifier(env):
     return "yup, it's a test"
 
+class TestPool(zc.resumelb.lb.Pool):
+    pass
+
 def setUp(test):
     zope.testing.setupstack.setUpDirectory(test)
     zope.testing.setupstack.context_manager(test, mock.patch('gevent.signal'))

Modified: zc.resumelb/branches/jinty-external-pool/src/zc/resumelb/zk.py
===================================================================
--- zc.resumelb/branches/jinty-external-pool/src/zc/resumelb/zk.py	2012-07-24 08:29:16 UTC (rev 127382)
+++ zc.resumelb/branches/jinty-external-pool/src/zc/resumelb/zk.py	2012-07-24 08:36:24 UTC (rev 127383)
@@ -100,6 +100,12 @@
         socket.settimeout(self.__socket_timeout)
         return gevent.pywsgi.WSGIServer.handle(self, socket, address)
 
+def _resolve(path):
+    rcmod, rcexpr = path.split(':')
+    __import__(rcmod)
+    rcmod = sys.modules[rcmod]
+    return eval(rcexpr, rcmod.__dict__)
+
 def lbmain(args=None, run=True):
     """%prog [options] zookeeper_connection path
 
@@ -145,6 +151,10 @@
         help="Request classification function (module:expr)"
         )
     parser.add_option(
+        '-p', '--pool-factory', default='zc.resumelb.lb:Pool',
+        help="Callable which creates a pool (module:expr). Will be called with settings as keyword arguments."
+        )
+    parser.add_option(
         '-s', '--status-server',
         help=("Run a status server for getting pool information. "
               "The argument is a unix-domain socket path to listen on."))
@@ -180,10 +190,8 @@
 
     zk = zc.zk.ZooKeeper(zookeeper)
     addrs = zk.children(path+'/workers/providers')
-    rcmod, rcexpr = options.request_classifier.split(':')
-    __import__(rcmod)
-    rcmod = sys.modules[rcmod]
-    request_classifier = eval(rcexpr, rcmod.__dict__)
+    request_classifier = _resolve(options.request_classifier)
+    pool_factory = _resolve(options.pool_factory)
 
     disconnect_message = options.disconnect_message
     if disconnect_message:
@@ -195,6 +203,7 @@
     from zc.resumelb.lb import LB
     lb = LB(map(zc.parse_addr.parse_addr, ()),
             request_classifier, disconnect_message,
+            pool_factory=pool_factory,
             single_version=options.single_version)
 
 

Modified: zc.resumelb/branches/jinty-external-pool/src/zc/resumelb/zk.test
===================================================================
--- zc.resumelb/branches/jinty-external-pool/src/zc/resumelb/zk.test	2012-07-24 08:29:16 UTC (rev 127382)
+++ zc.resumelb/branches/jinty-external-pool/src/zc/resumelb/zk.test	2012-07-24 08:36:24 UTC (rev 127383)
@@ -217,6 +217,10 @@
       -r REQUEST_CLASSIFIER, --request-classifier=REQUEST_CLASSIFIER
                             Request classification function
                             (module:expr)
+      -p POOL_FACTORY, --pool-factory=POOL_FACTORY
+                            Callable which creates a pool (module:expr).
+                            Will be called with settings as keyword
+                            arguments.
       -s STATUS_SERVER, --status-server=STATUS_SERVER
                             Run a status server for getting pool
                             information. The argument is a unix-domain
@@ -536,3 +540,25 @@
       overall backlog: 0 Decayed: 0 Avg: 0
       0: [127.0.0.1:39208, 127.0.0.1:60073]
 
+Overriding the default Pool class
+=================================
+
+If you wish to override the default Pool class, you can use the pool-factory
+(``-p``, ``--pool-factory``) option. Pool factories can be any callable that
+takes keyword arguments.
+
+    >>> lb, server = zc.resumelb.zk.lbmain(
+    ...     'zookeeper.example.com:2181 /test/lb -pzc.resumelb.tests:TestPool')
+    >>> gevent.sleep(1)
+    >>> with mock.patch('ZConfig.configureLoggers') as configureLoggers:
+    ...   with mock.patch('logging.basicConfig') as basicConfig:
+    ...     worker = zc.resumelb.zk.worker(
+    ...         app, None,
+    ...         zookeeper='zookeeper.example.com:2181', path='/test/lb/workers',
+    ...         address='127.0.0.1:0', run=False, version='42')
+    >>> gevent.sleep(.01)
+
+Our pool is an instance of the TestPool class we specified:
+
+    >>> isinstance(lb.pool, zc.resumelb.tests.TestPool)
+    True



More information about the checkins mailing list