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 md...@apache.org on 2015/07/13 15:57:33 UTC

svn commit: r1690672 - in /jackrabbit/oak/trunk/oak-core/src: main/java/org/apache/jackrabbit/oak/cache/ main/java/org/apache/jackrabbit/oak/plugins/blob/ main/java/org/apache/jackrabbit/oak/plugins/blob/datastore/ main/java/org/apache/jackrabbit/oak/p...

Author: mduerig
Date: Mon Jul 13 13:57:33 2015
New Revision: 1690672

URL: http://svn.apache.org/r1690672
Log:
OAK-3094: Potential ClassCastException with LIRS cache builder
- proper type parametrisation of LIRS cache builder.
- Remove test case as it fails at compile time already now

Modified:
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/cache/CacheLIRS.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/blob/CachingBlobStore.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/blob/datastore/DataStoreBlobStore.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/DocumentMK.java
    jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/persistentCache/CacheTest.java

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/cache/CacheLIRS.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/cache/CacheLIRS.java?rev=1690672&r1=1690671&r2=1690672&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/cache/CacheLIRS.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/cache/CacheLIRS.java Mon Jul 13 13:57:33 2015
@@ -1398,40 +1398,40 @@ public class CacheLIRS<K, V> implements
     /**
      * A builder for the cache.
      */
