You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@nifi.apache.org by "Pierre Villard (Jira)" <ji...@apache.org> on 2026/09/23 15:20:00 UTC

[jira] [Updated] (NIFI-16383) Make FlowController node connection state access lock-free

     [ https://issues.apache.org/jira/browse/NIFI-16383?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Pierre Villard updated NIFI-16383:
----------------------------------
    Status: Patch Available  (was: Open)

> Make FlowController node connection state access lock-free
> ----------------------------------------------------------
>
>                 Key: NIFI-16383
>                 URL: https://issues.apache.org/jira/browse/NIFI-16383
>             Project: Apache NiFi
>          Issue Type: Improvement
>            Reporter: Pierre Villard
>            Assignee: Pierre Villard
>            Priority: Major
>
> *FlowController#getNodeConnectionState()* currently acquires the FlowController read lock before reading the local node connection status.
> This can cause a circular wait during startup flow synchronization:
>  # FlowController#synchronize() holds the write lock while loading the flow.
>  # Controller Services are enabled on lifecycle threads, while the synchronization thread waits for enablement.
>  # A Controller Service can call NodeTypeProvider#getNodeConnectionState() from customValidate().
>  # FlowController#getNodeConnectionState() then waits for the read lock, which cannot be acquired while synchronization holds the write lock.
>  # Synchronization waits for validation, and validation waits for synchronization to release the lock.
> This reproduces the same class of 30-second Controller Service enablement stall addressed for isClustered() by NIFI-16153.
> The lock is not required for memory visibility:
>  * configuredForClustering is final.
>  * connectionStatus is volatile.
>  * NodeConnectionStatus is immutable.
> Update FlowController#getNodeConnectionState() to read these fields without acquiring the FlowController read lock. Preserve the existing return semantics:
>  * Return STANDALONE when clustering is not configured.
>  * Return DISCONNECTED when clustering is configured but no local status is available.
>  * Otherwise map the local framework connection state to the API NodeConnectionState.
> Add focused coverage proving that the accessor:
>  * Returns the correct state without taking the FlowController read lock.
>  * Can be called from Controller Service validation while flow synchronization holds the write lock.
>  * Does not block Controller Service enablement or cause the synchronization timeout.
> This change allows components to use NodeTypeProvider#getNodeConnectionState() during startup validation to defer decisions while the node is CONNECTING, without reintroducing the flow-synchronization lock inversion.



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