You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@activemq.apache.org by gt...@apache.org on 2012/08/01 13:22:48 UTC
svn commit: r1367924 - in /activemq/trunk:
activemq-core/src/test/java/org/apache/activemq/usecases/
kahadb/src/main/java/org/apache/kahadb/index/
kahadb/src/test/java/org/apache/kahadb/index/
Author: gtully
Date: Wed Aug 1 11:22:48 2012
New Revision: 1367924
URL: http://svn.apache.org/viewvc?rev=1367924&view=rev
Log:
https://issues.apache.org/jira/browse/AMQ-3956 - KahaDB pagefile (db.data) steady growth - BTreeIndex page leak. release the clild page when empty branch is promoted, additional tests
Modified:
activemq/trunk/activemq-core/src/test/java/org/apache/activemq/usecases/DurableSubscriptionOfflineTest.java
activemq/trunk/kahadb/src/main/java/org/apache/kahadb/index/BTreeNode.java
activemq/trunk/kahadb/src/test/java/org/apache/kahadb/index/BTreeIndexTest.java
Modified: activemq/trunk/activemq-core/src/test/java/org/apache/activemq/usecases/DurableSubscriptionOfflineTest.java
URL: http://svn.apache.org/viewvc/activemq/trunk/activemq-core/src/test/java/org/apache/activemq/usecases/DurableSubscriptionOfflineTest.java?rev=1367924&r1=1367923&r2=1367924&view=diff
==============================================================================
--- activemq/trunk/activemq-core/src/test/java/org/apache/activemq/usecases/DurableSubscriptionOfflineTest.java (original)
+++ activemq/trunk/activemq-core/src/test/java/org/apache/activemq/usecases/DurableSubscriptionOfflineTest.java Wed Aug 1 11:22:48 2012
@@ -762,15 +762,14 @@ public class DurableSubscriptionOfflineT
return;
}
- // fails for numMessages > 3000
- final int numMessages = 100;
+ final int numMessages = 2750;
KahaDBPersistenceAdapter kahaDBPersistenceAdapter = (KahaDBPersistenceAdapter)broker.getPersistenceAdapter();
PageFile pageFile = kahaDBPersistenceAdapter.getStore().getPageFile();
LOG.info("PageCount " + pageFile.getPageCount() + " f:" + pageFile.getFreePageCount() + ", fileSize:" + pageFile.getFile().length());
long lastDiff = 0;
- for (int repeats=0; repeats<4; repeats++) {
+ for (int repeats=0; repeats<2; repeats++) {
LOG.info("Iteration: "+ repeats + " Count:" + pageFile.getPageCount() + " f:" + pageFile.getFreePageCount());
@@ -801,7 +800,7 @@ public class DurableSubscriptionOfflineT
LOG.info("PageCount " + pageFile.getPageCount() + " f:" + pageFile.getFreePageCount() + " diff: " + (pageFile.getPageCount() - pageFile.getFreePageCount()) + " fileSize:" + pageFile.getFile().length());
if (lastDiff != 0) {
- assertEquals("Only use X pages per iteration", lastDiff, pageFile.getPageCount() - pageFile.getFreePageCount());
+ assertEquals("Only use X pages per iteration: " + repeats, lastDiff, pageFile.getPageCount() - pageFile.getFreePageCount());
}
lastDiff = pageFile.getPageCount() - pageFile.getFreePageCount();
}
Modified: activemq/trunk/kahadb/src/main/java/org/apache/kahadb/index/BTreeNode.java
URL: http://svn.apache.org/viewvc/activemq/trunk/kahadb/src/main/java/org/apache/kahadb/index/BTreeNode.java?rev=1367924&r1=1367923&r2=1367924&view=diff
==============================================================================
--- activemq/trunk/kahadb/src/main/java/org/apache/kahadb/index/BTreeNode.java (original)
+++ activemq/trunk/kahadb/src/main/java/org/apache/kahadb/index/BTreeNode.java Wed Aug 1 11:22:48 2012
@@ -282,7 +282,7 @@ public final class BTreeNode<Key,Value>
idx = idx < 0 ? -(idx + 1) : idx + 1;
BTreeNode<Key, Value> child = getChild(tx, idx);
if( child.getPageId() == index.getPageId() ) {
- throw new IOException("BTree corrupted: Cylce detected.");
+ throw new IOException("BTree corrupted: Cycle detected.");
}
Value rc = child.remove(tx, key);
@@ -293,6 +293,7 @@ public final class BTreeNode<Key,Value>
if( child.isBranch() ) {
// This is cause branches are never really empty.. they just go down to 1 child..
children[idx] = child.children[0];
+ tx.free(child.getPage());
} else {
// The child was a leaf. Then we need to actually remove it from this branch node..
@@ -508,7 +509,10 @@ public final class BTreeNode<Key,Value>
if( prefix.length()>0 && parent == null ) {
throw new IllegalStateException("Cycle back to root node detected.");
}
-
+ if (parent == null) {
+ prefix += "|";
+ out.println(prefix + getPageId());
+ }
if( isBranch() ) {
for(int i=0 ; i < children.length; i++) {
BTreeNode<Key, Value> child = getChild(tx, i);
Modified: activemq/trunk/kahadb/src/test/java/org/apache/kahadb/index/BTreeIndexTest.java
URL: http://svn.apache.org/viewvc/activemq/trunk/kahadb/src/test/java/org/apache/kahadb/index/BTreeIndexTest.java?rev=1367924&r1=1367923&r2=1367924&view=diff
==============================================================================
--- activemq/trunk/kahadb/src/test/java/org/apache/kahadb/index/BTreeIndexTest.java (original)
+++ activemq/trunk/kahadb/src/test/java/org/apache/kahadb/index/BTreeIndexTest.java Wed Aug 1 11:22:48 2012
@@ -25,6 +25,7 @@ import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.PrintWriter;
import java.text.NumberFormat;
+import java.util.Arrays;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
@@ -421,6 +422,51 @@ public class BTreeIndexTest extends Inde
tx.commit();
}
+ public void testIndexRepeatFillClearIncrementingPageReuse() throws Exception {
+ pf = new PageFile(directory, getClass().getName());
+ pf.setPageSize(4*1024);
+ pf.load();
+
+ tx = pf.tx();
+ long id = tx.allocate().getPageId();
+
+ BTreeIndex<Long, String> test = new BTreeIndex<Long, String>(pf, id);
+ test.setKeyMarshaller(LongMarshaller.INSTANCE);
+ test.setValueMarshaller(StringMarshaller.INSTANCE);
+ test.load(tx);
+ tx.commit();
+
+ final int count = 5000;
+ final int reps = 2;
+ final long[] diffs = new long[reps];
+ long keyVal = 0;
+ final String payload = new String(new byte[50]);
+
+ LOG.info("PF diff:" + (pf.getPageCount() - pf.getFreePageCount()) + " pc:" + pf.getPageCount() + " f:" + pf.getFreePageCount() );
+
+ for (int i=0; i<reps; i++) {
+
+ for (int j = 0; j < count; j++) {
+ tx = pf.tx();
+ test.put(tx, keyVal++, payload);
+ tx.commit();
+ }
+
+ tx = pf.tx();
+ for (long k = keyVal - count; k < keyVal; k++) {
+ test.remove(tx, k);
+ }
+ test.clear(tx);
+ tx.commit();
+ diffs[i] = pf.getPageCount() - pf.getFreePageCount();
+
+ LOG.info("PF diff:" + (pf.getPageCount() - pf.getFreePageCount()) + " pc:" + pf.getPageCount() + " f:" + pf.getFreePageCount());
+ }
+ for (int i=1; i<diffs.length; i++) {
+ assertEquals("diff is constant:" + Arrays.toString(diffs), diffs[0],diffs[i]);
+ }
+ }
+
public void testListIndexConsistancyOverTime() throws Exception {
final int NUM_ITERATIONS = 50;