Ensure child process is terminated - #272

Signed-off-by: Brendan Dixon <brendand@microsoft.com>
This commit is contained in:
Brendan Dixon
2016-06-29 11:56:52 -07:00
parent 3b1d3c9ed0
commit 101bd74eb0
2 changed files with 25 additions and 12 deletions
+11 -6
View File
@@ -96,7 +96,7 @@ class UpdateHandler(object):
self.agents = []
self.child = None
self.child_process = None
self.signal_handler = None
def run_latest(self):
@@ -114,7 +114,7 @@ class UpdateHandler(object):
agent_dir = latest_agent.get_agent_dir()
agent_name = latest_agent.name
if self.child is not None:
if self.child_process is not None:
raise Exception("Illegal attempt to launch multiple child processes")
try:
@@ -126,9 +126,13 @@ class UpdateHandler(object):
if cmds[0].lower() == "python":
cmds[0] = get_python_cmd()
child = subprocess.Popen(cmds, cwd=agent_dir, stdout=sys.stdout, stderr=sys.stderr)
self.child_process = subprocess.Popen(
cmds,
cwd=agent_dir,
stdout=sys.stdout,
stderr=sys.stderr)
ret = child.wait()
ret = self.child_process.wait()
if ret == None:
ret = 1
if ret != 0:
@@ -169,13 +173,14 @@ class UpdateHandler(object):
return
def forward_signal(self, signum, frame):
if self.child is None:
if self.child_process is None:
return
if signum is signal.SIGTERM:
self.child.send_signal(signal.SIGTERM)
self.child_process.send_signal(signal.SIGTERM)
if self.signal_handler is not None:
if not self.signal_handler in (signal.SIG_IGN, signal.SIG_DFL):
self.signal_handler(signum, frame)
return
+14 -6
View File
@@ -736,34 +736,42 @@ class TestUpdate(UpdateTestCase):
shutil.rmtree(tempdir, True)
return
def test_run_latest_marks_failures(self):
def test_run_latest_nonzero_code_marks_failures(self):
# logger.add_logger_appender(logger.AppenderType.STDOUT)
self.prepare_agents()
latest_agent = self.update_handler.get_latest_agent()
self.assertTrue(latest_agent.is_available)
self.assertEqual(None, latest_agent.error.last_failure)
self.assertEqual(0, latest_agent.error.failure_count)
# Any non-zero return code marks a failure
self._test_run_latest(return_value=1)
self.assertTrue(latest_agent.is_available)
self.assertNotEqual(None, latest_agent.error.last_failure)
self.assertEqual(1, latest_agent.error.failure_count)
return
def test_run_latest_missing_code_marks_failures(self):
# logger.add_logger_appender(logger.AppenderType.STDOUT)
self.prepare_agents()
latest_agent = self.update_handler.get_latest_agent()
self.assertTrue(latest_agent.is_available)
self.assertEqual(None, latest_agent.error.last_failure)
self.assertEqual(0, latest_agent.error.failure_count)
# Absence of a return code marks a failure
self._test_run_latest(return_value=None)
self.assertTrue(latest_agent.is_available)
self.assertNotEqual(None, latest_agent.error.last_failure)
self.assertEqual(2, latest_agent.error.failure_count)
self.assertEqual(1, latest_agent.error.failure_count)
return
def test_run_latest_exception_blacklists(self):
# logger.add_logger_appender(logger.AppenderType.STDOUT)
self.prepare_agents()
latest_agent = self.update_handler.get_latest_agent()
self.assertTrue(latest_agent.is_available)
self.assertEqual(None, latest_agent.error.last_failure)