[Lldb-commits] [lldb] 8a82000 - [lldbsuite] Remove pre_kill_hook package
Jonas Devlieghere via lldb-commits
lldb-commits at lists.llvm.org
Tue Oct 29 16:57:08 PDT 2019
Author: Jonas Devlieghere
Date: 2019-10-29T16:56:59-07:00
New Revision: 8a82000e486afe472519d288f2206399ada95aca
URL: https://github.com/llvm/llvm-project/commit/8a82000e486afe472519d288f2206399ada95aca
DIFF: https://github.com/llvm/llvm-project/commit/8a82000e486afe472519d288f2206399ada95aca.diff
LOG: [lldbsuite] Remove pre_kill_hook package
This package was only used by dosep.py which has since been removed.
Added:
Modified:
Removed:
lldb/packages/Python/lldbsuite/pre_kill_hook/README.md
lldb/packages/Python/lldbsuite/pre_kill_hook/__init__.py
lldb/packages/Python/lldbsuite/pre_kill_hook/darwin.py
lldb/packages/Python/lldbsuite/pre_kill_hook/linux.py
lldb/packages/Python/lldbsuite/pre_kill_hook/tests/__init__.py
lldb/packages/Python/lldbsuite/pre_kill_hook/tests/test_darwin.py
lldb/packages/Python/lldbsuite/pre_kill_hook/tests/test_linux.py
################################################################################
diff --git a/lldb/packages/Python/lldbsuite/pre_kill_hook/README.md b/lldb/packages/Python/lldbsuite/pre_kill_hook/README.md
deleted file mode 100644
index 921eedb4a869..000000000000
--- a/lldb/packages/Python/lldbsuite/pre_kill_hook/README.md
+++ /dev/null
@@ -1,55 +0,0 @@
-# pre\_kill\_hook package
-
-## Overview
-
-The pre\_kill\_hook package provides a per-platform method for running code
-after a test process times out but before the concurrent test runner kills the
-timed-out process.
-
-## Detailed Description of Usage
-
-If a platform defines the hook, then the hook gets called right after a timeout
-is detected in a test run, but before the process is killed.
-
-The pre-kill-hook mechanism works as follows:
-
-* When a timeout is detected in the process_control.ProcessDriver class that
- runs the per-test lldb process, a new overridable on\_timeout\_pre\_kill() method
- is called on the ProcessDriver instance.
-
-* The concurrent test driver's derived ProcessDriver overrides this method. It
- looks to see if a module called
- "lldbsuite.pre\_kill\_hook.{platform-system-name}" module exists, where
- platform-system-name is replaced with platform.system().lower(). (e.g.
- "Darwin" becomes the darwin.py module).
-
- * If that module doesn't exist, the rest of the new behavior is skipped.
-
- * If that module does exist, it is loaded, and the method
- "do\_pre\_kill(process\_id, context\_dict, output\_stream)" is called. If
- that method throws an exception, we log it and we ignore further processing
- of the pre-killed process.
-
- * The process\_id argument of the do\_pre\_kill function is the process id as
- returned by the ProcessDriver.pid property.
-
- * The output\_stream argument of the do\_pre\_kill function takes a file-like
- object. Output to be collected from doing any processing on the
- process-to-be-killed should be written into the file-like object. The
- current impl uses a six.StringIO and then writes this output to
- {TestFilename}-{pid}.sample in the session directory.
-
-* Platforms where platform.system() is "Darwin" will get a pre-kill action that
- runs the 'sample' program on the lldb that has timed out. That data will be
- collected on CI and analyzed to determine what is happening during timeouts.
- (This has an advantage over a core in that it is much smaller and that it
- clearly demonstrates any liveness of the process, if there is any).
-
-## Running the tests
-
-To run the tests in the pre\_kill\_hook package, open a console, change into
-this directory and run the following:
-
-```
-python -m unittest discover
-```
diff --git a/lldb/packages/Python/lldbsuite/pre_kill_hook/__init__.py b/lldb/packages/Python/lldbsuite/pre_kill_hook/__init__.py
deleted file mode 100644
index c3a852ea1bfe..000000000000
--- a/lldb/packages/Python/lldbsuite/pre_kill_hook/__init__.py
+++ /dev/null
@@ -1 +0,0 @@
-"""Initialize the package."""
diff --git a/lldb/packages/Python/lldbsuite/pre_kill_hook/darwin.py b/lldb/packages/Python/lldbsuite/pre_kill_hook/darwin.py
deleted file mode 100644
index 2bee65a01e3f..000000000000
--- a/lldb/packages/Python/lldbsuite/pre_kill_hook/darwin.py
+++ /dev/null
@@ -1,46 +0,0 @@
-"""Provides a pre-kill method to run on macOS."""
-from __future__ import print_function
-
-# system imports
-import subprocess
-import sys
-
-# third-party module imports
-import six
-
-
-def do_pre_kill(process_id, runner_context, output_stream, sample_time=3):
- """Samples the given process id, and puts the output to output_stream.
-
- @param process_id the local process to sample.
-
- @param runner_context a dictionary of details about the architectures
- and platform on which the given process is running. Expected keys are
- archs (array of architectures), platform_name, platform_url, and
- platform_working_dir.
-
- @param output_stream file-like object that should be used to write the
- results of sampling.
-
- @param sample_time specifies the time in seconds that should be captured.
- """
-
- # Validate args.
- if runner_context is None:
- raise Exception("runner_context argument is required")
- if not isinstance(runner_context, dict):
- raise Exception("runner_context argument must be a dictionary")
-
- # We will try to run sample on the local host only if there is no URL
- # to a remote.
- if "platform_url" in runner_context and (
- runner_context["platform_url"] is not None):
- import pprint
- sys.stderr.write(
- "warning: skipping timeout pre-kill sample invocation because we "
- "don't know how to run on a remote yet. runner_context={}\n"
- .format(pprint.pformat(runner_context)))
-
- output = subprocess.check_output(['sample', six.text_type(process_id),
- str(sample_time)])
- output_stream.write(output)
diff --git a/lldb/packages/Python/lldbsuite/pre_kill_hook/linux.py b/lldb/packages/Python/lldbsuite/pre_kill_hook/linux.py
deleted file mode 100644
index d4cd9be27c82..000000000000
--- a/lldb/packages/Python/lldbsuite/pre_kill_hook/linux.py
+++ /dev/null
@@ -1,76 +0,0 @@
-"""Provides a pre-kill method to run on Linux.
-
-This timeout pre-kill method relies on the Linux perf-tools
-distribution. The appropriate way to obtain this set of tools
-will depend on the Linux distribution.
-
-For Ubuntu 16.04, the invoke the following command:
-sudo apt-get install perf-tools-unstable
-"""
-from __future__ import print_function
-
-# system imports
-import os
-import subprocess
-import sys
-import tempfile
-
-
-def do_pre_kill(process_id, runner_context, output_stream, sample_time=3):
- """Samples the given process id, and puts the output to output_stream.
-
- @param process_id the local process to sample.
-
- @param runner_context a dictionary of details about the architectures
- and platform on which the given process is running. Expected keys are
- archs (array of architectures), platform_name, platform_url, and
- platform_working_dir.
-
- @param output_stream file-like object that should be used to write the
- results of sampling.
-
- @param sample_time specifies the time in seconds that should be captured.
- """
-
- # Validate args.
- if runner_context is None:
- raise Exception("runner_context argument is required")
- if not isinstance(runner_context, dict):
- raise Exception("runner_context argument must be a dictionary")
-
- # We will try to run sample on the local host only if there is no URL
- # to a remote.
- if "platform_url" in runner_context and (
- runner_context["platform_url"] is not None):
- import pprint
- sys.stderr.write(
- "warning: skipping timeout pre-kill sample invocation because we "
- "don't know how to run on a remote yet. runner_context={}\n"
- .format(pprint.pformat(runner_context)))
-
- # We're going to create a temp file, and immediately overwrite it with the
- # following command. This just ensures we don't have any races in
- # creation of the temporary sample file.
- fileno, filename = tempfile.mkstemp(suffix='perfdata')
- os.close(fileno)
- fileno = None
-
- try:
- with open(os.devnull, 'w') as devnull:
- returncode = subprocess.call(['timeout', str(sample_time), 'perf',
- 'record', '-g', '-o', filename, '-p', str(process_id)],
- stdout=devnull, stderr=devnull)
- if returncode == 0 or returncode == 124:
- # This is okay - this is the timeout return code, which is totally
- # expected.
- pass
- else:
- raise Exception("failed to call 'perf record .., error: {}".format(
- returncode))
-
- with open(os.devnull, 'w') as devnull:
- output = subprocess.check_output(['perf', 'report', '--call-graph',
- '--stdio', '-i', filename], stderr=devnull)
- output_stream.write(output)
- finally:
- os.remove(filename)
diff --git a/lldb/packages/Python/lldbsuite/pre_kill_hook/tests/__init__.py b/lldb/packages/Python/lldbsuite/pre_kill_hook/tests/__init__.py
deleted file mode 100644
index e69de29bb2d1..000000000000
diff --git a/lldb/packages/Python/lldbsuite/pre_kill_hook/tests/test_darwin.py b/lldb/packages/Python/lldbsuite/pre_kill_hook/tests/test_darwin.py
deleted file mode 100644
index 810b364b07c3..000000000000
--- a/lldb/packages/Python/lldbsuite/pre_kill_hook/tests/test_darwin.py
+++ /dev/null
@@ -1,107 +0,0 @@
-"""Test the pre-kill hook on Darwin."""
-from __future__ import print_function
-
-# system imports
-from multiprocessing import Process, Queue
-import platform
-import re
-from unittest import main, TestCase
-
-# third party
-from six import StringIO
-
-
-def do_child_process(child_work_queue, parent_work_queue, verbose):
- import os
-
- pid = os.getpid()
- if verbose:
- print("child: pid {} started, sending to parent".format(pid))
- parent_work_queue.put(pid)
- if verbose:
- print("child: waiting for shut-down request from parent")
- child_work_queue.get()
- if verbose:
- print("child: received shut-down request. Child exiting.")
-
-
-class DarwinPreKillTestCase(TestCase):
-
- def __init__(self, methodName):
- super(DarwinPreKillTestCase, self).__init__(methodName)
- self.process = None
- self.child_work_queue = None
- self.verbose = False
-
- def tearDown(self):
- if self.verbose:
- print("parent: sending shut-down request to child")
- if self.process:
- self.child_work_queue.put("hello, child")
- self.process.join()
- if self.verbose:
- print("parent: child is fully shut down")
-
- def test_sample(self):
- # Ensure we're Darwin.
- if platform.system() != 'Darwin':
- self.skipTest("requires a Darwin-based OS")
-
- # Start the child process.
- self.child_work_queue = Queue()
- parent_work_queue = Queue()
- self.process = Process(target=do_child_process,
- args=(self.child_work_queue, parent_work_queue,
- self.verbose))
- if self.verbose:
- print("parent: starting child")
- self.process.start()
-
- # Wait for the child to report its pid. Then we know we're running.
- if self.verbose:
- print("parent: waiting for child to start")
- child_pid = parent_work_queue.get()
-
- # Sample the child process.
- from darwin import do_pre_kill
- context_dict = {
- "archs": [platform.machine()],
- "platform_name": None,
- "platform_url": None,
- "platform_working_dir": None
- }
-
- if self.verbose:
- print("parent: running pre-kill action on child")
- output_io = StringIO()
- do_pre_kill(child_pid, context_dict, output_io)
- output = output_io.getvalue()
-
- if self.verbose:
- print("parent: do_pre_kill() wrote the following output:", output)
- self.assertIsNotNone(output)
-
- # We should have a line with:
- # Process: .* [{pid}]
- process_re = re.compile(r"Process:[^[]+\[([^]]+)\]")
- match = process_re.search(output)
- self.assertIsNotNone(match, "should have found process id for "
- "sampled process")
- self.assertEqual(1, len(match.groups()))
- self.assertEqual(child_pid, int(match.group(1)))
-
- # We should see a Call graph: section.
- callgraph_re = re.compile(r"Call graph:")
- match = callgraph_re.search(output)
- self.assertIsNotNone(match, "should have found the Call graph section"
- "in sample output")
-
- # We should see a Binary Images: section.
- binary_images_re = re.compile(r"Binary Images:")
- match = binary_images_re.search(output)
- self.assertIsNotNone(match, "should have found the Binary Images "
- "section in sample output")
-
-
-if __name__ == "__main__":
- main()
diff --git a/lldb/packages/Python/lldbsuite/pre_kill_hook/tests/test_linux.py b/lldb/packages/Python/lldbsuite/pre_kill_hook/tests/test_linux.py
deleted file mode 100644
index ab989df0d203..000000000000
--- a/lldb/packages/Python/lldbsuite/pre_kill_hook/tests/test_linux.py
+++ /dev/null
@@ -1,133 +0,0 @@
-"""Test the pre-kill hook on Linux."""
-from __future__ import print_function
-
-# system imports
-from multiprocessing import Process, Queue
-import platform
-import re
-import subprocess
-from unittest import main, TestCase
-
-# third party
-from six import StringIO
-
-
-def do_child_thread():
- import os
- x = 0
- while True:
- x = x + 42 * os.getpid()
- return x
-
-
-def do_child_process(child_work_queue, parent_work_queue, verbose):
- import os
-
- pid = os.getpid()
- if verbose:
- print("child: pid {} started, sending to parent".format(pid))
- parent_work_queue.put(pid)
-
- # Spin up a daemon thread to do some "work", which will show
- # up in a sample of this process.
- import threading
- worker = threading.Thread(target=do_child_thread)
- worker.daemon = True
- worker.start()
-
- if verbose:
- print("child: waiting for shut-down request from parent")
- child_work_queue.get()
- if verbose:
- print("child: received shut-down request. Child exiting.")
-
-
-class LinuxPreKillTestCase(TestCase):
-
- def __init__(self, methodName):
- super(LinuxPreKillTestCase, self).__init__(methodName)
- self.process = None
- self.child_work_queue = None
- self.verbose = False
- # self.verbose = True
-
- def tearDown(self):
- if self.verbose:
- print("parent: sending shut-down request to child")
- if self.process:
- self.child_work_queue.put("hello, child")
- self.process.join()
- if self.verbose:
- print("parent: child is fully shut down")
-
- def test_sample(self):
- # Ensure we're Darwin.
- if platform.system() != 'Linux':
- self.skipTest("requires a Linux-based OS")
-
- # Ensure we have the 'perf' tool. If not, skip the test.
- try:
- perf_version = subprocess.check_output(["perf", "version"])
- if perf_version is None or not (
- perf_version.startswith("perf version")):
- raise Exception("The perf executable doesn't appear"
- " to be the Linux perf tools perf")
- except Exception:
- self.skipTest("requires the Linux perf tools 'perf' command")
-
- # Start the child process.
- self.child_work_queue = Queue()
- parent_work_queue = Queue()
- self.process = Process(target=do_child_process,
- args=(self.child_work_queue, parent_work_queue,
- self.verbose))
- if self.verbose:
- print("parent: starting child")
- self.process.start()
-
- # Wait for the child to report its pid. Then we know we're running.
- if self.verbose:
- print("parent: waiting for child to start")
- child_pid = parent_work_queue.get()
-
- # Sample the child process.
- from linux import do_pre_kill
- context_dict = {
- "archs": [platform.machine()],
- "platform_name": None,
- "platform_url": None,
- "platform_working_dir": None
- }
-
- if self.verbose:
- print("parent: running pre-kill action on child")
- output_io = StringIO()
- do_pre_kill(child_pid, context_dict, output_io)
- output = output_io.getvalue()
-
- if self.verbose:
- print("parent: do_pre_kill() wrote the following output:", output)
- self.assertIsNotNone(output)
-
- # We should have a samples count entry.
- # Samples:
- self.assertTrue("Samples:" in output, "should have found a 'Samples:' "
- "field in the sampled process output")
-
- # We should see an event count entry
- event_count_re = re.compile(r"Event count[^:]+:\s+(\d+)")
- match = event_count_re.search(output)
- self.assertIsNotNone(match, "should have found the event count entry "
- "in sample output")
- if self.verbose:
- print("cpu-clock events:", match.group(1))
-
- # We should see some percentages in the file.
- percentage_re = re.compile(r"\d+\.\d+%")
- match = percentage_re.search(output)
- self.assertIsNotNone(match, "should have found at least one percentage "
- "in the sample output")
-
-
-if __name__ == "__main__":
- main()
More information about the lldb-commits
mailing list