Merge "Add user messages periodic cleanup task"
This commit is contained in:
commit
b61f46452c
|
@ -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()
|
||||||
|
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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()
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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))
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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."""
|
||||||
|
|
|
@ -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.
|
Loading…
Reference in New Issue