Joe Witt created NIFI-16312:
-------------------------------

             Summary: ExecuteProcess and ExecuteStreamCommand swallow 
interrupts and can report success
                 Key: NIFI-16312
                 URL: https://issues.apache.org/jira/browse/NIFI-16312
             Project: Apache NiFi
          Issue Type: Bug
            Reporter: Joe Witt
            Assignee: Joe Witt


ExecuteProcess and ExecuteStreamCommand wait for a child process on the 
processor thread. Both catch InterruptedException and do not restore the 
interrupt status. After that, they can continue as if the command completed 
normally.

ExecuteProcess (unbounded wait and batch sleep):

    try {
        longRunningProcess.get();
    } catch (final InterruptedException ignored) {
    }

    try {
        TimeUnit.NANOSECONDS.sleep(batchNanos);
    } catch (final InterruptedException ignored) {
    }

If the wait is interrupted, the catch is empty. The processor then proceeds: if 
stdout was written, the FlowFile is transferred to success. The interrupt flag 
is cleared, so the framework cannot see that the worker was cancelled.

ExecuteStreamCommand (both waitFor paths):

    int exitCode;   // defaults to 0

    try {
        exitCode = process.waitFor();
    } catch (InterruptedException e) {
        logger.warn("Command Execution Process was interrupted", e);
    }

exitCode is an instance field that defaults to 0. If waitFor() is interrupted, 
it is never assigned, so the command is treated as exit 0. Routing then uses 
that status (output vs nonzero-status / execution.status attribute).

This ticket is interrupt handling only:
- Call Thread.currentThread().interrupt() in every InterruptedException catch 
in these two processors.
- Do not treat an interrupted wait as a successful exit (ExecuteStreamCommand 
must not keep exitCode 0; ExecuteProcess must not route partial output to 
success as if the process finished).
- Surefire tests using local commands (no Docker, no cloud).

Out of scope: a Command Timeout / destroyForcibly property. ExecuteProcess 
already has an in-code note that Future.get(timeout) should be used to avoid 
waiting forever. That is a separate JIRA after this one, so timeout handling 
does not also have to invent interrupt policy.

Expected:
- An interrupted wait restores the interrupt flag.
- The session does not report a successful completed command.
- Existing success/nonzero-exit tests still pass.

Actual:
- InterruptedException is ignored or logged, the flag is cleared, and 
ExecuteStreamCommand can attribute execution.status=0.



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to