diff options
author | Dan Prince <dprince@redhat.com> | 2012-06-26 12:44:35 -0400 |
---|---|---|
committer | Dan Prince <dprince@redhat.com> | 2012-07-11 10:23:58 -0400 |
commit | 034762e8060dcf0a11cb039b9d426b0d0bb1801d (patch) | |
tree | 8bc19c85fdff5a62552b5d42536a28e661c14db9 | |
parent | b91d2fc02d927066ed0fe21439ccb7548de4138f (diff) | |
download | nova-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.py | 13 |
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 |