Github user franz1981 commented on a diff in the pull request:

    https://github.com/apache/activemq-artemis/pull/2494#discussion_r246602031
  
    --- Diff: 
artemis-server/src/main/java/org/apache/activemq/artemis/core/paging/cursor/impl/LivePageCacheImpl.java
 ---
    @@ -48,54 +82,228 @@ public long getPageId() {
        }
     
        @Override
    -   public synchronized int getNumberOfMessages() {
    -      return messages.size();
    +   public int getNumberOfMessages() {
    +      while (true) {
    +         final long size = producerIndex;
    +         if (size == RESIZING) {
    +            Thread.yield();
    +            continue;
    +         }
    +         return (int) Math.min(size, Integer.MAX_VALUE);
    +      }
        }
     
        @Override
    -   public synchronized void setMessages(PagedMessage[] messages) {
    +   public void setMessages(PagedMessage[] messages) {
           // This method shouldn't be called on liveCache, but we will provide 
the implementation for it anyway
           for (PagedMessage msg : messages) {
              addLiveMessage(msg);
           }
        }
     
        @Override
    -   public synchronized PagedMessage getMessage(int messageNumber) {
    -      if (messageNumber < messages.size()) {
    -         return messages.get(messageNumber);
    -      } else {
    +   public PagedMessage getMessage(int messageNumber) {
    +      if (messageNumber < 0) {
              return null;
           }
    +      //it allow to perform less cache invalidations vs producerIndex if 
there are bursts of appends
    +      long size = lastSeenProducerIndex;
    +      if (messageNumber >= size) {
    +         while ((size = producerIndex) == RESIZING) {
    +            Thread.yield();
    +         }
    +         //it is a message over the current size?
    +         if (messageNumber >= size) {
    --- End diff --
    
    Is not that easy here, this one is not a common collection (in theory, but 
we can get an agreement on the contract for sure): it is more an append only 
list that allows indexed queries like a map.
    If I remember correctly it is similar to an [hashed array 
tree](https://en.wikipedia.org/wiki/Hashed_array_tree), where the top-level 
directory is a double linked list of "folders" (instead of an array, like the 
original implementation): indeed in the code there are chunkIndex (==key of top 
level directory) and offset (==key of leaf into a directory).


---

Reply via email to