Merge "Add user messages periodic cleanup task"

This commit is contained in:
Jenkins 2017-07-19 14:03:27 +00:00 committed by Gerrit Code Review
commit b61f46452c
10 changed files with 77 additions and 5 deletions

View File

@ -46,7 +46,8 @@ def main():
log.setup(CONF, "manila")
utils.monkey_patch()
gmr.TextGuruMeditation.setup_autorun(version, conf=CONF)
server = service.Service.create(binary='manila-scheduler')
server = service.Service.create(binary='manila-scheduler',
coordination=True)
service.serve(server)
service.wait()

View File

@ -1283,3 +1283,8 @@ def message_create(context, values):
def message_destroy(context, message_id):
"""Deletes message with the specified ID."""
return IMPL.message_destroy(context, message_id)
def cleanup_expired_messages(context):
"""Soft delete expired messages"""
return IMPL.cleanup_expired_messages(context)

View File

@ -4632,3 +4632,12 @@ def message_destroy(context, message):
with session.begin():
(model_query(context, models.Message, session=session).
filter_by(id=message.get('id')).soft_delete())
@require_admin_context
def cleanup_expired_messages(context):
session = get_session()
now = timeutils.utcnow()
with session.begin():
return session.query(models.Message).filter(
models.Message.expires_at < now).delete()

View File

@ -27,6 +27,9 @@ from manila.message import message_levels
messages_opts = [
cfg.IntOpt('message_ttl', default=2592000,
help='Message minimum life in seconds.'),
cfg.IntOpt('message_reap_interval', default=86400,
help='Interval between periodic task runs to clean expired '
'messages in seconds.'),
]
CONF = cfg.CONF
@ -83,3 +86,8 @@ class API(base.Base):
def delete(self, context, id):
"""Delete message with the specified message id."""
return self.db.message_destroy(context, id)
def cleanup_expired_messages(self, context):
ctx = context.elevated()
count = self.db.cleanup_expired_messages(ctx)
LOG.info("Deleted %s expired messages.", count)

View File

@ -27,6 +27,7 @@ from oslo_utils import importutils
from manila.common import constants
from manila import context
from manila import coordination
from manila import db
from manila import exception
from manila import manager
@ -285,3 +286,9 @@ class SchedulerManager(manager.Manager):
with excutils.save_and_reraise_exception():
self._set_share_replica_error_state(
context, 'create_share_replica', exc, request_spec)
@periodic_task.periodic_task(spacing=CONF.message_reap_interval,
run_immediately=True)
@coordination.synchronized('locked-clean-expired-messages')
def _clean_expired_messages(self, context):
self.message_api.cleanup_expired_messages(context)

View File

@ -41,7 +41,7 @@ class ManilaCmdSchedulerTestCase(test.TestCase):
manila_scheduler.log.register_options.assert_called_once_with(CONF)
manila_scheduler.utils.monkey_patch.assert_called_once_with()
manila_scheduler.service.Service.create.assert_called_once_with(
binary='manila-scheduler')
binary='manila-scheduler', coordination=True)
manila_scheduler.service.wait.assert_called_once_with()
manila_scheduler.service.serve.assert_called_once_with(
manila_scheduler.service.Service.create.return_value)

View File

@ -2824,3 +2824,23 @@ class MessagesDatabaseAPITestCase(test.TestCase):
result = db_api.message_get_all(self.ctxt, sort_key='action_id')
result_ids = [r.id for r in result]
self.assertEqual(result_ids, ids)
def test_cleanup_expired_messages(self):
adm_context = self.ctxt.elevated()
now = timeutils.utcnow()
db_utils.create_message(project_id=self.project_id,
action_id='001',
expires_at=now)
db_utils.create_message(project_id=self.project_id,
action_id='001',
expires_at=now - datetime.timedelta(days=1))
db_utils.create_message(project_id=self.project_id,
action_id='001',
expires_at=now + datetime.timedelta(days=1))
with mock.patch.object(timeutils, 'utcnow') as mock_time_now:
mock_time_now.return_value = now
db_api.cleanup_expired_messages(adm_context)
messages = db_api.message_get_all(adm_context)
self.assertEqual(2, len(messages))

View File

@ -90,3 +90,11 @@ class MessageApiTest(test.TestCase):
self.message_api.db.message_destroy.assert_called_once_with(
self.ctxt, 'fake_id')
def test_cleanup_expired_messages(self):
admin_context = mock.Mock()
self.mock_object(self.ctxt, 'elevated',
mock.Mock(return_value=admin_context))
self.message_api.cleanup_expired_messages(self.ctxt)
self.message_api.db.cleanup_expired_messages.assert_called_once_with(
admin_context)

View File

@ -200,13 +200,22 @@ class SchedulerManagerTestCase(test.TestCase):
mock_expire.assert_called_once_with(self.context)
@mock.patch('manila.message.api.API.cleanup_expired_messages')
def test__clean_expired_messages(self, mock_expire):
self.manager._clean_expired_messages(self.context)
mock_expire.assert_called_once_with(self.context)
def test_periodic_tasks(self):
self.mock_periodic_task.assert_called_once_with(
spacing=600, run_immediately=True)
self.assertEqual(1, len(self.periodic_tasks))
self.assertEqual(2, self.mock_periodic_task.call_count)
self.assertEqual(2, len(self.periodic_tasks))
self.assertEqual(
self.periodic_tasks[0].__name__,
self.manager._expire_reservations.__name__)
self.assertEqual(
self.periodic_tasks[1].__name__,
self.manager._clean_expired_messages.__name__)
def test_get_pools(self):
"""Ensure get_pools exists and calls base_scheduler.get_pools."""

View File

@ -0,0 +1,5 @@
---
features:
- |
Added a periodic task which cleans up expired user messages. Cleanup
interval can be set by message_reap_interval config option.