From 4e21b371d85289548c04f50f5614ede70ff1a21f Mon Sep 17 00:00:00 2001 From: Ethan Lynn Date: Thu, 11 Jun 2015 20:09:26 +0800 Subject: [PATCH] Catch exceptions in service status report If db throw any exceptions during service status report, service will not report its status forever. This patch catch errors during status report and log them in to log files. Change-Id: I6775b3446caffabd3135d5e24098ab0ee31975ac Closes-Bug: #1464188 --- heat/engine/service.py | 18 +++++++++--------- heat/tests/engine/test_service_engine.py | 11 +++++++++++ 2 files changed, 20 insertions(+), 9 deletions(-) diff --git a/heat/engine/service.py b/heat/engine/service.py index a1d9f8920e..2256d07747 100644 --- a/heat/engine/service.py +++ b/heat/engine/service.py @@ -1603,14 +1603,7 @@ class EngineService(service.Service): def service_manage_report(self): cnxt = context.get_admin_context() - if self.service_id is not None: - # Service is already running - service_objects.Service.update_by_id( - cnxt, - self.service_id, - dict(deleted_at=None)) - LOG.info(_LI('Service %s is updated'), self.service_id) - else: + if self.service_id is None: service_ref = service_objects.Service.create( cnxt, dict(host=self.host, @@ -1621,11 +1614,18 @@ class EngineService(service.Service): report_interval=cfg.CONF.periodic_interval) ) self.service_id = service_ref['id'] + LOG.info(_LI('Service %s is started'), self.service_id) + + try: service_objects.Service.update_by_id( cnxt, self.service_id, dict(deleted_at=None)) - LOG.info(_LI('Service %s is started'), self.service_id) + LOG.info(_LI('Service %s is updated'), self.service_id) + except Exception as ex: + LOG.error(_LE('Service %(service_id)s update ' + 'failed: %(error)s'), + {'service_id': self.service_id, 'error': ex}) def service_manage_cleanup(self): cnxt = context.get_admin_context() diff --git a/heat/tests/engine/test_service_engine.py b/heat/tests/engine/test_service_engine.py index 5f6225963b..f52c0b68b0 100644 --- a/heat/tests/engine/test_service_engine.py +++ b/heat/tests/engine/test_service_engine.py @@ -116,6 +116,17 @@ class ServiceEngineTest(common.HeatTestCase): 'mock_id', dict(deleted_at=None)) + @mock.patch.object(service_objects.Service, 'update_by_id') + @mock.patch.object(context, 'get_admin_context') + def test_service_manage_report_update_fail(self, mock_admin_context, + mock_service_update): + self.eng.service_id = 'mock_id' + mock_admin_context.return_value = self.ctx + mock_service_update.side_effect = Exception() + self.eng.service_manage_report() + msg = 'Service %s update failed' % self.eng.service_id + self.assertIn(msg, self.LOG.output) + def test_stop_rpc_server(self): with mock.patch.object(self.eng, '_rpc_server') as mock_rpc_server: