From 07f242d68cac8c23e92a1ebc64094b0df26e7812 Mon Sep 17 00:00:00 2001 From: wangxiyuan Date: Thu, 25 May 2017 11:45:40 +0800 Subject: [PATCH] Periodic task to clean expired reservation Now there is no way to clean the expired reservation. This patch added a periodic task in cinder-scheduler to do the cleanup like Nova does. Change-Id: Id792db968ed2fe8e01c64e24d99c9ebadc3232b7 Closes-bug: #1693401 --- cinder/quota.py | 4 ++++ cinder/scheduler/manager.py | 5 +++++ cinder/tests/unit/scheduler/test_scheduler.py | 9 ++++++++- .../period-task-clean-reservation-0e0617a7905df923.yaml | 5 +++++ 4 files changed, 22 insertions(+), 1 deletion(-) create mode 100644 releasenotes/notes/period-task-clean-reservation-0e0617a7905df923.yaml 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.