Gary Tully created AMQ-4118:
-------------------------------

             Summary: Index page overflow (when a value does not fit in a page) 
can lead to duplicate calls to free
                 Key: AMQ-4118
                 URL: https://issues.apache.org/jira/browse/AMQ-4118
             Project: ActiveMQ
          Issue Type: Bug
          Components: Message Store
    Affects Versions: 5.7.0, 5.6.0
            Reporter: Gary Tully
            Assignee: Gary Tully
             Fix For: 5.8.0


An overflowed chain is release when it is no longer needed, but the new end 
page was not stored in the cache, the old value as a part page is reused and 
freed again. boom. Keeping the cache in sync sorts this.
A workaround is to disable the index page cache with a small indexCacheSize.
Durable subs make this more visible, but the failure symptoms vary with usage. 
A typical scenario is a classcast when the page is reused in the wrong context 
or a npe when the free page is loaded from disk.
With durable subs with selectors and large backlogs, the sequence set expansion 
and shrinkage produces values that can overflow easily. This scenario produced 
a nice test.

Some resultant stack traces that are symptomatic:
{code}2012-10-19 22:25:11,928 [exPageUsage#5-2] - ERROR MessageDatabase         
       - KahaDB failed to store to Journal
java.io.EOFException: Chunk stream does not exist, page: 1344 is marked free
        at org.apache.kahadb.page.Transaction$2.readPage(Transaction.java:481)
        at org.apache.kahadb.page.Transaction$2.<init>(Transaction.java:458)
        at 
org.apache.kahadb.page.Transaction.openInputStream(Transaction.java:455)
        at org.apache.kahadb.page.Transaction.load(Transaction.java:431)
        at org.apache.kahadb.page.Transaction.load(Transaction.java:388)
        at org.apache.kahadb.index.BTreeIndex.loadNode(BTreeIndex.java:262)
        at org.apache.kahadb.index.BTreeNode.getChild(BTreeNode.java:225)
        at org.apache.kahadb.index.BTreeNode.getLeafNode(BTreeNode.java:680)
        at org.apache.kahadb.index.BTreeNode.get(BTreeNode.java:562)
        at org.apache.kahadb.index.BTreeIndex.get(BTreeIndex.java:184)
        at 
org.apache.activemq.store.kahadb.MessageDatabase$MessageOrderIndex.get(MessageDatabase.java:2616)
        at 
org.apache.activemq.store.kahadb.MessageDatabase.updateIndex(MessageDatabase.java:1210)
        at 
org.apache.activemq.store.kahadb.MessageDatabase$15.execute(MessageDatabase.java:1002)
        at org.apache.kahadb.page.Transaction.execute(Transaction.java:790)
        at 
org.apache.activemq.store.kahadb.MessageDatabase.process(MessageDatabase.java:1000)
        at 
org.apache.activemq.store.kahadb.MessageDatabase$13.visit(MessageDatabase.java:933)
        at 
org.apache.activemq.store.kahadb.data.KahaRemoveMessageCommand.visit(KahaRemoveMessageCommand.java:220)
        at 
org.apache.activemq.store.kahadb.MessageDatabase.process(MessageDatabase.java:925)
        at 
org.apache.activemq.store.kahadb.MessageDatabase.store(MessageDatabase.java:837)
        at 
org.apache.activemq.store.kahadb.MessageDatabase.store(MessageDatabase.java:819)
        at 
org.apache.activemq.store.kahadb.KahaDBStore$KahaDBTopicMessageStore.doAcknowledge(KahaDBStore.java:723)
        at 
org.apache.activemq.store.kahadb.KahaDBStore$KahaDBTopicMessageStore.acknowledge(KahaDBStore.java:706)
        at 
org.apache.activemq.store.kahadb.KahaDBTransactionStore.acknowledge(KahaDBTransactionStore.java:519)
        at 
org.apache.activemq.store.kahadb.KahaDBTransactionStore$2.acknowledge(KahaDBTransactionStore.java:222)
        at org.apache.activemq.broker.region.Topic.acknowledge(Topic.java:528)
        at 
org.apache.activemq.broker.region.DurableTopicSubscription.acknowledge(DurableTopicSubscription.java:279)
        at ..{code}
{code}java.lang.ClassCastException: java.lang.Long cannot be cast to 
java.lang.String
        at java.lang.String.compareTo(String.java:92)
        at java.util.Arrays.binarySearch0(Arrays.java:2001)
        at java.util.Arrays.binarySearch(Arrays.java:1943)
        at org.apache.kahadb.index.BTreeNode.put(BTreeNode.java:371)
        at org.apache.kahadb.index.BTreeNode.put(BTreeNode.java:369)       
        at org.apache.kahadb.index.BTreeIndex.put(BTreeIndex.java:189)        
at 
org.apache.activemq.store.kahadb.MessageDatabase$MessageOrderIndex.put(MessageDatabase.java:2592)
        at 
org.apache.activemq.store.kahadb.MessageDatabase.upadateIndex(MessageDatabase.java:1168)
        at 
org.apache.activemq.store.kahadb.MessageDatabase$AddOpperation.execute(MessageDatabase.java:2082)
        at 
org.apache.activemq.store.kahadb.MessageDatabase$18.execute(MessageDatabase.java:1095)
        at org.apache.kahadb.page.Transaction.execute(Transaction.java:768)
        at 
org.apache.activemq.store.kahadb.MessageDatabase.process(MessageDatabase.java:1092)
        at 
org.apache.activemq.store.kahadb.MessageDatabase$13.visit(MessageDatabase.java:961)
        at 
org.apache.activemq.store.kahadb.data.KahaCommitCommand.visit(KahaCommitCommand.java:130)
        at 
org.apache.activemq.store.kahadb.MessageDatabase.process(MessageDatabase.java:943)
        at 
org.apache.activemq.store.kahadb.MessageDatabase.store(MessageDatabase.java:855)
        at 
org.apache.activemq.store.kahadb.KahaDBTransactionStore.commit(KahaDBTransactionStore.java:267)
        at 
org.apache.activemq.transaction.XATransaction.storeCommit(XATransaction.java:85)
...{code}
{code}java.lang.NullPointerException
        at org.apache.kahadb.index.BTreeIndex.loadNode(BTreeIndex.java:264)
        at org.apache.kahadb.index.BTreeNode.getChild(BTreeNode.java:225)
        at org.apache.kahadb.index.BTreeNode.getLeafNode(BTreeNode.java:676)
        at org.apache.kahadb.index.BTreeNode.put(BTreeNode.java:369)
        at org.apache.kahadb.index.BTreeIndex.put(BTreeIndex.java:189)
        at 
org.apache.activemq.store.kahadb.MessageDatabase$MessageOrderIndex.put(MessageDatabase.java:2592)
        at 
org.apache.activemq.store.kahadb.MessageDatabase.upadateIndex(MessageDatabase.java:1168)
        at 
org.apache.activemq.store.kahadb.MessageDatabase$AddOpperation.execute(MessageDatabase.java:2082)
        at 
org.apache.activemq.store.kahadb.MessageDatabase$18.execute(MessageDatabase.java:1095)
        at org.apache.kahadb.page.Transaction.execute(Transaction.java:768)
        at 
org.apache.activemq.store.kahadb.MessageDatabase.process(MessageDatabase.java:1092)
        at 
org.apache.activemq.store.kahadb.MessageDatabase$13.visit(MessageDatabase.java:961)
        at 
org.apache.activemq.store.kahadb.data.KahaCommitCommand.visit(KahaCommitCommand.java:130)
        at 
org.apache.activemq.store.kahadb.MessageDatabase.process(MessageDatabase.java:943)
        at 
org.apache.activemq.store.kahadb.MessageDatabase.store(MessageDatabase.java:855)
        at 
org.apache.activemq.store.kahadb.KahaDBTransactionStore.commit(KahaDBTransactionStore.java:267){code}

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira

Reply via email to