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") log.setup(CONF, "manila")
utils.monkey_patch() utils.monkey_patch()
gmr.TextGuruMeditation.setup_autorun(version, conf=CONF) 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.serve(server)
service.wait() service.wait()

View File

@ -1283,3 +1283,8 @@ def message_create(context, values):
def message_destroy(context, message_id): def message_destroy(context, message_id):
"""Deletes message with the specified ID.""" """Deletes message with the specified ID."""
return IMPL.message_destroy(context, message_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(): with session.begin():
(model_query(context, models.Message, session=session). (model_query(context, models.Message, session=session).
filter_by(id=message.get('id')).soft_delete()) 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 = [ messages_opts = [
cfg.IntOpt('message_ttl', default=2592000, cfg.IntOpt('message_ttl', default=2592000,
help='Message minimum life in seconds.'), 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 CONF = cfg.CONF
@ -83,3 +86,8 @@ class API(base.Base):
def delete(self, context, id): def delete(self, context, id):
"""Delete message with the specified message id.""" """Delete message with the specified message id."""
return self.db.message_destroy(context, 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.common import constants
from manila import context from manila import context
from manila import coordination
from manila import db from manila import db
from manila import exception from manila import exception
from manila import manager from manila import manager
@ -285,3 +286,9 @@ class SchedulerManager(manager.Manager):
with excutils.save_and_reraise_exception(): with excutils.save_and_reraise_exception():
self._set_share_replica_error_state( self._set_share_replica_error_state(
context, 'create_share_replica', exc, request_spec) 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.log.register_options.assert_called_once_with(CONF)
manila_scheduler.utils.monkey_patch.assert_called_once_with() manila_scheduler.utils.monkey_patch.assert_called_once_with()
manila_scheduler.service.Service.create.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.wait.assert_called_once_with()
manila_scheduler.service.serve.assert_called_once_with( manila_scheduler.service.serve.assert_called_once_with(
manila_scheduler.service.Service.create.return_value) 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 = db_api.message_get_all(self.ctxt, sort_key='action_id')
result_ids = [r.id for r in result] result_ids = [r.id for r in result]
self.assertEqual(result_ids, ids) 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.message_api.db.message_destroy.assert_called_once_with(
self.ctxt, 'fake_id') 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_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): def test_periodic_tasks(self):
self.mock_periodic_task.assert_called_once_with( self.assertEqual(2, self.mock_periodic_task.call_count)
spacing=600, run_immediately=True)
self.assertEqual(1, len(self.periodic_tasks)) self.assertEqual(2, len(self.periodic_tasks))
self.assertEqual( self.assertEqual(
self.periodic_tasks[0].__name__, self.periodic_tasks[0].__name__,
self.manager._expire_reservations.__name__) self.manager._expire_reservations.__name__)
self.assertEqual(
self.periodic_tasks[1].__name__,
self.manager._clean_expired_messages.__name__)
def test_get_pools(self): def test_get_pools(self):
"""Ensure get_pools exists and calls base_scheduler.get_pools.""" """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.