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());

Reply via email to