-    public static class Builder {
+    public static class Builder<K, V> {
         
-        private Weigher<?, ?> weigher;
+        private Weigher<K, V> weigher;
         private long maxWeight;
         private int averageWeight = 100;
         private int segmentCount = 16;
         private int stackMoveDistance = 16;
 
-        public Builder recordStats() {
+        public Builder<K, V> recordStats() {
             return this;
         }
 
-        public <K, V> Builder weigher(Weigher<K, V> weigher) {
+        public Builder<K, V> weigher(Weigher<K, V> weigher) {
             this.weigher = weigher;
             return this;
         }
 
-        public Builder maximumWeight(long maxWeight) {
+        public Builder<K, V> maximumWeight(long maxWeight) {
             this.maxWeight = maxWeight;
             return this;
         }
         
-        public Builder averageWeight(int averageWeight) {
+        public Builder<K, V> averageWeight(int averageWeight) {
             this.averageWeight = averageWeight;
             return this;
         }
         
-        public Builder maximumSize(int maxSize) {
+        public Builder<K, V> maximumSize(int maxSize) {
             this.maxWeight = maxSize;
             this.averageWeight = 1;
             return this;
         }
 
-        public Builder segmentCount(int segmentCount) {
+        public Builder<K, V> segmentCount(int segmentCount) {
             if (Integer.bitCount(segmentCount) != 1 || segmentCount < 0 || segmentCount > 65536) {
                 LOG.warn("Illegal segment count: " + segmentCount + ", using 16");
                 segmentCount = 16;
@@ -1440,7 +1440,7 @@ public class CacheLIRS<K, V> implements
             return this;
         }
 
-        public Builder stackMoveDistance(int stackMoveDistance) {
+        public Builder<K, V> stackMoveDistance(int stackMoveDistance) {
             if (stackMoveDistance < 0) {
                 LOG.warn("Illegal stack move distance: " + stackMoveDistance + ", using 16");
                 stackMoveDistance = 16;
@@ -1449,15 +1449,12 @@ public class CacheLIRS<K, V> implements
             return this;
         }
 
-        public <K, V> CacheLIRS<K, V> build() {
+        public CacheLIRS<K, V> build() {
             return build(null);
         }
         
-        public <K, V> CacheLIRS<K, V> build(
-                CacheLoader<K, V> cacheLoader) {
-            @SuppressWarnings("unchecked")
-            Weigher<K, V> w = (Weigher<K, V>) weigher;
-            return new CacheLIRS<K, V>(w, maxWeight, averageWeight, 
+        public CacheLIRS<K, V> build(CacheLoader<K, V> cacheLoader) {
+            return new CacheLIRS<K, V>(weigher, maxWeight, averageWeight,
                     segmentCount, stackMoveDistance, cacheLoader);
         }
 
@@ -1468,8 +1465,8 @@ public class CacheLIRS<K, V> implements
      * 
      * @return the builder
      */
-    public static Builder newBuilder() {
-        return new Builder();
+    public static <K, V> Builder<K, V> newBuilder() {
+        return new Builder<K, V>();
     }
 
     @Override

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/blob/CachingBlobStore.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/blob/CachingBlobStore.java?rev=1690672&r1=1690671&r2=1690672&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/blob/CachingBlobStore.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/blob/CachingBlobStore.java Mon Jul 13 13:57:33 2015
@@ -34,7 +34,7 @@ public abstract class CachingBlobStore e
 
     public CachingBlobStore(long cacheSize) {
         this.blobCacheSize = cacheSize;
-        cache = CacheLIRS.newBuilder().
+        cache = CacheLIRS.<String, byte[]>newBuilder().
                 maximumWeight(cacheSize).
                 averageWeight(getBlockSize() / 2).
                 weigher(new Weigher<String, byte[]>() {

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/blob/datastore/DataStoreBlobStore.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/blob/datastore/DataStoreBlobStore.java?rev=1690672&r1=1690671&r2=1690672&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/blob/datastore/DataStoreBlobStore.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/blob/datastore/DataStoreBlobStore.java Mon Jul 13 13:57:33 2015
@@ -19,6 +19,10 @@
 
 package org.apache.jackrabbit.oak.plugins.blob.datastore;
 
+import static com.google.common.base.Preconditions.checkNotNull;
+import static com.google.common.collect.Iterators.filter;
+import static com.google.common.collect.Iterators.transform;
+
 import java.io.BufferedInputStream;
 import java.io.ByteArrayInputStream;
 import java.io.File;
@@ -56,10 +60,6 @@ import org.apache.jackrabbit.oak.spi.blo
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import static com.google.common.base.Preconditions.checkNotNull;
-import static com.google.common.collect.Iterators.filter;
-import static com.google.common.collect.Iterators.transform;
-
 /**
  * BlobStore wrapper for DataStore. Wraps Jackrabbit 2 DataStore and expose them as BlobStores
  * It also handles inlining binaries if there size is smaller than
@@ -106,7 +106,7 @@ public class DataStoreBlobStore implemen
         this.delegate = delegate;
         this.encodeLengthInId = encodeLengthInId;
 
-        this.cache = CacheLIRS.newBuilder()
+        this.cache = CacheLIRS.<String, byte[]>newBuilder()
                 .maximumWeight(cacheSizeInMB * FileUtils.ONE_MB)
                 .weigher(new Weigher<String, byte[]>() {
                     @Override

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/DocumentMK.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/DocumentMK.java?rev=1690672&r1=1690671&r2=1690672&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/DocumentMK.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/DocumentMK.java Mon Jul 13 13:57:33 2015
@@ -16,6 +16,8 @@
  */
 package org.apache.jackrabbit.oak.plugins.document;
 
+import static com.google.common.base.Preconditions.checkArgument;
+
 import java.io.InputStream;
 import java.util.Set;
 import java.util.concurrent.Executor;
@@ -31,7 +33,6 @@ import com.google.common.cache.Weigher;
 import com.google.common.collect.Sets;
 import com.google.common.util.concurrent.MoreExecutors;
 import com.mongodb.DB;
-
 import org.apache.jackrabbit.oak.api.CommitFailedException;
 import org.apache.jackrabbit.oak.cache.CacheLIRS;
 import org.apache.jackrabbit.oak.cache.CacheValue;
@@ -59,8 +60,6 @@ import org.apache.jackrabbit.oak.stats.C
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import static com.google.common.base.Preconditions.checkArgument;
-
 /**
  * A JSON-based wrapper around the NodeStore implementation that stores the
  * data in a {@link DocumentStore}. It is used for testing purpose only.
@@ -917,8 +916,13 @@ public class DocumentMK {
                 useLirs = LIRS_CACHE;
             }
             if (useLirs) {
-                return CacheLIRS.newBuilder().
-                        weigher(weigher).
+                return CacheLIRS.<K, V>newBuilder().
+                        weigher(new Weigher<K, V>() {
+                            @Override
+                            public int weigh(K key, V value) {
+                                return weigher.weigh(key, value);
+                            }
+                        }).
                         averageWeight(2000).
                         maximumWeight(maxWeight).
                         segmentCount(cacheSegmentCount).

Modified: jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/persistentCache/CacheTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/persistentCache/CacheTest.java?rev=1690672&r1=1690671&r2=1690672&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/persistentCache/CacheTest.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/persistentCache/CacheTest.java Mon Jul 13 13:57:33 2015
@@ -27,38 +27,19 @@ import java.io.File;
 import java.io.FileOutputStream;
 import java.util.Random;
 
-import com.google.common.cache.Weigher;
+import com.google.common.cache.Cache;
 import org.apache.commons.io.FileUtils;
 import org.apache.jackrabbit.oak.cache.CacheLIRS;
-import org.apache.jackrabbit.oak.plugins.document.util.StringValue;
-
-import com.google.common.cache.Cache;
-
 import org.apache.jackrabbit.oak.plugins.document.PathRev;
 import org.apache.jackrabbit.oak.plugins.document.Revision;
+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;
 
 public class CacheTest {
 
     @Test
-    @Ignore("OAK-3094")  // FIXME OAK-3094
-    public void builder() {
-        CacheLIRS<Integer, String> cache = CacheLIRS.newBuilder()
-            .weigher(new Weigher<String, Integer>() {
-                @Override
-                public int weigh(String key, Integer value) {
-                    return 0;
-                }
-            })
-            .build();
-
-        cache.put(0, "s");
-    }
-
-    @Test
     public void recoverIfCorrupt() throws Exception {
         FileUtils.deleteDirectory(new File("target/cacheTest"));
         new File("target/cacheTest").mkdirs();