From c313be6e181bd4916e3728d9889d865f011b51c7 Mon Sep 17 00:00:00 2001 From: Gregory Haynes Date: Tue, 26 Jan 2016 20:14:20 +0000 Subject: [PATCH] Guard against double shutdown in client If we have already performed a shutdown we can prevent exploding when writing to self.wake_write if we short circuit. Change-Id: If5352a373d5fa61dd1ee661f4a37976b3447dd9d --- gear/__init__.py | 14 +++++++++----- gear/tests/test_gear.py | 5 +++++ 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/gear/__init__.py b/gear/__init__.py index a4b8e23..7fccc34 100644 --- a/gear/__init__.py +++ b/gear/__init__.py @@ -1105,11 +1105,15 @@ class BaseClientServer(object): The object may no longer be used after shutdown is called. """ - self.log.debug("Beginning shutdown") - self._shutdown() - self.log.debug("Beginning cleanup") - self._cleanup() - self.log.debug("Finished shutdown") + if self.running: + self.log.debug("Beginning shutdown") + self._shutdown() + self.log.debug("Beginning cleanup") + self._cleanup() + self.log.debug("Finished shutdown") + else: + self.log.warning("Shutdown called when not currently running. " + "Ignoring.") def _shutdown(self): # The first part of the shutdown process where all threads diff --git a/gear/tests/test_gear.py b/gear/tests/test_gear.py index d90d99e..6398b9e 100644 --- a/gear/tests/test_gear.py +++ b/gear/tests/test_gear.py @@ -287,6 +287,11 @@ class TestClient(tests.BaseTestCase): acl.revokeGrant('manager') self.assertFalse(acl.canGrant('manager')) + def test_double_shutdown(self): + client = gear.Client() + client.shutdown() + client.shutdown() + def load_tests(loader, in_tests, pattern): return testscenarios.load_tests_apply_scenarios(loader, in_tests, pattern)