summaryrefslogtreecommitdiffstats
path: root/nova/cells
diff options
context:
space:
mode:
authorBrian Elliott <bdelliott@gmail.com>2013-05-13 08:38:56 +0000
committerGerrit Code Review <review@openstack.org>2013-05-28 21:51:04 +0000
commit407dd98fc2381013aa6153e3a793e80303770912 (patch)
treea0efc34760de86419423fd4c515f21022b91090a /nova/cells
parenta3e6133628310b0f41fad7271b048e30c0401e62 (diff)
downloadnova-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.py72
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