Description
LivePageCacheImpl::getMessage is performing a linked-list-like lookup that can be rather slow if compared to an array lookup.
https://github.com/apache/activemq-artemis/pull/2494#issuecomment-455086939 clearly show the issue with the current implementation.
The ideal approaches to improve it could be:
- to replace the chunked list with a copy on write array list
- to use cursor/iterator API over the chunk list, binding one to each consumer, in order to get a linear stride over the live paged messages
Sadly, the latter approach seems not doable because the live page cache is accessed for each message lookup in an anonymous way, making impossible to have a 1:1 binding with the consumers, while the former seems not doable, because of the array copy cost on appending.
There is still one case that could be improved using the former approach, instead, delivering a huge speedup on lookup cost: while reloading live pages.
A reloaded live page already knows the amount of the loaded live paged messages, making possible to store them in a simple array, allowing a much faster lookup.
Attachments
Issue Links
- links to