You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@activemq.apache.org by "Gary Tully (JIRA)" <ji...@apache.org> on 2015/07/10 13:50:04 UTC

[jira] [Reopened] (AMQ-5875) Removing a destination when using mKahaDB can cause an IllegalStateException

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

Gary Tully reopened AMQ-5875:
-----------------------------
    Regression: Unit Test Broken

there is logic in a network bridge to recreate durable demand eagerly. It uses the getDestinations list to figure of there was demand in the past. So a topic with some durable subscribers.
It appears that it is now re-creating demand for topics that have no durables. Something needs to gate that, or the other use case needs a different fix.

Test that shows the problem in a not so obvious way:
org.apache.activemq.usecases.ThreeBrokerVirtualTopicNetworkTest#testNetworkVirtualTopic


This needs a little revisit - but it turns out there were some negative consequences :-)

> Removing a destination when using mKahaDB can cause an IllegalStateException
> ----------------------------------------------------------------------------
>
>                 Key: AMQ-5875
>                 URL: https://issues.apache.org/jira/browse/AMQ-5875
>             Project: ActiveMQ
>          Issue Type: Bug
>          Components: Broker
>    Affects Versions: 5.11.1
>            Reporter: Christopher L. Shannon
>             Fix For: 5.12.0
>
>         Attachments: MultiKahaDBDeletionTest.java
>
>
> This issue occurs when using multiKahaDB and a wild card destination.  The problem is that with a wild card topic, multiple destinations can be attached to the same store.  If one of the destinations is deleted and the other destinations are empty, the entire store is deleted.  This causes an exception later on if trying to do something like subscribe to a destination that wasn't deleted.  I've attached a test case to show this issue.  
> The problem seems to be that the removeMessageStore method in MultiKahaDBPersistenceAdapter relies on adapter.getDestinations.isEmpty() to determine whether the store is eligible for deleting.  Unfortunately, the getDestinations method in KahaDBStore excludes destinations that are empty therefore the method doesn't return any destinations even though there is one still attached to the store so the logic goes ahead and deletes the store.
> The stack trace from running against 5.12.0-SNAPSHOT is below:
> {noformat}
> java.lang.IllegalStateException: PageFile is not loaded
>         at org.apache.activemq.store.kahadb.disk.page.PageFile.assertLoaded(PageFile.java:811)
>         at org.apache.activemq.store.kahadb.disk.page.PageFile.tx(PageFile.java:304)
>         at org.apache.activemq.store.kahadb.KahaDBStore$KahaDBTopicMessageStore.getMessageCount(KahaDBStore.java:866)
>         at org.apache.activemq.store.ProxyTopicMessageStore.getMessageCount(ProxyTopicMessageStore.java:140)
>         at org.apache.activemq.store.ProxyTopicMessageStore.getMessageCount(ProxyTopicMessageStore.java:140)
>         at org.apache.activemq.broker.region.cursors.TopicStorePrefetch.getStoreSize(TopicStorePrefetch.java:97)
>         at org.apache.activemq.broker.region.cursors.AbstractStoreCursor.resetSize(AbstractStoreCursor.java:73)
>         at org.apache.activemq.broker.region.cursors.TopicStorePrefetch.<init>(TopicStorePrefetch.java:58)
>         at org.apache.activemq.broker.region.cursors.StoreDurableSubscriberCursor.add(StoreDurableSubscriberCursor.java:119)
>         at org.apache.activemq.broker.region.PrefetchSubscription.add(PrefetchSubscription.java:584)
>         at org.apache.activemq.broker.region.DurableTopicSubscription.add(DurableTopicSubscription.java:113)
>         at org.apache.activemq.broker.region.Topic.addSubscription(Topic.java:161)
>         at org.apache.activemq.broker.region.AbstractRegion.addConsumer(AbstractRegion.java:400)
>         at org.apache.activemq.broker.region.TopicRegion.addConsumer(TopicRegion.java:168)
>         at org.apache.activemq.broker.region.RegionBroker.addConsumer(RegionBroker.java:427)
>         at org.apache.activemq.broker.jmx.ManagedRegionBroker.addConsumer(ManagedRegionBroker.java:244)
>         at org.apache.activemq.broker.BrokerFilter.addConsumer(BrokerFilter.java:102)
>         at org.apache.activemq.advisory.AdvisoryBroker.addConsumer(AdvisoryBroker.java:107)
>         at org.apache.activemq.broker.BrokerFilter.addConsumer(BrokerFilter.java:102)
>         at org.apache.activemq.broker.BrokerFilter.addConsumer(BrokerFilter.java:102)
>         at org.apache.activemq.broker.MutableBrokerFilter.addConsumer(MutableBrokerFilter.java:107)
>         at org.apache.activemq.broker.TransportConnection.processAddConsumer(TransportConnection.java:667)
>         at org.apache.activemq.command.ConsumerInfo.visit(ConsumerInfo.java:348)
>         at org.apache.activemq.broker.TransportConnection.service(TransportConnection.java:334)
>         at org.apache.activemq.broker.TransportConnection$1.onCommand(TransportConnection.java:188)
>         at org.apache.activemq.transport.MutexTransport.onCommand(MutexTransport.java:50)
>         at org.apache.activemq.transport.WireFormatNegotiator.onCommand(WireFormatNegotiator.java:113)
>         at org.apache.activemq.transport.AbstractInactivityMonitor.onCommand(AbstractInactivityMonitor.java:300)
>         at org.apache.activemq.transport.TransportSupport.doConsume(TransportSupport.java:83)
>         at org.apache.activemq.transport.tcp.TcpTransport.doRun(TcpTransport.java:214)
>         at org.apache.activemq.transport.tcp.TcpTransport.run(TcpTransport.java:196)
>         at java.lang.Thread.run(Thread.java:745)
> {noformat}



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)