[llvm] r366912 - [AIX][lit] Don't depend on psutil on AIX

David Tenty via llvm-commits llvm-commits at lists.llvm.org
Wed Jul 24 08:04:27 PDT 2019


Author: daltenty
Date: Wed Jul 24 08:04:27 2019
New Revision: 366912

URL: http://llvm.org/viewvc/llvm-project?rev=366912&view=rev
Log:
[AIX][lit] Don't depend on psutil on AIX

Summary:
On AIX psutil can run into problems with permissions to read the process
tree, which causes problems for python timeout tests which need to kill off
a test and it's children.

This patch adds a workaround by invoking shell via subprocess and using a
platform specific option to ps to list all the descendant processes so we can
kill them. We add some checks so lit can tell whether timeout tests are
supported with out exposing whether we are utilizing the psutil
implementation or the alternative.

Reviewers: hubert.reinterpretcast, andusy, davide, delcypher

Reviewed By: delcypher

Subscribers: davide, delcypher, christof, lldb-commits, libcxx-commits, llvm-commits

Tags: #lldb, #libc, #llvm

Differential Revision: https://reviews.llvm.org/D64251

Modified:
    llvm/trunk/utils/lit/lit/LitConfig.py
    llvm/trunk/utils/lit/lit/util.py
    llvm/trunk/utils/lit/tests/googletest-timeout.py
    llvm/trunk/utils/lit/tests/lit.cfg
    llvm/trunk/utils/lit/tests/shtest-timeout.py

Modified: llvm/trunk/utils/lit/lit/LitConfig.py
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/lit/lit/LitConfig.py?rev=366912&r1=366911&r2=366912&view=diff
==============================================================================
--- llvm/trunk/utils/lit/lit/LitConfig.py (original)
+++ llvm/trunk/utils/lit/lit/LitConfig.py Wed Jul 24 08:04:27 2019
@@ -1,6 +1,7 @@
 from __future__ import absolute_import
 import inspect
 import os
+import platform
 import sys
 
 import lit.Test
@@ -76,6 +77,19 @@ class LitConfig(object):
         """
         return self._maxIndividualTestTime
 
+    @property
+    def maxIndividualTestTimeIsSupported(self):
+        """
+            Returns a tuple (<supported> , <error message>)
+            where
+            `<supported>` is True if setting maxIndividualTestTime is supported
+                on the current host, returns False otherwise.
+            `<error message>` is an empty string if `<supported>` is True,
+                otherwise is contains a string describing why setting
+                maxIndividualTestTime is not supported.
+        """
+        return lit.util.killProcessAndChildrenIsSupported()
+
     @maxIndividualTestTime.setter
     def maxIndividualTestTime(self, value):
         """
@@ -86,16 +100,13 @@ class LitConfig(object):
             self.fatal('maxIndividualTestTime must set to a value of type int.')
         self._maxIndividualTestTime = value
         if self.maxIndividualTestTime > 0:
-            # The current implementation needs psutil to set
+            # The current implementation needs psutil on some platforms to set
             # a timeout per test. Check it's available.
             # See lit.util.killProcessAndChildren()
-            try:
-                import psutil  # noqa: F401
-            except ImportError:
-                self.fatal("Setting a timeout per test requires the"
-                           " Python psutil module but it could not be"
-                           " found. Try installing it via pip or via"
-                           " your operating system's package manager.")
+            supported, errormsg = self.maxIndividualTestTimeIsSupported
+            if not supported:
+                self.fatal('Setting a timeout per test not supported. ' +
+                           errormsg)
         elif self.maxIndividualTestTime < 0:
             self.fatal('The timeout per test must be >= 0 seconds')
 

