gemmellr commented on code in PR #5334:
URL: https://github.com/apache/activemq-artemis/pull/5334#discussion_r1858442725


##########
artemis-server/src/main/java/org/apache/activemq/artemis/core/postoffice/impl/PostOfficeImpl.java:
##########
@@ -1366,17 +1367,36 @@ private static void applyExpiryDelay(Message message, 
AddressSettings settings)
             message.setExpiration(System.currentTimeMillis() + 
expirationOverride);
          }
       } else {
-         long minExpiration = settings.getMinExpiryDelay();
-         long maxExpiration = settings.getMaxExpiryDelay();
-
-         if (maxExpiration != AddressSettings.DEFAULT_MAX_EXPIRY_DELAY && 
(message.getExpiration() == 0 || message.getExpiration() > 
(System.currentTimeMillis() + maxExpiration))) {
-            message.setExpiration(System.currentTimeMillis() + maxExpiration);
-         } else if (minExpiration != AddressSettings.DEFAULT_MIN_EXPIRY_DELAY 
&& message.getExpiration() < (System.currentTimeMillis() + minExpiration)) {
-            message.setExpiration(System.currentTimeMillis() + minExpiration);
+         // if the incoming message has NO expiration then apply the max if 
set and if not set then apply the min if set
+         if (message.getExpiration() == 0) {
+            if (maxExpiration != AddressSettings.DEFAULT_MAX_EXPIRY_DELAY) {
+               if (maxExpiration != 0) {
+                  message.setExpiration(getExpirationToSet(maxExpiration));
+               }
+            } else if (minExpiration != 
AddressSettings.DEFAULT_MIN_EXPIRY_DELAY) {
+               if (minExpiration != 0) {
+                  message.setExpiration(getExpirationToSet(minExpiration));
+               }
+            }
+         } else if (maxExpiration != AddressSettings.DEFAULT_MAX_EXPIRY_DELAY 
&& message.getExpiration() >= (System.currentTimeMillis() + maxExpiration)) {
+            message.setExpiration(getExpirationToSet(maxExpiration));
+         } else if (minExpiration != AddressSettings.DEFAULT_MIN_EXPIRY_DELAY 
&& (minExpiration == 0 || message.getExpiration() < (System.currentTimeMillis() 
+ minExpiration))) {
+            message.setExpiration(getExpirationToSet(minExpiration));

Review Comment:
   I didnt change the max-expiry-delay=0 handling, as I'm now debating what it 
should do overall. It has a similar but reversed behaviour, that it wont do 
anything for an expiration in the past, but will for present/future 
expirations. Which on one hand seems perfectly fair; originally already 
expired, definitely 'shorter expiration' than a maximum of never-expire. 
However on the other hand its also totally at odds with it resetting a 
future-expiration to instead never-expire.
   
   The special handling for max-expiry-delay=0 meaning dont-expire, mainly 
seems to be there / necessary because of the earlier application when a message 
has no expiration set meaning it then gets max-expiry-delay applied if 
configured (which previously then immediately expired before these changes, and 
now would remain with no-expiry).
   
   In the later cases here of a message which does have an expiration already, 
it seems a foggier that it should remove it for max-expiry-delay. For such 
messages, max-expiry-delay is documented to only affect existing expirations 
greater than the maximum, reducing them to the maximum. A max-expiry-delay of 0 
meaning no-expiration, is then arguably still a 'larger value' (never/infinite) 
than any specific expiration point that might be set, arguably meaning it 
shouldnt be changed due to the max-expiry-delay. Then, if you do want to stop 
such a message expiring which already have an expiration set, the way is 
instead setting a min-expiry-delay=0 to handle that case. If on the other hand 
a setting of 0 just always means 'set no-expiration' even for the 
max-expiry-delay like it does in most cases now, then should it not also do 
that even for the messages that originally had expiration in the past? (by 
adding a similar maxExpiration=0 escape to the check as I did for minExpiration)



##########
docs/user-manual/message-expiry.adoc:
##########
@@ -67,8 +67,8 @@ If `expiry-delay` is _not set_ then minimum and maximum 
expiry delay values can
 Semantics are as follows:
 
 * Messages _without_ an expiration will be set to `max-expiry-delay`.
-If `max-expiry-delay` is not defined then the message will be set to 
`min-expiry-delay`.
-If `min-expiry-delay` is not defined then the message will not be changed.
+** If `max-expiry-delay` is not defined then the message will be set to 
`min-expiry-delay`.
+** If `min-expiry-delay` is not defined then the message will not be changed.

Review Comment:
   Whatever we end up doing, the specific 0=special handling that applies 
should probably be documented, its not mentioned anywhere currently



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: gitbox-unsubscr...@activemq.apache.org

For queries about this service, please contact Infrastructure at:
us...@infra.apache.org


---------------------------------------------------------------------
To unsubscribe, e-mail: gitbox-unsubscr...@activemq.apache.org
For additional commands, e-mail: gitbox-h...@activemq.apache.org
For further information, visit: https://activemq.apache.org/contact


Reply via email to