You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by st...@apache.org on 2017/01/18 08:42:44 UTC
[3/5] ambari git commit: AMBARI-18922 Agent Auto Restart Doesn't
Release Ping Port (dsen)
AMBARI-18922 Agent Auto Restart Doesn't Release Ping Port (dsen)
Project: http://git-wip-us.apache.org/repos/asf/ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/d46461a3
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/d46461a3
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/d46461a3
Branch: refs/heads/branch-2.5
Commit: d46461a308762f29c789d044873b685643fc63bc
Parents: f8ccb47
Author: Dmytro Sen <ds...@apache.org>
Authored: Mon Nov 21 12:01:31 2016 +0200
Committer: Toader, Sebastian <st...@hortonworks.com>
Committed: Wed Jan 18 09:41:55 2017 +0100
----------------------------------------------------------------------
.../src/main/python/ambari_agent/AmbariAgent.py | 19 +++++++++++++------
.../ambari_agent/StatusCommandsExecutor.py | 4 +++-
.../test/python/ambari_agent/TestAmbariAgent.py | 7 ++++++-
3 files changed, 22 insertions(+), 8 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ambari/blob/d46461a3/ambari-agent/src/main/python/ambari_agent/AmbariAgent.py
----------------------------------------------------------------------
diff --git a/ambari-agent/src/main/python/ambari_agent/AmbariAgent.py b/ambari-agent/src/main/python/ambari_agent/AmbariAgent.py
index d701e49..28b9528 100644
--- a/ambari-agent/src/main/python/ambari_agent/AmbariAgent.py
+++ b/ambari-agent/src/main/python/ambari_agent/AmbariAgent.py
@@ -21,6 +21,7 @@ limitations under the License.
import os
import sys
import subprocess
+import signal
from Controller import AGENT_AUTO_RESTART_EXIT_CODE
if os.environ.has_key("PYTHON_BIN"):
@@ -48,12 +49,18 @@ def main():
mergedArgs = [PYTHON, AGENT_SCRIPT] + args
- while status == AGENT_AUTO_RESTART_EXIT_CODE:
- mainProcess = subprocess.Popen(mergedArgs)
- mainProcess.communicate()
- status = mainProcess.returncode
- if os.path.isfile(AGENT_PID_FILE) and status == AGENT_AUTO_RESTART_EXIT_CODE:
- os.remove(AGENT_PID_FILE)
+ # Become a parent for all subprocesses
+ os.setpgrp()
+
+ try:
+ while status == AGENT_AUTO_RESTART_EXIT_CODE:
+ mainProcess = subprocess.Popen(mergedArgs)
+ mainProcess.communicate()
+ status = mainProcess.returncode
+ if os.path.isfile(AGENT_PID_FILE) and status == AGENT_AUTO_RESTART_EXIT_CODE:
+ os.remove(AGENT_PID_FILE)
+ finally:
+ os.killpg(0, signal.SIGKILL)
if __name__ == "__main__":
main()
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/ambari/blob/d46461a3/ambari-agent/src/main/python/ambari_agent/StatusCommandsExecutor.py
----------------------------------------------------------------------
diff --git a/ambari-agent/src/main/python/ambari_agent/StatusCommandsExecutor.py b/ambari-agent/src/main/python/ambari_agent/StatusCommandsExecutor.py
index 5d3607a..fbb29f4 100644
--- a/ambari-agent/src/main/python/ambari_agent/StatusCommandsExecutor.py
+++ b/ambari-agent/src/main/python/ambari_agent/StatusCommandsExecutor.py
@@ -24,6 +24,7 @@ import logging
import multiprocessing
from ambari_agent.PythonReflectiveExecutor import PythonReflectiveExecutor
from ambari_agent.RemoteDebugUtils import bind_debug_signal_handlers
+from ambari_agent.ExitHelper import ExitHelper
logger = logging.getLogger(__name__)
@@ -41,6 +42,7 @@ class StatusCommandsExecutor(multiprocessing.Process):
self.status_command_timeout = int(self.config.get('agent', 'status_command_timeout', 5)) # in seconds
self.hasTimeoutedEvent = multiprocessing.Event()
+ ExitHelper().register(self.kill)
def run(self):
try:
@@ -88,4 +90,4 @@ class StatusCommandsExecutor(multiprocessing.Process):
# prevent queue from ending up with non-freed semaphores, locks during put. Which would result in dead-lock in process executing get.
self.actionQueue.statusCommandResultQueue.close()
self.actionQueue.statusCommandResultQueue.join_thread()
- self.actionQueue.statusCommandResultQueue = multiprocessing.Queue()
\ No newline at end of file
+ self.actionQueue.statusCommandResultQueue = multiprocessing.Queue()
http://git-wip-us.apache.org/repos/asf/ambari/blob/d46461a3/ambari-agent/src/test/python/ambari_agent/TestAmbariAgent.py
----------------------------------------------------------------------
diff --git a/ambari-agent/src/test/python/ambari_agent/TestAmbariAgent.py b/ambari-agent/src/test/python/ambari_agent/TestAmbariAgent.py
index 1be487c..8ff192a 100644
--- a/ambari-agent/src/test/python/ambari_agent/TestAmbariAgent.py
+++ b/ambari-agent/src/test/python/ambari_agent/TestAmbariAgent.py
@@ -34,7 +34,10 @@ class TestAmbariAgent(unittest.TestCase):
@patch.object(subprocess, "Popen")
@patch("os.path.isfile")
@patch("os.remove")
- def test_main(self, os_remove_mock, os_path_isfile_mock, subprocess_popen_mock):
+ @patch("os.killpg")
+ @patch("os.setpgrp")
+ def test_main(self, os_setpgrp_mock, os_killpg_mock, os_remove_mock,
+ os_path_isfile_mock, subprocess_popen_mock):
facter1 = MagicMock()
facter2 = MagicMock()
subprocess_popen_mock.side_effect = [facter1, facter2]
@@ -46,6 +49,7 @@ class TestAmbariAgent(unittest.TestCase):
sys.argv[0] = "test data"
AmbariAgent.main()
+ self.assertTrue(os_setpgrp_mock.called)
self.assertTrue(subprocess_popen_mock.called)
self.assertTrue(subprocess_popen_mock.call_count == 2)
self.assertTrue(facter1.communicate.called)
@@ -53,6 +57,7 @@ class TestAmbariAgent(unittest.TestCase):
self.assertTrue(os_path_isfile_mock.called)
self.assertTrue(os_path_isfile_mock.call_count == 2)
self.assertTrue(os_remove_mock.called)
+ self.assertTrue(os_killpg_mock.called)
#
# Test AmbariConfig.getLogFile() for ambari-agent