You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@nifi.apache.org by "David Handermann (Jira)" <ji...@apache.org> on 2026/07/30 20:00:00 UTC

[jira] [Commented] (NIP-37) Expose Node Connection State through NodeTypeProvider

    [ https://issues.apache.org/jira/browse/NIP-37?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=18100554#comment-18100554 ] 

David Handermann commented on NIP-37:
-------------------------------------

Thanks for proposing this improvement [~pvillard], it should provide a better interface surface that clarifies that state of the Node.

The only adjustment I recommend is an additional enumerated type for unclustered or standalone, as opposed to implying to from the empty status.

> 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
>            Priority: Major
>
> 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)