You are viewing a plain text version of this content. The canonical link for it is here.
Posted to oak-commits@jackrabbit.apache.org by mr...@apache.org on 2022/01/27 13:13:48 UTC

[jackrabbit-oak] branch 1.8 updated: OAK-9668 Update H2DB dependency (#466)

This is an automated email from the ASF dual-hosted git repository.

mreutegg pushed a commit to branch 1.8
in repository https://gitbox.apache.org/repos/asf/jackrabbit-oak.git


The following commit(s) were added to refs/heads/1.8 by this push:
     new f63b658  OAK-9668 Update H2DB dependency (#466)
     new 8158428  Merge pull request #475 from mreutegg/OAK-9668-1.8
f63b658 is described below

commit f63b6580d43eba09da41ef39e580df0ca8db67b4
Author: Thomas Mueller <th...@apache.org>
AuthorDate: Tue Jan 18 18:43:33 2022 +0100

    OAK-9668 Update H2DB dependency (#466)
    
    * OAK-9668 Update H2DB dependency
    
    * OAK-9668: Update H2DB dependency
    
    Update dependency to 2.0.206
    
    * OAK-9668 : move cast and binarySearch to DataTypeUtil
    
    * OAK-9668: Update H2DB dependency
    
    Use 1MB block size for test with RDBBlobStore on H2
    
    * OAK-9668: Update H2DB dependency
    
    Revert change of expected size. Disable test instead on H2
    
    Co-authored-by: Marcel Reutegger <ma...@gmail.com>
    Co-authored-by: Stefan Egli <st...@apache.org>
    (cherry picked from commit 8c1b628fdb6b8b7317e68dac42a9b26cce2f565a)
---
 oak-parent/pom.xml                                 |  2 +-
 .../run/osgi/DocumentNodeStoreConfigTest.groovy    |  4 ++
 .../document/persistentCache/DataTypeUtil.java     | 61 ++++++++++++++++++++++
 .../document/persistentCache/KeyDataType.java      | 29 +++++++---
 .../document/persistentCache/ValueDataType.java    | 27 ++++++++--
 .../plugins/document/blob/RDBBlobStoreTest.java    |  6 +++
 .../document/persistentCache/CacheTest.java        |  2 +
 7 files changed, 119 insertions(+), 12 deletions(-)

diff --git a/oak-parent/pom.xml b/oak-parent/pom.xml
index 825985b..8faea46 100644
--- a/oak-parent/pom.xml
+++ b/oak-parent/pom.xml
@@ -55,7 +55,7 @@
     <slf4j.api.version>1.7.32</slf4j.api.version>
     <slf4j.version>1.7.32</slf4j.version> <!-- sync with logback version -->
     <logback.version>1.2.10</logback.version>
-    <h2.version>1.4.194</h2.version>
+    <h2.version>2.0.206</h2.version>
     <guava.version>15.0</guava.version>
     <tika.version>1.24</tika.version>
     <derby.version>10.14.2.0</derby.version>
diff --git a/oak-pojosr/src/test/groovy/org/apache/jackrabbit/oak/run/osgi/DocumentNodeStoreConfigTest.groovy b/oak-pojosr/src/test/groovy/org/apache/jackrabbit/oak/run/osgi/DocumentNodeStoreConfigTest.groovy
index cdbd8ec..6783432 100644
--- a/oak-pojosr/src/test/groovy/org/apache/jackrabbit/oak/run/osgi/DocumentNodeStoreConfigTest.groovy
+++ b/oak-pojosr/src/test/groovy/org/apache/jackrabbit/oak/run/osgi/DocumentNodeStoreConfigTest.groovy
@@ -28,6 +28,7 @@ import org.apache.jackrabbit.oak.plugins.document.DocumentStoreStatsMBean
 import org.apache.jackrabbit.oak.plugins.document.MongoUtils
 import org.apache.jackrabbit.oak.plugins.document.mongo.MongoBlobStore
 import org.apache.jackrabbit.oak.plugins.document.util.MongoConnection
+import org.apache.jackrabbit.oak.spi.blob.AbstractBlobStore
 import org.apache.jackrabbit.oak.spi.blob.BlobStore
 import org.apache.jackrabbit.oak.spi.blob.GarbageCollectableBlobStore
 import org.apache.jackrabbit.oak.spi.blob.MemoryBlobStore
@@ -70,6 +71,9 @@ class DocumentNodeStoreConfigTest extends AbstractRepositoryFactoryTest {
         ])
 
         DocumentNodeStore ns = getServiceWithWait(NodeStore.class)
+        // OAK-9668: H2 2.0.206 has a limit of 1MB for BINARY VARYING
+        AbstractBlobStore blobStore = getServiceWithWait(BlobStore.class)
+        blobStore.setBlockSize(1024 * 1024)
 
         //3. Check that DS contains tables from both RDBBlobStore and RDBDocumentStore
         assert getExistingTables(ds).containsAll(['NODES', 'DATASTORE_META'])
diff --git a/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/persistentCache/DataTypeUtil.java b/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/persistentCache/DataTypeUtil.java
new file mode 100644
index 0000000..2444544
--- /dev/null
+++ b/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/persistentCache/DataTypeUtil.java
@@ -0,0 +1,61 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.jackrabbit.oak.plugins.document.persistentCache;
+
+import org.h2.mvstore.type.DataType;
+
+/**
+ * Utility class to write various types to a buffer and read it back again.
+ */
+class DataTypeUtil {
+
+    /**
+     * Cast the storage object to an array of type T.
+     *
+     * @param storage the storage object
+     * @return the array
+     */
+    static Object[] cast(Object storage) {
+        return (Object[])storage;
+    }
+
+    static int binarySearch(DataType<Object> dataType, Object key, Object storageObj, int size, int initialGuess) {
+        Object[] storage = cast(storageObj);
+        int low = 0;
+        int high = size - 1;
+        // the cached index minus one, so that
+        // for the first time (when cachedCompare is 0),
+        // the default value is used
+        int x = initialGuess - 1;
+        if (x < 0 || x > high) {
+            x = high >>> 1;
+        }
+        while (low <= high) {
+            int compare = dataType.compare(key, storage[x]);
+            if (compare > 0) {
+                low = x + 1;
+            } else if (compare < 0) {
+                high = x - 1;
+            } else {
+                return x;
+            }
+            x = (low + high) >>> 1;
+        }
+        return ~low;
+    }
+
+}
diff --git a/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/persistentCache/KeyDataType.java b/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/persistentCache/KeyDataType.java
index d6a3789..b266973 100644
--- a/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/persistentCache/KeyDataType.java
+++ b/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/persistentCache/KeyDataType.java
@@ -16,6 +16,8 @@
  */
 package org.apache.jackrabbit.oak.plugins.document.persistentCache;
 
+import static org.apache.jackrabbit.oak.plugins.document.persistentCache.DataTypeUtil.cast;
+
 import java.nio.ByteBuffer;
 
 import org.apache.jackrabbit.oak.cache.CacheValue;
@@ -23,7 +25,7 @@ import org.h2.mvstore.WriteBuffer;
 import org.h2.mvstore.type.DataType;
 import org.h2.mvstore.type.StringDataType;
 
-public class KeyDataType implements DataType {
+public class KeyDataType implements DataType<Object> {
     
     private final CacheType type;
     
@@ -54,17 +56,32 @@ public class KeyDataType implements DataType {
     }
 
     @Override
-    public void write(WriteBuffer buff, Object[] obj, int len, boolean key) {
+    public void write(WriteBuffer buff, Object storage, int len) {
         for (int i = 0; i < len; i++) {
-            write(buff, obj[i]);
+            write(buff, cast(storage)[i]);
         }
     }
 
     @Override
-    public void read(ByteBuffer buff, Object[] obj, int len, boolean key) {
+    public void read(ByteBuffer buff, Object storage, int len) {
         for (int i = 0; i < len; i++) {
-            obj[i] = read(buff);
+            cast(storage)[i] = read(buff);
         }
     }
-    
+
+    @Override
+    public int binarySearch(Object key, Object storage, int size, int initialGuess) {
+        return DataTypeUtil.binarySearch(this, key, storage, size, initialGuess);
+    }
+
+    @Override
+    public boolean isMemoryEstimationAllowed() {
+        return true;
+    }
+
+    @Override
+    public Object[] createStorage(int size) {
+        return new Object[size];
+    }
+
 }
\ No newline at end of file
diff --git a/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/persistentCache/ValueDataType.java b/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/persistentCache/ValueDataType.java
index a0080eb..3965327 100644
--- a/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/persistentCache/ValueDataType.java
+++ b/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/persistentCache/ValueDataType.java
@@ -16,6 +16,8 @@
  */
 package org.apache.jackrabbit.oak.plugins.document.persistentCache;
 
+import static org.apache.jackrabbit.oak.plugins.document.persistentCache.DataTypeUtil.cast;
+
 import java.nio.ByteBuffer;
 
 import org.apache.jackrabbit.oak.cache.CacheValue;
@@ -25,7 +27,7 @@ import org.h2.mvstore.WriteBuffer;
 import org.h2.mvstore.type.DataType;
 import org.h2.mvstore.type.StringDataType;
 
-public class ValueDataType implements DataType {
+public class ValueDataType implements DataType<Object> {
     
     private final DocumentNodeStore docNodeStore;
     private final DocumentStore docStore;
@@ -62,17 +64,32 @@ public class ValueDataType implements DataType {
     }
 
     @Override
-    public void write(WriteBuffer buff, Object[] obj, int len, boolean key) {
+    public void write(WriteBuffer buff, Object storage, int len) {
         for (int i = 0; i < len; i++) {
-            write(buff, obj[i]);
+            write(buff, cast(storage)[i]);
         }
     }
 
     @Override
-    public void read(ByteBuffer buff, Object[] obj, int len, boolean key) {
+    public void read(ByteBuffer buff, Object storage, int len) {
         for (int i = 0; i < len; i++) {
-            obj[i] = read(buff);
+            cast(storage)[i] = read(buff);
         }
     }
     
+    @Override
+    public int binarySearch(Object key, Object storage, int size, int initialGuess) {
+        return DataTypeUtil.binarySearch(this, key, storage, size, initialGuess);
+    }
+
+    @Override
+    public boolean isMemoryEstimationAllowed() {
+        return true;
+    }
+
+    @Override
+    public Object[] createStorage(int size) {
+        return new Object[size];
+    }
+
 }
\ No newline at end of file
diff --git a/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/blob/RDBBlobStoreTest.java b/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/blob/RDBBlobStoreTest.java
index 542d4aa..fdc2b42 100644
--- a/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/blob/RDBBlobStoreTest.java
+++ b/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/blob/RDBBlobStoreTest.java
@@ -19,6 +19,7 @@ package org.apache.jackrabbit.oak.plugins.document.blob;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
+import static org.junit.Assume.assumeTrue;
 
 import java.io.IOException;
 import java.security.MessageDigest;
@@ -76,6 +77,7 @@ public class RDBBlobStoreTest extends AbstractBlobStoreTest {
         return result;
     }
 
+    private RDBBlobStoreFixture fixture;
     private RDBBlobStore blobStore;
     private String blobStoreName;
     private RDBDataSourceWrapper dsw;
@@ -83,6 +85,7 @@ public class RDBBlobStoreTest extends AbstractBlobStoreTest {
     private static final Logger LOG = LoggerFactory.getLogger(RDBBlobStoreTest.class);
 
     public RDBBlobStoreTest(RDBBlobStoreFixture bsf) {
+        fixture = bsf;
         blobStore = bsf.createRDBBlobStore();
         blobStoreName = bsf.getName();
         dsw = bsf.getDataSource();
@@ -118,6 +121,9 @@ public class RDBBlobStoreTest extends AbstractBlobStoreTest {
 
     @Test
     public void testBigBlob() throws Exception {
+        // OAK-9668: H2 has a limit of 1MB for BINARY VARYING
+        assumeTrue(fixture != RDBBlobStoreFixture.RDB_H2);
+
         int min = 0;
         int max = 8 * 1024 * 1024;
         int test = 0;
diff --git a/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/persistentCache/CacheTest.java b/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/persistentCache/CacheTest.java
index f114d21..70c23b8 100644
--- a/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/persistentCache/CacheTest.java
+++ b/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/persistentCache/CacheTest.java
@@ -38,6 +38,7 @@ import org.apache.jackrabbit.oak.plugins.document.RevisionVector;
 import org.apache.jackrabbit.oak.plugins.document.util.StringValue;
 import org.apache.jackrabbit.oak.spi.blob.BlobStore;
 import org.apache.jackrabbit.oak.spi.blob.MemoryBlobStore;
+import org.junit.Ignore;
 import org.junit.Test;
 import org.slf4j.event.Level;
 
@@ -131,6 +132,7 @@ public class CacheTest {
     }
     
     @Test
+    @Ignore
     public void interrupt() throws Exception {
         FileUtils.deleteDirectory(new File("target/cacheTest"));
         PersistentCache cache = new PersistentCache("target/cacheTest,size=1,-compress");