Pierre Villard created NIFI-16085:
-------------------------------------

             Summary: Flow synchronization fails when a Parameter 
Provider-backed Parameter Context contains a parameter not flagged as provided
                 Key: NIFI-16085
                 URL: https://issues.apache.org/jira/browse/NIFI-16085
             Project: Apache NiFi
          Issue Type: Bug
          Components: Core Framework
            Reporter: Pierre Villard
            Assignee: Pierre Villard


When NiFi synchronizes a flow (a node joining/rejoining a cluster, or loading 
the flow at startup) VersionedFlowSynchronizer rebuilds each Parameter 
Context's parameters from the serialized flow and copies the per-parameter 
provided flag verbatim (VersionedParameter.isProvided()). If a Parameter 
Context that is backed by a Parameter Provider contains a parameter whose 
serialized provided flag is false, the synchronizer calls 
ParameterContext.setParameters(...) with a user-entered parameter, which 
StandardParameterContext rejects:
{code:java}
java.lang.IllegalArgumentException: Parameters for Context [<name>] cannot be 
manually updated
    because they are provided by Parameter Provider [<id>]{code}
wrapped as:
{code:java}
org.apache.nifi.controller.serialization.FlowSynchronizationException: Failed 
to connect node to cluster
    because local flow controller partially updated. Administrator should 
disconnect node and review flow for corruption. {code}
The node then fails to start the Flow Service and, in a cluster, disconnects 
with Disconnect Code "Node's Flow did not Match Cluster Flow" and cannot 
rejoin. The node stays down until the flow is manually corrected.

Why the state is reachable: a provider-backed Parameter Context can never hold 
a non-provided (user-entered) parameter as a live object, it is rejected at 
every write path (setParameters, and binding a Provider onto a context that 
already has user-entered parameters). However, VersionedParameter.provided is a 
primitive boolean that defaults to false on deserialization, so a serialized 
flow can present a provider-backed context with a provided=false parameter 
(e.g. across serialization/version differences). Flow synchronization trusts 
that per-parameter flag instead of the context-level Provider binding.



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

Reply via email to