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
This commit is contained in:
Ethan Lynn 2015-06-11 20:09:26 +08:00
parent 13db9ccfee
commit 4e21b371d8
2 changed files with 20 additions and 9 deletions

View File

@ -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()

View File

@ -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: