[ 
https://issues.apache.org/jira/browse/AMQ-6226?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Matt Pavlovich updated AMQ-6226:
--------------------------------
    Affects Version/s:     (was: 5.2.0)
                       5.17.0

> Eliminate AbstractRegion.destinationsLock
> -----------------------------------------
>
>                 Key: AMQ-6226
>                 URL: https://issues.apache.org/jira/browse/AMQ-6226
>             Project: ActiveMQ
>          Issue Type: Bug
>    Affects Versions: 5.17.0
>            Reporter: Tim Bain
>            Priority: Major
>              Labels: performance
>
> This mailing list thread 
> (http://activemq.2283324.n4.nabble.com/ActiveMQ-with-KahaDB-as-persistent-store-becomes-very-slow-almost-unresponsive-after-creating-large-s-td4709985.html)
>  described awful performance problems when creating large numbers of 
> destinations in parallel, and provided thread dumps that pointed to lots of 
> threads contending for AbstractRegion.destinationsLock.
> AbstractRegion has lots of places where we do something like this:
> 455        destinationsLock.readLock().lock();
> 456        try {
> 457            dest = destinations.get(destination);
> 458        } finally {
> 459            destinationsLock.readLock().unlock();
> 460        }
> destinations is a ConcurrentHashMap, so it's already thread-safe.  Why are we 
> using a single external lock around a ConcurrentHashMap that would be 
> concurrent if we weren't making it single-locked???
> I suspect that the primary goal is to make sure that addDestination() and 
> receiveDestination() don't create or remove the same destination twice, but 
> there are other ways to do that (for example, having the map be 
> ConcurrentHashMap<ActiveMQDestination, AtomicReference<Destination>> and 
> putting the AtomicReference into the map immediately and then later 
> populating the reference once the object is constructed).
> We need to eliminate this singleton lock and use the thread-safe 
> ConcurrentHashMap's own locking, possibly coupled with thread-safe objects 
> (AtomicReference, etc.) and/or explicit per-key locking, to implement the 
> same algorithm in a way that allows reasonable parallelism under heavy load.
> NOTE: This might also help eliminate AMQ-5901.



--
This message was sent by Atlassian Jira
(v8.3.4#803005)

Reply via email to