Repository: ambari
Updated Branches:
  refs/heads/trunk 7d4fdd9be -> 21602caf6


AMBARI-10069 Lagging child processes block the Agent execution queue

Fixed Windows-specific process kill arguments. Refactored OS-specific routine 
dispatch. Updated unit tests.


Project: http://git-wip-us.apache.org/repos/asf/ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/21602caf
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/21602caf
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/21602caf

Branch: refs/heads/trunk
Commit: 21602caf64cfc88381de882b4ed566711342ab22
Parents: 7d4fdd9
Author: Florian Barca <fba...@hortonworks.com>
Authored: Wed Mar 18 09:27:26 2015 -0700
Committer: Florian Barca <fba...@hortonworks.com>
Committed: Wed Mar 18 09:27:26 2015 -0700

----------------------------------------------------------------------
 .../test/python/ambari_agent/TestStatusCheck.py | 19 +++++--
 .../src/main/python/ambari_commons/shell.py     | 53 ++++++++++----------
 .../HIVE/0.12.0.2.0/metainfo.xml                |  2 +-
 3 files changed, 43 insertions(+), 31 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/21602caf/ambari-agent/src/test/python/ambari_agent/TestStatusCheck.py
----------------------------------------------------------------------
diff --git a/ambari-agent/src/test/python/ambari_agent/TestStatusCheck.py 
b/ambari-agent/src/test/python/ambari_agent/TestStatusCheck.py
index a872e7f..32be4a8 100644
--- a/ambari-agent/src/test/python/ambari_agent/TestStatusCheck.py
+++ b/ambari-agent/src/test/python/ambari_agent/TestStatusCheck.py
@@ -21,11 +21,19 @@ import string
 import random
 import os
 from unittest import TestCase
+from ambari_commons import OSCheck
 from ambari_agent.StatusCheck import StatusCheck
-import AmbariConfig
 import logging
-from mock.mock import patch, Mock
 
+from mock.mock import patch
+from mock.mock import MagicMock
+
+from only_for_platform import only_for_platform, get_platform, PLATFORM_LINUX, 
PLATFORM_WINDOWS
+
+if get_platform() != PLATFORM_WINDOWS:
+  os_distro_value = ('Suse','11','Final')
+else:
+  os_distro_value = ('win2012serverr2','6.3','WindowsServer')
 
 USERNAME_LENGTH=10
 USERNAME_CHARS=string.ascii_uppercase +string.ascii_lowercase + string.digits 
+ '-_'
@@ -81,6 +89,7 @@ class TestStatusCheck(TestCase):
 
     
   # Ensure that status checker return True for running process
+  @patch.object(OSCheck, "os_distribution", new = MagicMock(return_value = 
os_distro_value))
   @patch.object(StatusCheck, 'getIsLive')
   def test_live(self, get_is_live_mock):
 
@@ -96,7 +105,8 @@ class TestStatusCheck(TestCase):
     
     status = statusCheck.getStatus(COMPONENT_LIVE)
     self.assertEqual(status, True)
-    
+
+  @patch.object(OSCheck, "os_distribution", new = MagicMock(return_value = 
os_distro_value))
   @patch.object(logger, 'info')
   def test_dont_relog_serToPidDict(self, logger_info_mock):
     TestStatusCheck.timesLogged = 0
@@ -119,6 +129,7 @@ class TestStatusCheck(TestCase):
 
   # Ensure that status checker return True for running process even if multiple
   # pids for a service component exist
+  @patch.object(OSCheck, "os_distribution", new = MagicMock(return_value = 
os_distro_value))
   @patch.object(StatusCheck, 'getIsLive')
   def test_live_if_multiple_pids(self, get_is_live_mock):
 
@@ -141,6 +152,7 @@ class TestStatusCheck(TestCase):
     
   # Ensure that status checker prints error message if there is no linux user
   # for service, which pid depends on user
+  @patch.object(OSCheck, "os_distribution", new = MagicMock(return_value = 
os_distro_value))
   @patch.object(StatusCheck, 'getIsLive')
   @patch.object(logger, "error")
   def test_no_user_mapping(self, error_mock, get_is_live_mock):
@@ -160,6 +172,7 @@ class TestStatusCheck(TestCase):
     self.assertTrue(error_mock.called)
 
   # Ensure that status checker return False for dead process
