Repository: activemq Updated Branches: refs/heads/master fb1e642c1 -> 8a1abd9bb
AMQ-7084 - ensure allocated and unused free pages are visible to subsequent transactions, fix and test with test updates to reflect proper usage Project: http://git-wip-us.apache.org/repos/asf/activemq/repo Commit: http://git-wip-us.apache.org/repos/asf/activemq/commit/8a1abd9b Tree: http://git-wip-us.apache.org/repos/asf/activemq/tree/8a1abd9b Diff: http://git-wip-us.apache.org/repos/asf/activemq/diff/8a1abd9b Branch: refs/heads/master Commit: 8a1abd9bb2744de70af11053f1755116c40ec55f Parents: fb1e642 Author: gtully <[email protected]> Authored: Tue Oct 23 16:00:57 2018 +0100 Committer: gtully <[email protected]> Committed: Tue Oct 23 16:00:57 2018 +0100 ---------------------------------------------------------------------- .../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 | 23 +++++++++++++++++++- 6 files changed, 35 insertions(+), 14 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/activemq/blob/8a1abd9b/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/8a1abd9b/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/8a1abd9b/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/8a1abd9b/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/8a1abd9b/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/8a1abd9b/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 0f919f2..3a5cefd 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 @@ -136,7 +136,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); @@ -240,4 +239,26 @@ public class PageFileTest extends TestCase { pf2.unload(); } } + + 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); + + } }
