Bob Paulin created NIFI-16544:
---------------------------------
Summary: Complete start Futures when Processor or Stateless Group
declines start
Key: NIFI-16544
URL: https://issues.apache.org/jira/browse/NIFI-16544
Project: Apache NiFi
Issue Type: Bug
Reporter: Bob Paulin
When testing drain functionality on a Connector component I observed a hang on
starting the non-source processors. This was observed during the drain
function as well as during a drain called during prepareForUpdate
```
{
"tid": "853",
"time": "2026-11-04T02:08:47.025510714Z",
"virtual": true,
"name": "",
"state": "WAITING",
"parkBlocker": {
"object":
"java.util.concurrent.CompletableFuture$Signaller@5506df48"
},
"stack": [
"java.base\/java.lang.VirtualThread.park(VirtualThread.java:745)",
"java.base\/java.lang.System$1.parkVirtualThread(System.java:2285)",
"java.base\/java.util.concurrent.locks.LockSupport.park(LockSupport.java:221)",
"java.base\/java.util.concurrent.CompletableFuture$Signaller.block(CompletableFuture.java:1885)",
"java.base\/java.util.concurrent.ForkJoinPool.unmanagedBlock(ForkJoinPool.java:4364)",
"java.base\/java.util.concurrent.ForkJoinPool.managedBlock(ForkJoinPool.java:4310)",
"java.base\/java.util.concurrent.CompletableFuture.waitingGet(CompletableFuture.java:1919)",
"java.base\/java.util.concurrent.CompletableFuture.get(CompletableFuture.java:2093)",
"org.apache.nifi.components.connector.AbstractConnector.startNonSourceComponents(AbstractConnector.java:294)",
"org.apache.nifi.components.connector.AbstractConnector.lambda$drainFlowFiles$3(AbstractConnector.java:207)",
"java.base\/java.lang.VirtualThread.run(VirtualThread.java:460)"
]
},
```
When a Processor or Stateless Group was not STOPPED, the start request
logged a warning and returned without invoking the SchedulingAgentCallback.
The Future returned to the caller was never completed, so any caller
blocking on it, such as a Connector draining FlowFiles, hung indefinitely.
Add SchedulingAgentCallback.onStartDeclined(ScheduledState) with a no-op
default. StandardProcessorNode and StandardStatelessGroupNode now invoke
it whenever they decline a start. The scheduler completes the Future for
an already running or starting component, and fails it for a disabled
processor or a stopping Stateless Group.
--
This message was sent by Atlassian Jira
(v10.3.26#10030026)