Pierre Villard created NIP-37:
---------------------------------

             Summary: Expose Node Connection State through NodeTypeProvider
                 Key: NIP-37
                 URL: https://issues.apache.org/jira/browse/NIP-37
             Project: NiFi Improvement Proposal
          Issue Type: Improvement
            Reporter: Pierre Villard


h2. Motivation

*NodeTypeProvider* currently exposes cluster status through several boolean 
methods:
 * *isConfiguredForClustering()* indicates whether the NiFi instance is 
configured as a cluster node.
 * *isClustered()* indicates whether the node is connected or attempting to 
connect.
 * *isConnected()* indicates whether the node is fully connected.

These booleans do not provide enough information to describe the node lifecycle 
accurately. In particular, components can be loaded and validated while a node 
is joining a cluster.

During clustered startup, the Cluster Coordinator marks the local node as 
*CONNECTING* before the cluster flow is loaded. However, 
*FlowController.isClustered()* is not set to true until after flow 
synchronization completes. Setting it earlier is not appropriate because 
*FlowController.setClustered(true, ...)* also starts cluster-related behavior 
such as heartbeating, leader-election participation, load balancing, and Remote 
Process Group reinitialization.

As a result, a component loaded during flow synchronization can observe:
 * isConfiguredForClustering() == true
 * isClustered() == false
 * isConnected() == false

>From these values, the component cannot distinguish a standalone or 
>disconnected node from a node that is actively connecting to a cluster. 
>Components that need to validate behavior based on cluster topology can 
>therefore produce incorrect transient validation results during startup.

NiFi already models this lifecycle using {*}NodeConnectionState{*}, with states 
such as {*}CONNECTING{*}, {*}CONNECTED{*}, {*}DISCONNECTING{*}, and 
{*}DISCONNECTED{*}. This proposal makes that state available through 
{*}NodeTypeProvide{*}` instead of requiring components to infer it from 
multiple booleans.
h2. Scope

Add the following method to {*}NodeTypeProvider{*}:
{code:java}
default Optional<NodeConnectionState> getNodeConnectionState() {
    return Optional.empty();
}{code}
The default implementation preserves compatibility with existing 
implementations of {*}NodeTypeProvider{*}.

The proposed semantics are:
 * *Optional.empty()* means that the provider does not expose a cluster 
connection state, including providers representing standalone NiFi instances.
 * A present value represents the current connection lifecycle state of the 
local node.
 * *CONNECTING* means that the node is joining the cluster but has not 
completed connection.
 * *CONNECTED* means that the node has completed the connection process.
 * Other existing *NodeConnectionState* values retain their current meanings.

*NodeConnectionState* currently belongs to the nifi-framework-cluster-protocol 
module, which is in nifi. To expose it from {*}NodeTypeProvider{*}, move 
*NodeConnectionState* into the nifi-api artifact while retaining its existing 
package name, enum constants, ordering, and serialization behavior.

Retaining the fully qualified class name avoids requiring source changes in 
existing NiFi framework code that uses the enum.



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

Reply via email to