diff options
| author | Brian Elliott <bdelliott@gmail.com> | 2013-05-13 08:38:56 +0000 |
|---|---|---|
| committer | Gerrit Code Review <review@openstack.org> | 2013-05-28 21:51:04 +0000 |
| commit | 407dd98fc2381013aa6153e3a793e80303770912 (patch) | |
| tree | a0efc34760de86419423fd4c515f21022b91090a /nova/cells | |
| parent | a3e6133628310b0f41fad7271b048e30c0401e62 (diff) | |
| download | nova-407dd98fc2381013aa6153e3a793e80303770912.tar.gz nova-407dd98fc2381013aa6153e3a793e80303770912.tar.xz nova-407dd98fc2381013aa6153e3a793e80303770912.zip | |
Cell weighing class to handle mute child cells
Give negative weight to child cells that have not recently sent
capability or capacity updates to their parent cell.
Change-Id: I7cada3e1b6f04c48b71c82d8e0a8527e44674abd
Diffstat (limited to 'nova/cells')
| -rw-r--r-- | nova/cells/weights/mute_child.py | 72 |
1 files changed, 72 insertions, 0 deletions
diff --git a/nova/cells/weights/mute_child.py b/nova/cells/weights/mute_child.py new file mode 100644 index 000000000..b8fd0570b --- /dev/null +++ b/nova/cells/weights/mute_child.py @@ -0,0 +1,72 @@ +# Copyright (c) 2013 Rackspace Hosting +# All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +""" +If a child cell hasn't sent capacity or capability updates in a while, +downgrade its likelihood of being chosen for scheduling requests. +""" + +from oslo.config import cfg + +from nova.cells import weights +from nova.openstack.common import log as logging +from nova.openstack.common import timeutils + +LOG = logging.getLogger(__name__) + +mute_weigher_opts = [ + cfg.FloatOpt('mute_weight_multiplier', + default=-10.0, + help='Multiplier used to weigh mute children. (The value ' + 'should be negative.)'), + cfg.FloatOpt('mute_weight_value', + default=1000.0, + help='Weight value assigned to mute children. (The value ' + 'should be positive.)'), + cfg.IntOpt("mute_child_interval", + default=300, + help='Number of seconds after which a lack of capability and ' + 'capacity updates signals the child cell is to be ' + 'treated as a mute.') +] + +CONF = cfg.CONF +CONF.register_opts(mute_weigher_opts, group='cells') + + +class MuteChildWeigher(weights.BaseCellWeigher): + """If a child cell hasn't been heard from, greatly lower its selection + weight. + """ + + def _weight_multiplier(self): + # negative multiplier => lower weight + return CONF.cells.mute_weight_multiplier + + def _weigh_object(self, cell, weight_properties): + """Check cell against the last_seen timestamp that indicates the time + that the most recent capability or capacity update was received from + the given cell.""" + + last_seen = cell.last_seen + secs = CONF.cells.mute_child_interval + + if timeutils.is_older_than(last_seen, secs): + # yep, that's a mute child; recommend highly that it be skipped! + LOG.warn(_("%(cell)s has not been seen since %(last_seen)s and is " + "being treated as mute.") % locals()) + return CONF.cells.mute_weight_value + else: + return 0 |
