From 4b87f6f40d1f09b4275b89bf175a6a22903cf4e6 Mon Sep 17 00:00:00 2001 From: Jordan Pittier Date: Thu, 1 Oct 2015 18:43:02 +0200 Subject: [PATCH] Share manager: catch exception raised by driver's setup() If a driver raises an exception in its do_setup() or check_for_setup_error() methods the manila-share service will crash but will be automatically restarted by oslo_service.service.ProcessLauncher. So this creates a endless loop. This patch catches any exception raised by the driver setup and simply logs the exception. Change-Id: I5c4c551da9d3576ea49118ef09655d2939990cb2 Closed-Bug: #1500964 --- manila/share/manager.py | 11 +++++++++-- manila/tests/share/test_manager.py | 20 ++++++++++++++++++++ 2 files changed, 29 insertions(+), 2 deletions(-) diff --git a/manila/share/manager.py b/manila/share/manager.py index 71d100945f..7fd5f41f29 100644 --- a/manila/share/manager.py +++ b/manila/share/manager.py @@ -207,8 +207,15 @@ class ShareManager(manager.SchedulerDependentManager): """Initialization for a standalone service.""" ctxt = context.get_admin_context() - self.driver.do_setup(ctxt) - self.driver.check_for_setup_error() + try: + self.driver.do_setup(ctxt) + self.driver.check_for_setup_error() + except Exception: + LOG.exception(_LE("Failed to initialize driver %s"), + self.driver.__class__.__name__) + # we don't want to continue since we failed + # to initialize the driver correctly. + return share_instances = self.db.share_instances_get_all_by_host(ctxt, self.host) diff --git a/manila/tests/share/test_manager.py b/manila/tests/share/test_manager.py index 64fc8bc81d..c779caf076 100644 --- a/manila/tests/share/test_manager.py +++ b/manila/tests/share/test_manager.py @@ -137,6 +137,26 @@ class ShareManagerTestCase(test.TestCase): self.share_manager.driver.check_for_setup_error.\ assert_called_once_with() + def test_init_host_with_driver_do_setup_fail(self): + self.mock_object(self.share_manager.driver, 'do_setup', + mock.Mock(side_effect=Exception())) + self.mock_object(manager.LOG, 'exception') + + self.share_manager.init_host() + + manager.LOG.exception.assert_called_with( + mock.ANY, self.share_manager.driver.__class__.__name__) + + def test_init_host_with_driver_check_for_setup_error_fail(self): + self.mock_object(self.share_manager.driver, 'check_for_setup_error', + mock.Mock(side_effect=Exception())) + self.mock_object(manager.LOG, 'exception') + + self.share_manager.init_host() + + manager.LOG.exception.assert_called_with( + mock.ANY, self.share_manager.driver.__class__.__name__) + def _setup_init_mocks(self, setup_access_rules=True): instances = [ db_utils.create_share(id='fake_id_1',