There's been a lot of re-work on the FilePendingMessageCursor (and other areas that you touched here) since release 5.4.2 (which is about 2 yrs old). Do you have the possibility to check with a later version of the code to see if that's been fixed for you?
On Mon, Dec 17, 2012 at 6:36 AM, Tom Martinec <marti...@d3s.mff.cuni.cz>wrote: > Hello, > > I fixed the issue on my own. Here is the list of things I have done: > > 1 - On the line 219 of > > http://svn.apache.org/viewvc/activemq/tags/activemq-5.4.2/activemq-core/src/main/java/org/apache/activemq/broker/region/cursors/FilePendingMessageCursor.java?view=markup > I unlocked the messagesLock that was created in the queue. I have done > that, > because the writer thread waits for free space, but the consumers are > locked > waiting until the writer thread releases the lock. > > boolean spaceAvailable = waitForTempSpace(maxWaitTime); > > if (spaceAvailable) { > ByteSequence bs = getByteSequence(node.getMessage()); > getDiskList().addLast(node.getMessageId().toString(), > bs); > return true; > } > return false; > > protected boolean waitForTempSpace(long maxWaitTime) throws > InterruptedException { > if (cursorLock != null) { > cursorLock.writeLock().unlock(); > } > > boolean freeSpaceAvailable = > systemUsage.getTempUsage().waitForSpace(maxWaitTime); > > if (cursorLock != null) { > cursorLock.writeLock().lock(); > } > > return freeSpaceAvailable; > } > > 2 - The writer and consumer threads are also synchronized on the object of > the cursor. So the step 1) was not enough. IMHO only one of the > synchronized > primitive should be used. I decided to keep the RW lock that was created > inside the Queue class. By the way, the advantage of RW locks seemed to > never be used because of the second synchronization mechanism. This > basically required to remove the "synchronized" keywords from the cursors > and replace them by the RW lock from outside where the sync was still > needed. > > 3 - There was yet another deadlock looking behaviour. The > TempUsage.retrieveUsage() worked with full preallocated size of kahadb > storage, so the storage was always considered full. I extended the kahadb > interface to provide the count of free bytes in the PListStore and not just > its size. > > Since then the ActiveMQ has been be working fine with no deadlocks. Note, > that I use the ActiveMQ only in a simple Queuing scenario, so I could have > broken something else by this change. > > > > > -- > View this message in context: > http://activemq.2283324.n4.nabble.com/Activemq-5-4-2-hangs-when-the-temp-disk-usage-is-used-tp4660202p4660746.html > Sent from the ActiveMQ - User mailing list archive at Nabble.com. > -- *Christian Posta* http://www.christianposta.com/blog twitter: @christianposta