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

cshannon pushed a commit to branch activemq-5.19.x
in repository https://gitbox.apache.org/repos/asf/activemq.git

commit 733257f23cdfdcc199e71ff3fc4670f2a56876a2
Author: Christopher L. Shannon <[email protected]>
AuthorDate: Wed Nov 26 11:07:12 2025 -0500

    AMQ-9813 - Minor updates
    
    Rework handling of expiration array list to avoid allocation when not
    needed
    
    (cherry picked from commit 602f1bc75cf961ae355f87742413621888f16a93)
---
 .../region/cursors/FilePendingMessageCursor.java   | 39 ++++++++++++----------
 1 file changed, 21 insertions(+), 18 deletions(-)

diff --git 
a/activemq-broker/src/main/java/org/apache/activemq/broker/region/cursors/FilePendingMessageCursor.java
 
b/activemq-broker/src/main/java/org/apache/activemq/broker/region/cursors/FilePendingMessageCursor.java
index 791da17907..9bb93fbe79 100644
--- 
a/activemq-broker/src/main/java/org/apache/activemq/broker/region/cursors/FilePendingMessageCursor.java
+++ 
b/activemq-broker/src/main/java/org/apache/activemq/broker/region/cursors/FilePendingMessageCursor.java
@@ -208,17 +208,16 @@ public class FilePendingMessageCursor extends 
AbstractPendingMessageCursor imple
     @Override
     public boolean tryAddMessageLast(MessageReference node, long maxWaitTime) 
throws Exception {
         // Discarding expired message should be done outside of synchronized 
section (deadlock, see AMQ-5785)
-        List<MessageReference> expiredMessages = new ArrayList<>();
-        boolean isExpiration = tryAddMessageLastInternal(node, maxWaitTime, 
expiredMessages);
+        final List<MessageReference> expiredMessages = new ArrayList<>();
+        final boolean added = tryAddMessageLastInternal(node, maxWaitTime, 
expiredMessages);
         for (MessageReference expiredMessage : expiredMessages) {
             discardExpiredMessage(expiredMessage);
         }
-        return isExpiration;
+        return added;
     }
 
-    private synchronized boolean tryAddMessageLastInternal(
-      MessageReference node, long maxWaitTime, List<MessageReference> 
expiredMessages
-    ) {
+    private synchronized boolean tryAddMessageLastInternal(MessageReference 
node, long maxWaitTime,
+                                                           
List<MessageReference> expiredMessages) {
         if (!node.isExpired()) {
             try {
                 regionDestination = (Destination) 
node.getMessage().getRegionDestination();
@@ -232,7 +231,7 @@ public class FilePendingMessageCursor extends 
AbstractPendingMessageCursor imple
                 }
                 if (!hasSpace()) {
                     if (isDiskListEmpty()) {
-                        expiredMessages.addAll(expireOldMessages());
+                        expireOldMessages(expiredMessages);
                         if (hasSpace()) {
                             memoryList.addMessageLast(node);
                             node.incrementReferenceCount();
@@ -268,14 +267,15 @@ public class FilePendingMessageCursor extends 
AbstractPendingMessageCursor imple
     @Override
     public void addMessageFirst(MessageReference node) {
         // Discarding expired message should be done outside of synchronized 
section (deadlock, see AMQ-5785)
-        List<MessageReference> expiredMessages = addMessageFirstInternal(node);
-        for (MessageReference expiredMessage : expiredMessages) {
-            discardExpiredMessage(expiredMessage);
+        final List<MessageReference> expiredMessages = 
addMessageFirstInternal(node);
+        if (expiredMessages != null) {
+            for (MessageReference expiredMessage : expiredMessages) {
+                discardExpiredMessage(expiredMessage);
+            }
         }
     }
 
     private synchronized List<MessageReference> 
addMessageFirstInternal(MessageReference node) {
-        List<MessageReference> expiredMessages = new ArrayList<>();
         if (!node.isExpired()) {
             try {
                 regionDestination = (Destination) 
node.getMessage().getRegionDestination();
@@ -284,12 +284,12 @@ public class FilePendingMessageCursor extends 
AbstractPendingMessageCursor imple
                         memoryList.addMessageFirst(node);
                         node.incrementReferenceCount();
                         setCacheEnabled(true);
-                        return expiredMessages;
+                        return List.of();
                     }
                 }
                 if (!hasSpace()) {
                     if (isDiskListEmpty()) {
-                        expiredMessages = expireOldMessages();
+                        List<MessageReference> expiredMessages = 
expireOldMessages();
                         if (hasSpace()) {
                             memoryList.addMessageFirst(node);
                             node.incrementReferenceCount();
@@ -310,9 +310,9 @@ public class FilePendingMessageCursor extends 
AbstractPendingMessageCursor imple
                 throw new RuntimeException(e);
             }
         } else {
-            expiredMessages.add(node);
+            return List.of(node);
         }
-        return expiredMessages;
+        return null;
     }
 
     /**
@@ -451,7 +451,12 @@ public class FilePendingMessageCursor extends 
AbstractPendingMessageCursor imple
     }
 
     private synchronized List<MessageReference> expireOldMessages() {
-        List<MessageReference> expired = new ArrayList<MessageReference>();
+        final List<MessageReference> expired = new ArrayList<>();
+        expireOldMessages(expired);
+        return expired;
+    }
+
+    private synchronized void expireOldMessages(List<MessageReference> 
expired) {
         if (!memoryList.isEmpty()) {
             for (Iterator<MessageReference> iterator = memoryList.iterator(); 
iterator.hasNext();) {
                 MessageReference node = iterator.next();
@@ -462,8 +467,6 @@ public class FilePendingMessageCursor extends 
AbstractPendingMessageCursor imple
                 }
             }
         }
-
-        return expired;
     }
 
     protected synchronized void flushToDisk() {


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]
For further information, visit: https://activemq.apache.org/contact


Reply via email to