Pierre Villard created NIFI-16383:
-------------------------------------
Summary: 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
*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)