Allow provisioning to reach max oversubscription

Currently if provisioned ratio is equal to max_over_subscription_ratio,
the capacity filter does not allow any more thin provisioning. This patch
makes a change so that thin provisioning is allowed if provisioned ratio
is equal to max_over_subscription_ratio; it will only stop provisioning
if provisioned ratio is greater than max_over_subscription_ratio.

Change-Id: Ibf13ef97472b80a1b59ffd4389a4ed2eacf67205
Partial-Bug: #1458976
(cherry picked from commit ab017d98b1)
This commit is contained in:
Xing Yang 2015-06-03 10:40:26 -04:00
parent 71d5fff341
commit 28bb8d27d5
2 changed files with 23 additions and 1 deletions

View File

@ -89,7 +89,7 @@ class CapacityFilter(filters.BaseHostFilter):
host_state.max_over_subscription_ratio > 1):
provisioned_ratio = ((host_state.provisioned_capacity_gb +
volume_size) / total)
if provisioned_ratio >= host_state.max_over_subscription_ratio:
if provisioned_ratio > host_state.max_over_subscription_ratio:
LOG.warning(_LW(
"Insufficient free space for thin provisioning. "
"The ratio of provisioned capacity over total capacity "

View File

@ -138,6 +138,28 @@ class CapacityFilterTestCase(HostFiltersTestCase):
'service': service})
self.assertTrue(filt_cls.host_passes(host, filter_properties))
@mock.patch('cinder.utils.service_is_up')
def test_filter_thin_true_passes2(self, _mock_serv_is_up):
_mock_serv_is_up.return_value = True
filt_cls = self.class_map['CapacityFilter']()
filter_properties = {'size': 3000,
'capabilities:thin_provisioning_support':
'<is> True',
'capabilities:thick_provisioning_support':
'<is> False'}
service = {'disabled': False}
host = fakes.FakeHostState('host1',
{'total_capacity_gb': 500,
'free_capacity_gb': 200,
'provisioned_capacity_gb': 7000,
'max_over_subscription_ratio': 20,
'reserved_percentage': 5,
'thin_provisioning_support': True,
'thick_provisioning_support': False,
'updated_at': None,
'service': service})
self.assertTrue(filt_cls.host_passes(host, filter_properties))
@mock.patch('cinder.utils.service_is_up')
def test_filter_thin_false_passes(self, _mock_serv_is_up):
_mock_serv_is_up.return_value = True