This is an automated email from the ASF dual-hosted git repository.

pvillard31 pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/nifi.git


The following commit(s) were added to refs/heads/main by this push:
     new 93caeedd42a NIFI-16476 Fix last queue dates for queues with many empty 
remote partitions and priority queues (#11821)
93caeedd42a is described below

commit 93caeedd42a751e333089e28cd9040aa9316671e
Author: boguszj <[email protected]>
AuthorDate: Wed Oct 21 13:12:04 2026 +0200

    NIFI-16476 Fix last queue dates for queues with many empty remote 
partitions and priority queues (#11821)
---
 .../nifi/controller/queue/SwappablePriorityQueue.java   | 13 +++++++------
 .../clustered/SocketLoadBalancedFlowFileQueue.java      |  8 ++++++--
 .../clustered/TestSocketLoadBalancedFlowFileQueue.java  | 17 +++++++++++++++++
 .../queue/clustered/TestSwappablePriorityQueue.java     | 13 +++++++++++++
 4 files changed, 43 insertions(+), 8 deletions(-)

diff --git 
a/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/controller/queue/SwappablePriorityQueue.java
 
b/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/controller/queue/SwappablePriorityQueue.java
index dee5c139bf5..8778683713e 100644
--- 
a/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/controller/queue/SwappablePriorityQueue.java
+++ 
b/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/controller/queue/SwappablePriorityQueue.java
@@ -1269,7 +1269,7 @@ public class SwappablePriorityQueue {
         try {
             // We want the oldest timestamp, which will be the min
             long min = getMinLastQueueDate(activeQueue, 0L);
-            min = Long.min(min, getMinLastQueueDate(swapQueue, min));
+            min = getMinLastQueueDate(swapQueue, min);
 
             for (Long minSwapQueueDate: minQueueDateInSwapLocation.values()) {
                 min = min == 0 ? minSwapQueueDate : Long.min(min, 
minSwapQueueDate);
@@ -1281,14 +1281,15 @@ public class SwappablePriorityQueue {
         }
     }
 
-    private long getMinLastQueueDate(Iterable<FlowFileRecord> iterable, long 
defaultMin) {
-        long min = 0;
+    private long getMinLastQueueDate(final Iterable<FlowFileRecord> iterable, 
final long initialMin) {
+        long min = initialMin;
 
-        for (FlowFileRecord flowFileRecord : iterable) {
-            min = min == 0 ? flowFileRecord.getLastQueueDate() : 
Long.min(flowFileRecord.getLastQueueDate(), min);
+        for (final FlowFileRecord flowFileRecord : iterable) {
+            final long lastQueueDate = flowFileRecord.getLastQueueDate();
+            min = min == 0 ? lastQueueDate : Long.min(lastQueueDate, min);
         }
 
-        return min == 0 ? defaultMin : min;
+        return min;
     }
 
     public long getTotalQueuedDuration(long fromTimestamp) {
diff --git 
a/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/controller/queue/clustered/SocketLoadBalancedFlowFileQueue.java
 
b/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/controller/queue/clustered/SocketLoadBalancedFlowFileQueue.java
index 4985cd58fe9..dde99caaabd 100644
--- 
a/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/controller/queue/clustered/SocketLoadBalancedFlowFileQueue.java
+++ 
b/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/controller/queue/clustered/SocketLoadBalancedFlowFileQueue.java
@@ -602,9 +602,13 @@ public class SocketLoadBalancedFlowFileQueue extends 
AbstractFlowFileQueue imple
     @Override
     public long getMinLastQueueDate() {
         long min = 0;
-        for (QueuePartition queuePartition : queuePartitions) {
-            min = min == 0 ? queuePartition.getMinLastQueueDate() : 
Long.min(min, queuePartition.getMinLastQueueDate());
+        for (final QueuePartition queuePartition : queuePartitions) {
+            final long partitionMin = queuePartition.getMinLastQueueDate();
+            if (partitionMin > 0) {
+                min = min == 0 ? partitionMin : Long.min(min, partitionMin);
+            }
         }
+
         return min;
     }
 
diff --git 
a/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/test/java/org/apache/nifi/controller/queue/clustered/TestSocketLoadBalancedFlowFileQueue.java
 
b/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/test/java/org/apache/nifi/controller/queue/clustered/TestSocketLoadBalancedFlowFileQueue.java
index 6c683ec9d5b..29c5353aebc 100644
--- 
a/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/test/java/org/apache/nifi/controller/queue/clustered/TestSocketLoadBalancedFlowFileQueue.java
+++ 
b/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/test/java/org/apache/nifi/controller/queue/clustered/TestSocketLoadBalancedFlowFileQueue.java
@@ -275,6 +275,23 @@ public class TestSocketLoadBalancedFlowFileQueue {
         }
     }
 
+    @Test
+    public void testMinLastQueueDateWithEmptyRemotePartitions() {
+        final MockFlowFileRecord localFlowFile = new MockFlowFileRecord();
+        queue.put(localFlowFile);
+
+        final QueuePartition localPartition = queue.getLocalPartition();
+        assertEquals(1, localPartition.size().getObjectCount());
+        for (int i = 0; i < nodeIds.size(); i++) {
+            final QueuePartition partition = queue.getPartition(i);
+            if (partition != localPartition) {
+                assertEquals(0, partition.size().getObjectCount());
+            }
+        }
+
+        assertEquals(localFlowFile.getLastQueueDate().longValue(), 
queue.getMinLastQueueDate());
+    }
+
     @Test
     public void testPutAllBinsFlowFilesSeparately() {
         // Partition data based on size. FlowFiles with 0 bytes will go to 
partition 0 (local partition),
diff --git 
a/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/test/java/org/apache/nifi/controller/queue/clustered/TestSwappablePriorityQueue.java
 
b/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/test/java/org/apache/nifi/controller/queue/clustered/TestSwappablePriorityQueue.java
index 822e5406d90..1b0514ef64e 100644
--- 
a/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/test/java/org/apache/nifi/controller/queue/clustered/TestSwappablePriorityQueue.java
+++ 
b/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/test/java/org/apache/nifi/controller/queue/clustered/TestSwappablePriorityQueue.java
@@ -976,4 +976,17 @@ public class TestSwappablePriorityQueue {
         assertEquals(totalNow - totalQueueDate, 
queue.getTotalQueuedDuration(now));
         assertEquals(minQueueDate, queue.getMinLastQueueDate());
     }
+
+    @Test
+    public void testMinLastQueueDateWithEmptyActiveQueue() {
+        queue = new SwappablePriorityQueue(swapManager, 2, eventReporter, 
flowFileQueue, dropAction, "local");
+        queue.put(new MockFlowFileRecord());
+        queue.put(new MockFlowFileRecord());
+
+        final MockFlowFileRecord swapQueueFlowFile = new MockFlowFileRecord();
+        queue.put(swapQueueFlowFile);
+        queue.poll(2, Collections.emptySet(), -1);
+
+        assertEquals(swapQueueFlowFile.getLastQueueDate().longValue(), 
queue.getMinLastQueueDate());
+    }
 }

Reply via email to