[ 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