[ 
https://issues.apache.org/jira/browse/ARTEMIS-4973?focusedWorklogId=929263&page=com.atlassian.jira.plugin.system.issuetabpanels:worklog-tabpanel#worklog-929263
 ]

ASF GitHub Bot logged work on ARTEMIS-4973:
-------------------------------------------

                Author: ASF GitHub Bot
            Created on: 08/Aug/24 03:26
            Start Date: 08/Aug/24 03:26
    Worklog Time Spent: 10m 
      Work Description: gaohoward commented on code in PR #5128:
URL: https://github.com/apache/activemq-artemis/pull/5128#discussion_r1708515262


##########
artemis-server/src/main/java/org/apache/activemq/artemis/core/paging/impl/PagingStoreImpl.java:
##########
@@ -228,11 +228,58 @@ private void configureSizeMetric() {
       size.setMax(maxSize, maxSize, maxMessages, maxMessages);
    }
 
+   private boolean validateNewSettings(final AddressSettings addressSettings) {
+
+      Long newPageLimitBytes = addressSettings.getPageLimitBytes();
+
+      if (newPageLimitBytes != null && newPageLimitBytes < 0) {
+         newPageLimitBytes = null;
+      }
+
+      int newPageSize = 
storageManager.getAllowedPageSize(addressSettings.getPageSizeBytes());
+
+      if (newPageLimitBytes != null && newPageSize > 0) {
+
+         if (newPageSize > newPageLimitBytes) {
+            ActiveMQServerLogger.LOGGER.pageSettingsFailedApply(storeName, 
addressSettings, "pageLimitBytes is smaller than pageSize. It should allow at 
least one page file");
+            return false;
+         }
+
+         long newEstimatedMaxPages = newPageLimitBytes / newPageSize;
+
+         long existingNumberOfPages;
+         if (!running) {
+            try {
+               checkFileFactory();
+               List<String> files = this.fileFactory.listFiles("page");
+               existingNumberOfPages = files.size();
+            } catch (Exception e) {
+               ActiveMQServerLogger.LOGGER.pageSettingsFailedApply(storeName, 
addressSettings, "failed to get existing page files with exception: " + e);
+               return false;
+            }
+         } else {
+            existingNumberOfPages = this.numberOfPages;
+         }
+
+         if (existingNumberOfPages > newEstimatedMaxPages) {
+            ActiveMQServerLogger.LOGGER.pageSettingsFailedApply(storeName, 
addressSettings, "estimated max pages " + newEstimatedMaxPages + " 
(pageLimitBytes / pageSize) is less than current number of pages " + 
existingNumberOfPages);
+            return false;
+         }

Review Comment:
   I think your idea is more friendly to the users. But that'll change the 
current implementation of it. According to current impl, the practical usage of 
pageLimitBytes would be a hard rule, i.e. in that case the user has to consume 
the messages until the current pages is below the expected new limit, that 
apply the new limit. Based on your idea the new limit can be set at anytime 
during broker running. something worth to do. Anyway we need to document that 
behavior.





Issue Time Tracking
-------------------

    Worklog Id:     (was: 929263)
    Time Spent: 3.5h  (was: 3h 20m)

> pageSizeBytes/pageLimitBytes combination can cause Address full
> ---------------------------------------------------------------
>
>                 Key: ARTEMIS-4973
>                 URL: https://issues.apache.org/jira/browse/ARTEMIS-4973
>             Project: ActiveMQ Artemis
>          Issue Type: Bug
>          Components: Broker
>    Affects Versions: 2.36.0
>            Reporter: Howard Gao
>            Assignee: Howard Gao
>            Priority: Major
>          Time Spent: 3.5h
>  Remaining Estimate: 0h
>
> There is an edge case where adjusting pageSizeBytes can cause "Address is 
> full" errors, even though the address is not full.
> Do we need to enforce that pageSizeBytes <= pageLimitBytes?
> Reproducer steps:
> Step 1: configure pageSizeBytes == pageLimitBytes == 1mb:
> $ cat my.broker.properties 
> addressSettings."FOO".pageSizeBytes=1048576
> addressSettings."FOO".pageLimitBytes=1048576
> addressSettings."FOO".maxSizeBytes=1048576
> addressSettings."FOO".pageFullMessagePolicy=FAIL
> addressConfigurations."FOO".routingTypes=MULTICAST
> addressConfigurations."FOO".queueConfigs."FOO".name=FOO
> addressConfigurations."FOO".queueConfigs."FOO".address=FOO
> addressConfigurations."FOO".queueConfigs."FOO".routingType=MULTICAST
> Step 2: run broker
> bin/artemis run --properties my.broker.properties
> Step 3: produce 15 messages
> $ bin/artemis producer --user admin --password admin --destination 
> topic://FOO --message-count 15 --message-size 100000 --protocol amqp
> Step 4: observe paging started on the destination (but the page size is 
> 328kb, can hold more messages)
> INFO  [org.apache.activemq.artemis.core.server] AMQ222038: Starting paging on 
> address 'FOO'; size=1107003 bytes (11 messages); maxSize=1048576 bytes (-1 
> messages); globalSize=1107003 bytes (11 messages); globalMaxSize=1073741824 
> bytes (-1 messages);
> Step 5: stop broker, increase page size
>  cat my.broker.properties 
> addressSettings."FOO".pageSizeBytes=4048576
> ...
> Step 6: run broker, observe logs show paging warning
> 2024-06-25 15:23:47,135 WARN  [org.apache.activemq.artemis.core.server] 
> AMQ224123: Address FOO has more pages than allowed. System currently has 1 
> pages, while the estimated max number of pages is 0 based on the 
> page-limit-bytes (1048576) / page-size (4048576)
> Step 7: try to produce a message, address full
> WARN  [org.apache.activemq.artemis.protocol.amqp.broker.AMQPSessionCallback] 
> AMQ229102: Address "FOO" is full.



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

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


Reply via email to