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

Pierre Villard updated NIFI-16542:
----------------------------------
    Fix Version/s: 2.13.0
         Assignee: Vincenzo Lombardo
       Resolution: Fixed
           Status: Resolved  (was: Patch Available)

> Removing a single cluster state key disconnects nodes due to non-idempotent 
> replicated validation
> -------------------------------------------------------------------------------------------------
>
>                 Key: NIFI-16542
>                 URL: https://issues.apache.org/jira/browse/NIFI-16542
>             Project: Apache NiFi
>          Issue Type: Bug
>          Components: Core Framework
>    Affects Versions: 2.12.0
>            Reporter: Vincenzo Lombardo
>            Assignee: Vincenzo Lombardo
>            Priority: Major
>             Fix For: 2.13.0
>
>          Time Spent: 1h
>  Remaining Estimate: 0h
>
> When a single key is removed from a component's cluster state (POST 
> /processors/\{id}/state/clear-requests with a ComponentStateDTO, the 
> selective key drop added in NIFI-14900), the request is replicated to all 
> nodes, but the cluster state itself is shared (e.g. ZooKeeper).
> StandardComponentStateDAO.clearState() validates the request on each node 
> with hasExactlyOneKeyRemoved(currentClusterState, newClusterState) before 
> calling setState(). The first node to process the request validates against 
> the original state, writes the new state and returns 200. Any node that 
> processes the request afterwards reads the already-updated cluster state, 
> where current equals new, so the validation fails with IllegalStateException 
> ("Unable to remove a state key for component ... Exactly one key removal is 
> supported.") and that node returns 409.
> Because the node responses differ, the cluster coordinator requests the 
> failing node to reconnect:
>   WARN NodeClusterCoordinator The following nodes failed to process URI 
> /nifi-api/processors/<id>/state/clear-requests '[localhost:5672]'.  
> Requesting each node reconnect to cluster.
> In the node request logs the same clear-requests call shows 200 on one node 
> and 409 on the other.
> This is visible in the system tests: since NIFI-16494 added a second 
> runProcessorOnce() at the end of 
> ClusterStateKeyDropIT.testCanDropSpecificStateKey, the test fails frequently 
> on main (macOS and Ubuntu, Java 21 and 25) with:
>   NiFiClientException: Error starting Processor: Cluster is unable to service 
> request to change flow: Node localhost:5672 is currently connecting
> The retry in AbstractStateKeyDropIT only covers "not connected" messages, but 
> the underlying cause is the node disconnection described above, so extending 
> the retry would only hide the problem. Before NIFI-16494 the race was already 
> present but went unnoticed because the test ended right after verifying the 
> state (NIFI-15763 likely addressed an earlier symptom of the same issue).
> Example failing runs on main, with troubleshooting-logs artifacts containing 
> the node logs:
> https://github.com/apache/nifi/actions/runs/41653533114
> https://github.com/apache/nifi/actions/runs/41534185546
> https://github.com/apache/nifi/actions/runs/41100346795
> Proposed fix: make the selective cluster state key removal idempotent across 
> replicated requests. If the current cluster state already equals the 
> requested state, treat the request as already applied by another node instead 
> of throwing. Add a unit test covering the second-node case.



--
This message was sent by Atlassian Jira
(v10.3.26#10030026)

Reply via email to