Arvind Kandpal created NIFI-16540:
-------------------------------------

             Summary: ControlRate does not remove expired throttles when using 
a Grouping Attribute
                 Key: NIFI-16540
                 URL: https://issues.apache.org/jira/browse/NIFI-16540
             Project: Apache NiFi
          Issue Type: Bug
          Components: Extensions
            Reporter: Arvind Kandpal


ControlRate keeps one Throttle per value of the Grouping Attribute. The method 
clearExpiredThrottles() is supposed to remove throttles that were not used in 
the last two time periods, but nothing is ever removed.

The method copies the entries of dataThrottleMap and countThrottleMap into a 
new HashSet and then calls iterator.remove() on that copy. Only the temporary 
set changes.
The two throttle maps are never updated.

This was introduced in NIFI-10243. Before that change, the iterator removed 
entries from the throttle map itself.

Steps to reproduce:
  1. Configure ControlRate:
     - Rate Control Criteria: flowfile count
     - Maximum Rate: 10
     - Time Duration: 1 sec
     - Grouping Attribute: g
  2. Send 1000 FlowFiles, each with a different value of g.
  3. Keep sending FlowFiles for more than 2 time periods (for example 50 
seconds).

Expected: throttles that are not used any more are removed, and the number of 
throttles goes back down.
Actual: the throttle count stays at 1000 and keeps growing (1000 -> 1005 after 
50 seconds in the test). Nothing is removed.

Impact: with a high-cardinality Grouping Attribute (for example a user id or 
file name), the throttle maps grow without limit until the processor properties 
are changed. This leads to growing heap usage.

Code: nifi-standard-processors, ControlRate.java, clearExpiredThrottles()

Existing tests do not cover throttle removal.




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

Reply via email to