diff --git a/cinder/quota.py b/cinder/quota.py index 5452f1f0e11..4ef6d86b517 100644 --- a/cinder/quota.py +++ b/cinder/quota.py @@ -62,6 +62,10 @@ quota_opts = [ cfg.IntOpt('reservation_expire', default=86400, help='Number of seconds until a reservation expires'), + cfg.IntOpt('reservation_clean_interval', + default='$reservation_expire', + help='Interval between periodic task runs to clean expired ' + 'reservations in seconds.'), cfg.IntOpt('until_refresh', default=0, help='Count of reservations until usage is refreshed'), diff --git a/cinder/scheduler/manager.py b/cinder/scheduler/manager.py index 5db8b09e6ae..3bfeb794779 100644 --- a/cinder/scheduler/manager.py +++ b/cinder/scheduler/manager.py @@ -99,6 +99,11 @@ class SchedulerManager(manager.CleanableManager, manager.Manager): def _clean_expired_messages(self, context): self.message_api.cleanup_expired_messages(context) + @periodic_task.periodic_task(spacing=CONF.reservation_clean_interval, + run_immediately=True) + def _clean_expired_reservation(self, context): + QUOTAS.expire(context) + def update_service_capabilities(self, context, service_name=None, host=None, capabilities=None, cluster_name=None, timestamp=None, diff --git a/cinder/tests/unit/scheduler/test_scheduler.py b/cinder/tests/unit/scheduler/test_scheduler.py index 6c32675ed1f..ae3400b7a36 100644 --- a/cinder/tests/unit/scheduler/test_scheduler.py +++ b/cinder/tests/unit/scheduler/test_scheduler.py @@ -94,12 +94,19 @@ class SchedulerManagerTestCase(test.TestCase): self.assertIsNone(volume_rpcapi.client.serializer._base.manifest) @mock.patch('cinder.message.api.API.cleanup_expired_messages') - def test__clean_expired_messages(self, mock_clean): + def test_clean_expired_messages(self, mock_clean): self.manager._clean_expired_messages(self.context) mock_clean.assert_called_once_with(self.context) + @mock.patch('cinder.quota.QuotaEngine.expire') + def test_clean_expired_reservation(self, mock_clean): + + self.manager._clean_expired_reservation(self.context) + + mock_clean.assert_called_once_with(self.context) + @mock.patch('cinder.scheduler.driver.Scheduler.' 'update_service_capabilities') def test_update_service_capabilities_empty_dict(self, _mock_update_cap): diff --git a/releasenotes/notes/period-task-clean-reservation-0e0617a7905df923.yaml b/releasenotes/notes/period-task-clean-reservation-0e0617a7905df923.yaml new file mode 100644 index 00000000000..7f51fd4c2a8 --- /dev/null +++ b/releasenotes/notes/period-task-clean-reservation-0e0617a7905df923.yaml @@ -0,0 +1,5 @@ +--- +features: + - Added periodic task to clean expired reservation in cinder scheduler. + Added a configuration option ``reservation_clean_interval`` to handle + the interval.