forked from OSchip/llvm-project
56 lines
2.3 KiB
Markdown
56 lines
2.3 KiB
Markdown
|
# 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
|
||
|
```
|