[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