[Checkins] SVN: zc.resumelb/trunk/src/zc/resumelb/ The update settings methods were changed to revert settings to
jim
cvs-admin at zope.org
Mon Mar 26 16:00:10 UTC 2012
Log message for revision 124736:
The update settings methods were changed to revert settings to
default when not provided. This is especially important when used
with ZooKeeper, so you can look at a tree and know what settings are
without knowing the change history.
Changed:
U zc.resumelb/trunk/src/zc/resumelb/README.txt
U zc.resumelb/trunk/src/zc/resumelb/lb.py
U zc.resumelb/trunk/src/zc/resumelb/lb.test
U zc.resumelb/trunk/src/zc/resumelb/pool.test
U zc.resumelb/trunk/src/zc/resumelb/worker.py
U zc.resumelb/trunk/src/zc/resumelb/worker.test
-=-
Modified: zc.resumelb/trunk/src/zc/resumelb/README.txt
===================================================================
--- zc.resumelb/trunk/src/zc/resumelb/README.txt 2012-03-26 15:57:25 UTC (rev 124735)
+++ zc.resumelb/trunk/src/zc/resumelb/README.txt 2012-03-26 16:00:07 UTC (rev 124736)
@@ -240,9 +240,14 @@
Change History
==============
-0.1.1 (2012-03-??)
+0.2.0 (2012-03-??)
------------------
+- The update settings methods were changed to revert settings to
+ default when not provided. This is especially important when used
+ with ZooKeeper, so you can look at a tree and know what settings are
+ without knowing the change history.
+
- Added graceful load-balancer and worker shutdown on SIGTERM.
- Added packaging meta data to help find gevent 1.0b1
Modified: zc.resumelb/trunk/src/zc/resumelb/lb.py
===================================================================
--- zc.resumelb/trunk/src/zc/resumelb/lb.py 2012-03-26 15:57:25 UTC (rev 124735)
+++ zc.resumelb/trunk/src/zc/resumelb/lb.py 2012-03-26 16:00:07 UTC (rev 124736)
@@ -98,12 +98,8 @@
class Pool:
- def __init__(self, unskilled_score=1.0, variance=4.0, backlog_history=9):
- self.unskilled_score = unskilled_score
- self.variance = variance
- self.backlog_history = backlog_history
- self._update_worker_decay()
-
+ def __init__(self,
+ unskilled_score=None, variance=None, backlog_history=None):
self.workers = set()
self.nworkers = 0
self.unskilled = llist.dllist()
@@ -111,14 +107,29 @@
self.event = gevent.event.Event()
_init_backlog(self)
+ self.update_settings(dict(
+ unskilled_score=unskilled_score,
+ variance=variance,
+ backlog_history=backlog_history))
+
+
+ _meta_settings = dict(
+ unskilled_score=1.0,
+ variance=4.0,
+ backlog_history=9
+ )
+
def update_settings(self, settings):
- for name in ('unskilled_score', 'variance', 'backlog_history'):
- if name in settings:
- setattr(self, name, settings[name])
+ for name, default in self._meta_settings.iteritems():
+ setting = settings.get(name)
+ if setting is None:
+ setting = default
+ else:
+ setting = type(default)(setting)
+ setattr(self, name, setting)
- if 'backlog_history' in settings:
- self._update_worker_decay()
- self._update_decay()
+ self._update_worker_decay()
+ self._update_decay()
def _update_decay(self):
if self.nworkers:
Modified: zc.resumelb/trunk/src/zc/resumelb/lb.test
===================================================================
--- zc.resumelb/trunk/src/zc/resumelb/lb.test 2012-03-26 15:57:25 UTC (rev 124735)
+++ zc.resumelb/trunk/src/zc/resumelb/lb.test 2012-03-26 16:00:07 UTC (rev 124736)
@@ -29,6 +29,12 @@
>>> lb = zc.resumelb.lb.LB([w.addr for w in workers],
... zc.resumelb.lb.host_classifier)
+Note that the lb provides an interface for changing pool
+settings. This is just a link to the pool's update_settings method:
+
+ >>> lb.update_settings == lb.pool.update_settings
+ True
+
We pass the constructor an iterable of addresses. The lb will connect
to these addresses. Let's wait for it to do so:
Modified: zc.resumelb/trunk/src/zc/resumelb/pool.test
===================================================================
--- zc.resumelb/trunk/src/zc/resumelb/pool.test 2012-03-26 15:57:25 UTC (rev 124735)
+++ zc.resumelb/trunk/src/zc/resumelb/pool.test 2012-03-26 16:00:07 UTC (rev 124736)
@@ -296,3 +296,23 @@
(3.0, 6, 0.25)
>>> pool.worker_decay, pool.decay # doctest: +ELLIPSIS
(0.916..., 0.972...)
+
+Note that settings revert to their default values when not specified:
+
+ >>> pool.update_settings({})
+ >>> pool.variance, pool.backlog_history, pool.unskilled_score
+ (4.0, 9, 1.0)
+ >>> pool.worker_decay, pool.decay # doctest: +ELLIPSIS
+ (0.944..., 0.981...)
+
+Settings are automatically coerced to their expected types:
+
+ >>> pool.update_settings(
+ ... dict(variance=3, backlog_history=6.2, unskilled_score=2))
+ >>> pool.variance, pool.backlog_history, pool.unskilled_score
+ (3.0, 6, 2.0)
+
+ >>> pool.update_settings(
+ ... dict(variance='2', backlog_history='7', unskilled_score='1'))
+ >>> pool.variance, pool.backlog_history, pool.unskilled_score
+ (2.0, 7, 1.0)
Modified: zc.resumelb/trunk/src/zc/resumelb/worker.py
===================================================================
--- zc.resumelb/trunk/src/zc/resumelb/worker.py 2012-03-26 15:57:25 UTC (rev 124735)
+++ zc.resumelb/trunk/src/zc/resumelb/worker.py 2012-03-26 16:00:07 UTC (rev 124736)
@@ -25,14 +25,11 @@
class Worker:
def __init__(self, app, addr,
- history=9999, max_skill_age=None,
+ history=None, max_skill_age=None,
resume_file=None, threads=None, tracelog=None,
tracelog_key='tracelog'):
- history = int(history)
self.app = app
- self.history = history
- self.max_skill_age = max_skill_age or history * 10
- self.decay = 1.0-1.0/history
+ self.update_settings(dict(history=history, max_skill_age=max_skill_age))
self.resume_file = resume_file
self.perf_data = {} # rclass -> (gen, decayed times, decayed counts)
self.generation = 0
@@ -123,14 +120,22 @@
self.addr = addr[0], self.server.server_port
def update_settings(self, data):
- if 'history' in data:
- self.history = data['history']
- if 'max_skill_age' not in data:
- self.max_skill_age = self.history * 10
- if 'max_skill_age' in data:
- self.max_skill_age = data['max_skill_age']
- self.decay = 1 - 1.0/self.history
+ history = data.get('history')
+ if history is None:
+ history = 9999
+ else:
+ history = int(history)
+ self.history = history
+ max_skill_age = data.get('max_skill_age')
+ if max_skill_age is None:
+ max_skill_age = history * 10
+ else:
+ max_skill_age = int(max_skill_age)
+ self.max_skill_age = max_skill_age
+
+ self.decay = 1 - 1.0/history
+
def stop(self):
self.server.stop()
if hasattr(self, 'threadpool'):
Modified: zc.resumelb/trunk/src/zc/resumelb/worker.test
===================================================================
--- zc.resumelb/trunk/src/zc/resumelb/worker.test 2012-03-26 15:57:25 UTC (rev 124735)
+++ zc.resumelb/trunk/src/zc/resumelb/worker.test 2012-03-26 16:00:07 UTC (rev 124736)
@@ -648,6 +648,15 @@
>>> worker.update_settings(dict(max_skill_age=99))
>>> worker.history, worker.max_skill_age
+ (9999, 99)
+
+Note that in the last example, the history setting reverted to it's
+default value, because it wasn't set in the settings.
+
+Settings are automaticaly coerced you they expected types:
+
+ >>> worker.update_settings(dict(history='5', max_skill_age='99'))
+ >>> worker.history, worker.max_skill_age
(5, 99)
Resume computation and decay
More information about the checkins
mailing list