Modified: llvm/trunk/utils/lit/lit/util.py
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/lit/lit/util.py?rev=366912&r1=366911&r2=366912&view=diff
==============================================================================
--- llvm/trunk/utils/lit/lit/util.py (original)
+++ llvm/trunk/utils/lit/lit/util.py Wed Jul 24 08:04:27 2019
@@ -423,34 +423,56 @@ def findPlatformSdkVersionOnMacOS(config
             return out.decode()
     return None
 
+def killProcessAndChildrenIsSupported():
+    """
+        Returns a tuple (<supported> , <error message>)
+        where
+        `<supported>` is True if `killProcessAndChildren()` is supported on
+            the current host, returns False otherwise.
+        `<error message>` is an empty string if `<supported>` is True,
+            otherwise is contains a string describing why the function is
+            not supported.
+    """
+    if platform.system() == 'AIX':
+        return (True, "")
+    try:
+        import psutil  # noqa: F401
+        return (True, "")
+    except ImportError:
+        return (False,  "Requires the Python psutil module but it could"
+                        " not be found. Try installing it via pip or via"
+                        " your operating system's package manager.")
 
 def killProcessAndChildren(pid):
     """This function kills a process with ``pid`` and all its running children
-    (recursively). It is currently implemented using the psutil module which
-    provides a simple platform neutral implementation.
+    (recursively). It is currently implemented using the psutil module on some
+    platforms which provides a simple platform neutral implementation.
 
-    TODO: Reimplement this without using psutil so we can       remove
-    our dependency on it.
+    TODO: Reimplement this without using psutil on all platforms so we can
+    remove our dependency on it.
 
     """
-    import psutil
-    try:
-        psutilProc = psutil.Process(pid)
-        # Handle the different psutil API versions
+    if platform.system() == 'AIX':
+        subprocess.call('kill -kill $(ps -o pid= -L{})'.format(pid), shell=True)
+    else:
+        import psutil
         try:
-            # psutil >= 2.x
-            children_iterator = psutilProc.children(recursive=True)
-        except AttributeError:
-            # psutil 1.x
-            children_iterator = psutilProc.get_children(recursive=True)
-        for child in children_iterator:
+            psutilProc = psutil.Process(pid)
+            # Handle the different psutil API versions
             try:
-                child.kill()
-            except psutil.NoSuchProcess:
-                pass
-        psutilProc.kill()
-    except psutil.NoSuchProcess:
-        pass
+                # psutil >= 2.x
+                children_iterator = psutilProc.children(recursive=True)
+            except AttributeError:
+                # psutil 1.x
+                children_iterator = psutilProc.get_children(recursive=True)
+            for child in children_iterator:
+                try:
+                    child.kill()
+                except psutil.NoSuchProcess:
+                    pass
+            psutilProc.kill()
+        except psutil.NoSuchProcess:
+            pass
 
 
 try:

Modified: llvm/trunk/utils/lit/tests/googletest-timeout.py
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/lit/tests/googletest-timeout.py?rev=366912&r1=366911&r2=366912&view=diff
==============================================================================
--- llvm/trunk/utils/lit/tests/googletest-timeout.py (original)
+++ llvm/trunk/utils/lit/tests/googletest-timeout.py Wed Jul 24 08:04:27 2019
@@ -1,4 +1,4 @@
-# REQUIRES: python-psutil
+# REQUIRES: lit-max-individual-test-time
 
 # Check that the per test timeout is enforced when running GTest tests.
 #

Modified: llvm/trunk/utils/lit/tests/lit.cfg
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/lit/tests/lit.cfg?rev=366912&r1=366911&r2=366912&view=diff
==============================================================================
--- llvm/trunk/utils/lit/tests/lit.cfg (original)
+++ llvm/trunk/utils/lit/tests/lit.cfg Wed Jul 24 08:04:27 2019
@@ -1,6 +1,7 @@
 # -*- Python -*-
 
 import os
+import platform
 import sys
 
 import lit.formats
@@ -56,10 +57,10 @@ if lit_config.params.get('check-coverage
         os.path.dirname(__file__), ".coveragerc")
 
 # Add a feature to detect if psutil is available
-try:
-    import psutil
-    lit_config.note('Found python psutil module')
-    config.available_features.add("python-psutil")
-except ImportError:
-    lit_config.warning('Could not import psutil. Some tests will be skipped and'
-                       ' the --timeout command line argument will not work.')
+supported, errormsg = lit_config.maxIndividualTestTimeIsSupported
+if supported:
+    config.available_features.add("lit-max-individual-test-time")
+else:
+    lit_config.warning('Setting a timeout per test not supported. ' + errormsg
+                       + ' Some tests will be skipped and the --timeout'
+                         ' command line argument will not work.')

Modified: llvm/trunk/utils/lit/tests/shtest-timeout.py
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/lit/tests/shtest-timeout.py?rev=366912&r1=366911&r2=366912&view=diff
==============================================================================
--- llvm/trunk/utils/lit/tests/shtest-timeout.py (original)
+++ llvm/trunk/utils/lit/tests/shtest-timeout.py Wed Jul 24 08:04:27 2019
@@ -1,4 +1,4 @@
-# REQUIRES: python-psutil
+# REQUIRES: lit-max-individual-test-time
 
 # llvm.org/PR33944
 # UNSUPPORTED: system-windows




More information about the llvm-commits mailing list