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)

Reply via email to