Repository: activemq Updated Branches: refs/heads/activemq-5.15.x a549ee668 -> deb87353c
AMQ-7084 - ensure allocated and unused free pages are visible to subsequent transactions, fix and test with test updates to reflect proper usage (cherry picked from commit 8a1abd9bb2744de70af11053f1755116c40ec55f) Project: http://git-wip-us.apache.org/repos/asf/activemq/repo Commit: http://git-wip-us.apache.org/repos/asf/activemq/commit/deb87353 Tree: http://git-wip-us.apache.org/repos/asf/activemq/tree/deb87353 Diff: http://git-wip-us.apache.org/repos/asf/activemq/diff/deb87353 Branch: refs/heads/activemq-5.15.x Commit: deb87353c41a4bef41346d27b8c7ad4c1ab21bef Parents: a549ee6 Author: gtully <[email protected]> Authored: Tue Oct 23 16:00:57 2018 +0100 Committer: Christopher L. Shannon (cshannon) <[email protected]> Committed: Wed Nov 14 10:29:31 2018 -0500 ---------------------------------------------------------------------- .../store/kahadb/disk/page/Transaction.java | 4 ++++ .../store/kahadb/disk/index/BTreeIndexTest.java | 7 ++---- .../kahadb/disk/index/HashIndexBenchMark.java | 5 ++-- .../store/kahadb/disk/index/HashIndexTest.java | 5 ++-- .../store/kahadb/disk/index/ListIndexTest.java | 5 ++-- .../store/kahadb/disk/page/PageFileTest.java | 25 ++++++++++++++++++-- 6 files changed, 36 insertions(+), 15 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/activemq/blob/deb87353/activemq-kahadb-store/src/main/java/org/apache/activemq/store/kahadb/disk/page/Transaction.java ---------------------------------------------------------------------- diff --git a/activemq-kahadb-store/src/main/java/org/apache/activemq/store/kahadb/disk/page/Transaction.java b/activemq-kahadb-store/src/main/java/org/apache/activemq/store/kahadb/disk/page/Transaction.java index 3761a94..bdb7896 100644 --- a/activemq-kahadb-store/src/main/java/org/apache/activemq/store/kahadb/disk/page/Transaction.java +++ b/activemq-kahadb-store/src/main/java/org/apache/activemq/store/kahadb/disk/page/Transaction.java @@ -670,6 +670,8 @@ public class Transaction implements Iterable<Page> { allocateList.clear(); writes.clear(); writeTransactionId = -1; + } else { + freePages(allocateList); } size = 0; } @@ -692,6 +694,8 @@ public class Transaction implements Iterable<Page> { allocateList.clear(); writes.clear(); writeTransactionId = -1; + } else { + freePages(allocateList); } size = 0; } http://git-wip-us.apache.org/repos/asf/activemq/blob/deb87353/activemq-kahadb-store/src/test/java/org/apache/activemq/store/kahadb/disk/index/BTreeIndexTest.java ---------------------------------------------------------------------- diff --git a/activemq-kahadb-store/src/test/java/org/apache/activemq/store/kahadb/disk/index/BTreeIndexTest.java b/activemq-kahadb-store/src/test/java/org/apache/activemq/store/kahadb/disk/index/BTreeIndexTest.java index fa0c541..cd29471 100644 --- a/activemq-kahadb-store/src/test/java/org/apache/activemq/store/kahadb/disk/index/BTreeIndexTest.java +++ b/activemq-kahadb-store/src/test/java/org/apache/activemq/store/kahadb/disk/index/BTreeIndexTest.java @@ -57,11 +57,12 @@ public class BTreeIndexTest extends IndexTestSupport { protected Index<String, Long> createIndex() throws Exception { long id = tx.allocate().getPageId(); - tx.commit(); BTreeIndex<String, Long> index = new BTreeIndex<String,Long>(pf, id); index.setKeyMarshaller(StringMarshaller.INSTANCE); index.setValueMarshaller(LongMarshaller.INSTANCE); + index.load(tx); + tx.commit(); return index; } @@ -231,8 +232,6 @@ public class BTreeIndexTest extends IndexTestSupport { this.index.load(tx); long id = tx.allocate().getPageId(); - tx.commit(); - BTreeIndex<String, String> sindex = new BTreeIndex<String,String>(pf, id); sindex.setKeyMarshaller(StringMarshaller.INSTANCE); sindex.setValueMarshaller(StringMarshaller.INSTANCE); @@ -273,7 +272,6 @@ public class BTreeIndexTest extends IndexTestSupport { this.index.load(tx); long id = tx.allocate().getPageId(); - tx.commit(); BTreeIndex<String, String> sindex = new BTreeIndex<String,String>(pf, id); sindex.setKeyMarshaller(StringMarshaller.INSTANCE); @@ -364,7 +362,6 @@ public class BTreeIndexTest extends IndexTestSupport { pf.load(); tx = pf.tx(); long id = tx.allocate().getPageId(); - tx.commit(); BTreeIndex<Long, HashSet<String>> test = new BTreeIndex<Long, HashSet<String>>(pf, id); test.setKeyMarshaller(LongMarshaller.INSTANCE); http://git-wip-us.apache.org/repos/asf/activemq/blob/deb87353/activemq-kahadb-store/src/test/java/org/apache/activemq/store/kahadb/disk/index/HashIndexBenchMark.java ---------------------------------------------------------------------- diff --git a/activemq-kahadb-store/src/test/java/org/apache/activemq/store/kahadb/disk/index/HashIndexBenchMark.java b/activemq-kahadb-store/src/test/java/org/apache/activemq/store/kahadb/disk/index/HashIndexBenchMark.java index 16fa8b1..5667b01 100644 --- a/activemq-kahadb-store/src/test/java/org/apache/activemq/store/kahadb/disk/index/HashIndexBenchMark.java +++ b/activemq-kahadb-store/src/test/java/org/apache/activemq/store/kahadb/disk/index/HashIndexBenchMark.java @@ -27,12 +27,13 @@ public class HashIndexBenchMark extends IndexBenchmark { Transaction tx = pf.tx(); long id = tx.allocate().getPageId(); - tx.commit(); HashIndex<String, Long> index = new HashIndex<String, Long>(pf, id); index.setKeyMarshaller(StringMarshaller.INSTANCE); index.setValueMarshaller(LongMarshaller.INSTANCE); - + index.load(tx); + tx.commit(); + return index; } http://git-wip-us.apache.org/repos/asf/activemq/blob/deb87353/activemq-kahadb-store/src/test/java/org/apache/activemq/store/kahadb/disk/index/HashIndexTest.java ---------------------------------------------------------------------- diff --git a/activemq-kahadb-store/src/test/java/org/apache/activemq/store/kahadb/disk/index/HashIndexTest.java b/activemq-kahadb-store/src/test/java/org/apache/activemq/store/kahadb/disk/index/HashIndexTest.java index 8fbee56..d4b5e45 100644 --- a/activemq-kahadb-store/src/test/java/org/apache/activemq/store/kahadb/disk/index/HashIndexTest.java +++ b/activemq-kahadb-store/src/test/java/org/apache/activemq/store/kahadb/disk/index/HashIndexTest.java @@ -25,13 +25,12 @@ public class HashIndexTest extends IndexTestSupport { protected Index<String, Long> createIndex() throws Exception { long id = tx.allocate().getPageId(); - tx.commit(); - HashIndex<String, Long> index = new HashIndex<String,Long>(pf, id); index.setBinCapacity(12); index.setKeyMarshaller(StringMarshaller.INSTANCE); index.setValueMarshaller(LongMarshaller.INSTANCE); - + index.load(tx); + tx.commit(); return index; } http://git-wip-us.apache.org/repos/asf/activemq/blob/deb87353/activemq-kahadb-store/src/test/java/org/apache/activemq/store/kahadb/disk/index/ListIndexTest.java ---------------------------------------------------------------------- diff --git a/activemq-kahadb-store/src/test/java/org/apache/activemq/store/kahadb/disk/index/ListIndexTest.java b/activemq-kahadb-store/src/test/java/org/apache/activemq/store/kahadb/disk/index/ListIndexTest.java index fea1e7a..5e7cdcc 100644 --- a/activemq-kahadb-store/src/test/java/org/apache/activemq/store/kahadb/disk/index/ListIndexTest.java +++ b/activemq-kahadb-store/src/test/java/org/apache/activemq/store/kahadb/disk/index/ListIndexTest.java @@ -57,12 +57,11 @@ public class ListIndexTest extends IndexTestSupport { protected Index<String, Long> createIndex() throws Exception { long id = tx.allocate().getPageId(); - tx.commit(); - ListIndex<String, Long> index = new ListIndex<String, Long>(pf, id); index.setKeyMarshaller(StringMarshaller.INSTANCE); index.setValueMarshaller(LongMarshaller.INSTANCE); - + index.load(tx); + tx.commit(); return index; } http://git-wip-us.apache.org/repos/asf/activemq/blob/deb87353/activemq-kahadb-store/src/test/java/org/apache/activemq/store/kahadb/disk/page/PageFileTest.java ---------------------------------------------------------------------- diff --git a/activemq-kahadb-store/src/test/java/org/apache/activemq/store/kahadb/disk/page/PageFileTest.java b/activemq-kahadb-store/src/test/java/org/apache/activemq/store/kahadb/disk/page/PageFileTest.java index 178c8bc..e2e4ec5 100644 --- a/activemq-kahadb-store/src/test/java/org/apache/activemq/store/kahadb/disk/page/PageFileTest.java +++ b/activemq-kahadb-store/src/test/java/org/apache/activemq/store/kahadb/disk/page/PageFileTest.java @@ -142,7 +142,6 @@ public class PageFileTest extends TestCase { Transaction tx = pf.tx(); Page page = tx.allocate(); - tx.commit(); OutputStream pos = tx.openOutputStream(page, true); DataOutputStream os = new DataOutputStream(pos); @@ -227,7 +226,7 @@ public class PageFileTest extends TestCase { //Load a second instance on the same directory fo the page file which //simulates an unclean shutdown from the previous run - PageFile pf2 = new PageFile(new File("target/test-data"), getName()); + final PageFile pf2 = new PageFile(new File("target/test-data"), getName()); pf2.setEnableRecoveryFile(false); pf2.load(); try { @@ -247,6 +246,28 @@ public class PageFileTest extends TestCase { } } + public void testAllocatedAndUnusedAreFree() throws Exception { + + PageFile pf = new PageFile(new File("target/test-data"), getName()); + pf.delete(); + pf.load(); + + Transaction tx = pf.tx(); + tx.allocate(10); + tx.commit(); + + assertEquals(10, pf.getPageCount()); + assertEquals(pf.getFreePageCount(), 10); + + // free pages should get reused + + tx.allocate(10); + tx.rollback(); + assertEquals(10, pf.getPageCount()); + assertEquals(pf.getFreePageCount(), 10); + + } + public void testBackgroundRecoveryIsThreadSafe() throws Exception { PageFile pf = new PageFile(new File("target/test-data"), getName());
