Davide Polato created TIKA-5040:
-----------------------------------
Summary: Orphaned external processes after a forked server is
killed or ProcessUtils stops waiting
Key: TIKA-5040
URL: https://issues.apache.org/jira/browse/TIKA-5040
Project: Tika
Issue Type: Bug
Affects Versions: 4.2.0
Reporter: Davide Polato
Fix For: 4.3.0
In looking at how to stop a running parse (TIKA-4795), I found that killing a
forked pipes server leaves its external processes running.
PerClientServerManager and SharedServerManager kill the server with
destroyForcibly, which is SIGKILL on Linux. ProcessUtils kills the processes it
started in execute()'s finally block or in a shutdown hook. SIGKILL ends the
JVM before either runs.
When the server exits on its own, the hook runs, but it kills only the direct
process. With {{sh -c 'sleep 300; true'}}, the sleep keeps running. The timeout
and interrupt paths of ProcessUtils.execute have the same gap.
TIKA-3103 shows what this costs: orphaned tesseract processes at 100% CPU for
over ten minutes.
I have tests that reproduce each case on main. I'll open a PR that also kills
the descendants, via ProcessHandle.descendants(), in both server managers and
wherever ProcessUtils kills a process.
TesseractOCRParser uses a separate hook in AbstractExternalProcessParser. I'd
leave that for a follow-up, unless you'd rather have it in this PR?
--
This message was sent by Atlassian Jira
(v10.3.26#10030026)