summaryrefslogtreecommitdiffstats
path: root/nova
diff options
context:
space:
mode:
authorJenkins <jenkins@review.openstack.org>2012-06-25 18:00:19 +0000
committerGerrit Code Review <review@openstack.org>2012-06-25 18:00:19 +0000
commit2c7aa901b9174a4a4f04c5f8a52ef6c9d2d5d27c (patch)
tree21775987dc6e3c91bd49a3b50af090ecece3cdce /nova
parent259cf1cd39a46b36f47014d1b9770b52a563e9df (diff)
parent1b40708287808243be27b83791b7d23f8b51b194 (diff)
Merge "Fixes ram_allocation_ratio based over subscription"
Diffstat (limited to 'nova')
-rw-r--r--nova/scheduler/filters/ram_filter.py5
-rw-r--r--nova/scheduler/host_manager.py2
-rw-r--r--nova/tests/scheduler/test_host_filters.py16
3 files changed, 20 insertions, 3 deletions
diff --git a/nova/scheduler/filters/ram_filter.py b/nova/scheduler/filters/ram_filter.py
index 65889d426..4bc84c243 100644
--- a/nova/scheduler/filters/ram_filter.py
+++ b/nova/scheduler/filters/ram_filter.py
@@ -37,4 +37,7 @@ class RamFilter(filters.BaseHostFilter):
instance_type = filter_properties.get('instance_type')
requested_ram = instance_type['memory_mb']
free_ram_mb = host_state.free_ram_mb
- return free_ram_mb * FLAGS.ram_allocation_ratio >= requested_ram
+ total_usable_ram_mb = host_state.total_usable_ram_mb
+ used_ram_mb = total_usable_ram_mb - free_ram_mb
+ return (total_usable_ram_mb * FLAGS.ram_allocation_ratio -
+ used_ram_mb >= requested_ram)
diff --git a/nova/scheduler/host_manager.py b/nova/scheduler/host_manager.py
index d77fbbd14..2d5f41bae 100644
--- a/nova/scheduler/host_manager.py
+++ b/nova/scheduler/host_manager.py
@@ -124,7 +124,9 @@ class HostState(object):
all_disk_mb -= FLAGS.reserved_host_disk_mb
if FLAGS.reserved_host_memory_mb > 0:
all_ram_mb -= FLAGS.reserved_host_memory_mb
+ #NOTE(jogo) free_ram_mb can be negative
self.free_ram_mb = all_ram_mb
+ self.total_usable_ram_mb = all_ram_mb
self.free_disk_mb = all_disk_mb
self.vcpus_total = vcpus_total
diff --git a/nova/tests/scheduler/test_host_filters.py b/nova/tests/scheduler/test_host_filters.py
index 80da5acd2..cb619dbac 100644
--- a/nova/tests/scheduler/test_host_filters.py
+++ b/nova/tests/scheduler/test_host_filters.py
@@ -274,10 +274,22 @@ class HostFiltersTestCase(test.TestCase):
capabilities = {'enabled': True}
service = {'disabled': False}
host = fakes.FakeHostState('host1', 'compute',
- {'free_ram_mb': 1023, 'capabilities': capabilities,
- 'service': service})
+ {'free_ram_mb': 1023, 'total_usable_ram_mb': 1024,
+ 'capabilities': capabilities, 'service': service})
self.assertFalse(filt_cls.host_passes(host, filter_properties))
+ def test_ram_filter_oversubscribe(self):
+ self._stub_service_is_up(True)
+ filt_cls = self.class_map['RamFilter']()
+ self.flags(ram_allocation_ratio=2.0)
+ filter_properties = {'instance_type': {'memory_mb': 1024}}
+ capabilities = {'enabled': True}
+ service = {'disabled': False}
+ host = fakes.FakeHostState('host1', 'compute',
+ {'free_ram_mb': -1024, 'total_usable_ram_mb': 2048,
+ 'capabilities': capabilities, 'service': service})
+ self.assertTrue(filt_cls.host_passes(host, filter_properties))
+
def test_compute_filter_fails_on_service_disabled(self):
self._stub_service_is_up(True)
filt_cls = self.class_map['ComputeFilter']()