Mark Payne created NIP-51:
-----------------------------

             Summary: Allow Draining of a Process Group
                 Key: NIP-51
                 URL: https://issues.apache.org/jira/browse/NIP-51
             Project: NiFi Improvement Proposal
          Issue Type: Improvement
            Reporter: Mark Payne


h2. Motivation

There are several times when a user needs all of the data that is already 
queued in a Process Group to finish processing, without letting any new data in:
 * *Moving a flow to another NiFi instance.* NiFi can now export a flow along 
with the state of its components and import it elsewhere with that state 
(NIFI-15671). Queued FlowFiles are not part of the export, so the queues need 
to be empty first.
 * *Upgrading a Versioned Flow.* A new version may change or remove the 
components that hold queued data. Emptying the group first means that the data 
is never processed by a flow that it was not built for.
 * *Suspending a flow for a period of time.* Letting queued data finish first 
means it is not left waiting until the flow is started again.

Today the user has to find and stop every component that brings data into the 
group, make sure everything else is running, and then watch the queues until 
they are empty. Furthermore, it can take a long time for some processors such 
as MergeContent to complete because we have to wait for the Max Bin Age, etc. 
Recent additions already allow stopping all source components. This is not 
intended to replace that but to complement it, as there are reasons for 
stopping the source components other than necessarily a full drain.

NiFi already supports draining a Connector. This NIP proposes the same ability 
for any Process Group on the canvas.
h2. Proposed Solution

A user can choose "Drain" for a Process Group. NiFi then:
 * Stops the source Processors (Processors with no incoming connections) in the 
group and all of its child groups, and the Input Ports of the drained group 
itself.
 * Starts all other Processors, Output Ports and Remote Process Groups, and 
enables the Controller Services that they reference.
 * Reports progress as the number and size of FlowFiles still queued, compared 
to when the drain began.
 * Lists the components that keep the drain from finishing because they are 
invalid or disabled and have data queued.

The user can also cancel a drain at any time. While a drain is in progress, 
users cannot start the source components or stop the other components in the 
group. Drains are not remembered across a restart.

Some Processors may take a very long time to pass FlowFiles along, or may never 
do so, once new data stops arriving. MergeContent and MergeRecord configured 
without a Max Bin Age are good examples. NiFi will notify Processors when a 
drain begins and ends, so that they can process their data more aggressively 
during a drain.
h2. NiFi API Changes

Two new lifecycle annotations, {{@OnDrainInitiated}} and 
{{{}@OnDrainCompleted{}}}, for Processors and Controller Services that need to 
behave differently while their Process Group is being drained. Methods may take 
no arguments, a {{ProcessContext}} (Processors), or a {{ConfigurationContext}} 
(Controller Services). This change is purely additive. Components that do not 
use the annotations are not affected.

{{TestRunner}} in nifi-mock gains {{initiateDrain()}} and {{completeDrain()}} 
so that extension developers can test this behavior.
h2. REST API Changes

New asynchronous endpoints will be added for creating, fetching, and deleting a 
drian.

Beginning a drain requires WRITE permission on the Process Group and on 
everything in it. In a cluster, all nodes must be connected. 
{{ProcessGroupDTO}} gains a read-only {{drainRequestId}} field.
h2. UI Changes

The Process Group context menu gains "Drain". A dialog shows a progress bar and 
a Cancel button. It also lists any blocking components with the reason they are 
blocking.

 



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

Reply via email to