summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDan Prince <dprince@redhat.com>2012-06-26 12:44:35 -0400
committerDan Prince <dprince@redhat.com>2012-07-11 10:23:58 -0400
commit034762e8060dcf0a11cb039b9d426b0d0bb1801d (patch)
tree8bc19c85fdff5a62552b5d42536a28e661c14db9
parentb91d2fc02d927066ed0fe21439ccb7548de4138f (diff)
downloadnova-034762e8060dcf0a11cb039b9d426b0d0bb1801d.tar.gz
nova-034762e8060dcf0a11cb039b9d426b0d0bb1801d.tar.xz
nova-034762e8060dcf0a11cb039b9d426b0d0bb1801d.zip
Use compute_api.get_all in affinity filters.
Updates the affinity filters so they make a single compute API call to lookup instance host information rather than single lookups for each UUID. This resolves a potential performance issue which can cause a scheduler to hang while processing requests which contain large numbers of UUID's in the scheduler_hints. Fixes LP Bug #1017795. Change-Id: I30f434faf109058573ee41c4a6abce2e48939e8d
-rw-r--r--nova/scheduler/filters/affinity_filter.py13
1 files changed, 9 insertions, 4 deletions
diff --git a/nova/scheduler/filters/affinity_filter.py b/nova/scheduler/filters/affinity_filter.py
index e2a38b1e6..03bf0dd6e 100644
--- a/nova/scheduler/filters/affinity_filter.py
+++ b/nova/scheduler/filters/affinity_filter.py
@@ -25,8 +25,11 @@ class AffinityFilter(filters.BaseHostFilter):
def __init__(self):
self.compute_api = compute.API()
- def _affinity_host(self, context, instance_id):
- return self.compute_api.get(context, instance_id)['host']
+ def _all_hosts(self, context):
+ all_hosts = {}
+ for instance in self.compute_api.get_all(context):
+ all_hosts[instance['uuid']] = instance['host']
+ return all_hosts
class DifferentHostFilter(AffinityFilter):
@@ -41,8 +44,9 @@ class DifferentHostFilter(AffinityFilter):
if isinstance(affinity_uuids, basestring):
affinity_uuids = [affinity_uuids]
if affinity_uuids:
+ all_hosts = self._all_hosts(context)
return not any([i for i in affinity_uuids
- if self._affinity_host(context, i) == me])
+ if all_hosts.get(i) == me])
# With no different_host key
return True
@@ -61,9 +65,10 @@ class SameHostFilter(AffinityFilter):
if isinstance(affinity_uuids, basestring):
affinity_uuids = [affinity_uuids]
if affinity_uuids:
+ all_hosts = self._all_hosts(context)
return any([i for i
in affinity_uuids
- if self._affinity_host(context, i) == me])
+ if all_hosts.get(i) == me])
# With no same_host key
return True