+  @patch.object(OSCheck, "os_distribution", new = MagicMock(return_value = 
os_distro_value))
   @patch.object(StatusCheck, 'getIsLive')
   def test_dead(self, get_is_live_mock):
     statusCheck = StatusCheck(self.serviceToPidDict, self.pidPathVars,

http://git-wip-us.apache.org/repos/asf/ambari/blob/21602caf/ambari-common/src/main/python/ambari_commons/shell.py
----------------------------------------------------------------------
diff --git a/ambari-common/src/main/python/ambari_commons/shell.py 
b/ambari-common/src/main/python/ambari_commons/shell.py
index 42b60f9..4531cf9 100644
--- a/ambari-common/src/main/python/ambari_commons/shell.py
+++ b/ambari-common/src/main/python/ambari_commons/shell.py
@@ -30,11 +30,8 @@ import traceback
 import pprint
 import platform
 
-if platform.system() != "Windows":
-  try:
-    import pwd
-  except ImportError:
-    import winpwd as pwd
+from ambari_commons import OSConst
+from ambari_commons.os_family_impl import OsFamilyImpl, OsFamilyFuncImpl
 
 logger = logging.getLogger()
 
@@ -62,11 +59,19 @@ class _dict_to_object:
 
 
 # windows specific code
-def _kill_process_with_children_windows(parent_pid):
-  shellRunner().run(["taskkill", "/T", "/PID", "{0}".format(parent_pid)])
+@OsFamilyFuncImpl(os_family=OSConst.WINSRV_FAMILY)
+def kill_process_with_children(parent_pid):
+  shellRunnerWindows().run(["taskkill", "/F", "/T", "/PID", 
"{0}".format(parent_pid)])
 
+class shellRunner(object):
+  def run(self, script, user=None):
+    pass
 
-class shellRunnerWindows:
+  def runPowershell(self, file=None, script_block=None, args=[]):
+    raise NotImplementedError()
+
+@OsFamilyImpl(os_family=OSConst.WINSRV_FAMILY)
+class shellRunnerWindows(shellRunner):
   # Run any command
   def run(self, script, user=None):
     logger.warn("user argument ignored on windows")
@@ -100,7 +105,8 @@ class shellRunnerWindows:
 
 
 #linux specific code
-def _kill_process_with_children_linux(parent_pid):
+@OsFamilyFuncImpl(os_family=OsFamilyImpl.DEFAULT)
+def kill_process_with_children(parent_pid):
   def kill_tree_function(pid, signal):
     '''
     Kills process tree starting from a given pid.
@@ -143,9 +149,12 @@ def _changeUid():
     logger.warn("can not switch user for running command.")
 
 
-class shellRunnerLinux:
+@OsFamilyImpl(os_family=OsFamilyImpl.DEFAULT)
+class shellRunnerLinux(shellRunner):
   # Run any command
   def run(self, script, user=None):
+    import pwd
+
     try:
       if user != None:
         user = pwd.getpwnam(user)[2]
@@ -154,8 +163,7 @@ class shellRunnerLinux:
       threadLocal.uid = user
     except Exception:
       logger.warn("can not switch user for RUN_COMMAND.")
-    code = 0
-    
+
     cmd = script
     
     if isinstance(script, list):
@@ -170,20 +178,11 @@ class shellRunnerLinux:
     return {'exitCode': code, 'output': out, 'error': err}
 
 
-def kill_process_with_children(parent_pid):
-  if platform.system() == "Windows":
-    _kill_process_with_children_windows(parent_pid)
-  else:
-    _kill_process_with_children_linux(parent_pid)
-
+@OsFamilyFuncImpl(os_family=OSConst.WINSRV_FAMILY)
 def changeUid():
-  if not platform.system() == "Windows":
-    try:
-      os.setuid(threadLocal.uid)
-    except Exception:
-      logger.warn("can not switch user for running command.")
+  #No Windows implementation
+  pass
 
-if platform.system() == "Windows":
-  shellRunner = shellRunnerWindows
-else:
-  shellRunner = shellRunnerLinux
\ No newline at end of file
+@OsFamilyFuncImpl(os_family=OsFamilyImpl.DEFAULT)
+def changeUid():
+  _changeUid()

http://git-wip-us.apache.org/repos/asf/ambari/blob/21602caf/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/metainfo.xml
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/metainfo.xml 
b/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/metainfo.xml
index b227710..d6d63fa 100644
--- 
a/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/metainfo.xml
+++ 
b/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/metainfo.xml
@@ -279,7 +279,7 @@
       <commandScript>
         <script>scripts/service_check.py</script>
         <scriptType>PYTHON</scriptType>
-        <timeout>300</timeout>
+        <timeout>120</timeout>
       </commandScript>
 
       <requiredServices>

Reply via email to