[
https://issues.apache.org/jira/browse/AMQ-5875?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14622413#comment-14622413
]
Gary Tully commented on AMQ-5875:
---------------------------------
thanks for the fast patch.
I am not sure we need another method because I think there should be enough
there with org.apache.activemq.broker.Broker#getDurableDestinations
org.apache.activemq.broker.Broker#getDestinations
and:
org.apache.activemq.broker.region.DestinationFactory#getAllDurableSubscriptions
The difficult bit is tying down the usage to the correct method and ensuring
consistency with the impls across the stores.
the network bridge only wants to create demand when
org.apache.activemq.broker.region.DestinationFactory#getAllDurableSubscriptions
is non empty, I think maybe it needs to use that method and maybe then the
isEmpty check is negated and that method in kahadb can be more in line with
others.
I need to research where that isEmpty check came from.
> 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
> Assignee: Gary Tully
> 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)