Github user wy96f commented on a diff in the pull request:
https://github.com/apache/activemq-artemis/pull/2369#discussion_r224976264
--- Diff:
artemis-server/src/main/java/org/apache/activemq/artemis/core/paging/cursor/impl/PageCursorProviderImpl.java
---
@@ -599,6 +600,29 @@ private long checkMinPage(Collection<PageSubscription>
cursorList) {
}
+ private void deliverIfNecessary(Collection<PageSubscription>
cursorList) {
+ long minPage = Long.MAX_VALUE;
+ PageSubscription slowSubscription = null;
+ int nonEmptyCursorNum = 0;
+
+ for (PageSubscription cursor : cursorList) {
+ long firstPage = cursor.getFirstPage();
+
+ // the cursor will return -1 if the cursor is empty
+ if (firstPage >= 0) {
+ nonEmptyCursorNum++;
+ if (firstPage < minPage) {
+ minPage = firstPage;
+ slowSubscription = cursor.getQueue().getMessageCount() == 0
? cursor : null;
+ }
+ }
+ }
+
+ if (nonEmptyCursorNum > 1 && slowSubscription != null) {
+ slowSubscription.getQueue().deliverAsync();
--- End diff --
> Just to understand the fix: given that QueueImpl::deliverAsync will
trigger QueueImpl::checkDepage that will schedule an async task
QueueImpl::DepageRunner how do you know that it will be finished time in order
to have the PageSubscription completed when it will check later on the same
cleanup call?
> From what I have understood it will be eventually completed on the
cleanup that will follow a successfull DepageRunner::run...
Yes, that's right. A successful DepageRunner::run will trigger
PageSubscription::processACK, then PageSubscription::cleanupEntries, and lastly
PageCursorProvider::cleanup.
---