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 2017/03/21 12:11:15 UTC

svn commit: r1787947 - in /jackrabbit/oak/trunk/oak-segment-tar/src: main/java/org/apache/jackrabbit/oak/segment/ main/java/org/apache/jackrabbit/oak/segment/file/ test/java/org/apache/jackrabbit/oak/segment/

Author: mduerig
Date: Tue Mar 21 12:11:14 2017
New Revision: 1787947

URL: http://svn.apache.org/viewvc?rev=1787947&view=rev
Log:
OAK-5954: Unify and simplify the deduplication caches
* Unified Cache interface for all deduplication caches.
* Remove cache accessors from FileStore and rely on the WriteCacheManager from the FileStoreBuilder instead.

Added:
    jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/Cache.java
Removed:
    jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/NodeCache.java
Modified:
    jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/RecordCache.java
    jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentNodeStoreService.java
    jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentWriter.java
    jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/WriterCacheManager.java
    jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/FileStore.java
    jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/FileStoreBuilder.java
    jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/NodeRecordTest.java
    jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/SegmentCompactionIT.java

Added: jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/Cache.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/Cache.java?rev=1787947&view=auto
==============================================================================
--- jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/Cache.java (added)
+++ jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/Cache.java Tue Mar 21 12:11:14 2017
@@ -0,0 +1,53 @@
+/*
+ * 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.segment;
+
+import javax.annotation.CheckForNull;
+import javax.annotation.Nonnull;
+
+/**
+ * Partial mapping of keys of type {@code K} to values of type {@link V}. If supported by the
+ * underlying implementation the mappings can further be associated with a cost, which is a
+ * metric for the cost occurring when the given mapping is lost. Higher values represent higher
+ * costs.
+ */
+public interface Cache<K, V> {
+
+    /**
+     * Add a mapping from {@code key} to {@code value}.
+     * @throws UnsupportedOperationException   if the underlying implementation doesn't
+     *         support values without an associated cost and {@link #put(Object, Object, byte)}
+     *         should be used instead.
+     */
+    void put(@Nonnull K key, @Nonnull V value);
+
+    /**
+     * Add a mapping from {@code key} to {@code value} with a given {@code cost}.
+     * @throws UnsupportedOperationException   if the underlying implementation doesn't
+     *         support values with an associated cost and {@link #put(Object, Object)}
+     *         should be used instead.
+     */
+    void put(@Nonnull K key, @Nonnull V value, byte cost);
+
+    /**
+     * @return  The mapping for {@code key}, or {@code null} if none.
+     */
+    @CheckForNull
+    V get(@Nonnull K key);
+}

Modified: jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/RecordCache.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/RecordCache.java?rev=1787947&r1=1787946&r2=1787947&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/RecordCache.java (original)
+++ jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/RecordCache.java Tue Mar 21 12:11:14 2017
@@ -24,7 +24,6 @@ import static com.google.common.base.Pre
 import java.util.LinkedHashMap;
 import java.util.Map;
 
-import javax.annotation.CheckForNull;
 import javax.annotation.Nonnull;
 
 import com.google.common.base.Supplier;
@@ -32,35 +31,29 @@ import com.google.common.cache.CacheStat
 import com.google.common.cache.Weigher;
 
 /**
- * Partial mapping of keys of type {@code T} to values of type {@link RecordId}. This is
+ * Partial mapping of keys of type {@code K} to values of type {@link RecordId}. This is
  * typically used for de-duplicating values that have already been persisted and thus
  * already have a {@code RecordId}.
- * @param <T>
+ * @param <K>
  */
-public abstract class RecordCache<T> {
+public abstract class RecordCache<K> implements Cache<K, RecordId> {
     private long hitCount;
     private long missCount;
     private long loadCount;
     private long evictionCount;
 
     /**
-     * Add a mapping from {@code key} to {@code value}. Any existing mapping is replaced.
-     */
-    public abstract void put(@Nonnull T key, @Nonnull RecordId value);
-
-    /**
-     * @return  The mapping for {@code key}, or {@code null} if none.
-     */
-    @CheckForNull
-    public abstract RecordId get(@Nonnull T key);
-
-    /**
      * @return number of mappings
      */
     public abstract long size();
 
     public abstract long estimateCurrentWeight();
 
+    @Override
+    public void put(@Nonnull K key, @Nonnull RecordId value, byte cost) {
+        throw new UnsupportedOperationException();
+    }
+
     /**
      * @return  access statistics for this cache
      */
@@ -147,30 +140,30 @@ public abstract class RecordCache<T> {
         }
     }
 
-    private static class Default<T> extends RecordCache<T> {
+    private static class Default<K> extends RecordCache<K> {
 
         @Nonnull
-        private final Map<T, RecordId> records;
+        private final Map<K, RecordId> records;
 
         @Nonnull
-        private final Weigher<T, RecordId> weigher;
+        private final Weigher<K, RecordId> weigher;
 
         private long weight = 0;
 
-        static final <T> Supplier<RecordCache<T>> defaultFactory(final int size, @Nonnull final Weigher<T, RecordId> weigher) {
-            return new Supplier<RecordCache<T>>() {
+        static final <K> Supplier<RecordCache<K>> defaultFactory(final int size, @Nonnull final Weigher<K, RecordId> weigher) {
+            return new Supplier<RecordCache<K>>() {
                 @Override
-                public RecordCache<T> get() {
+                public RecordCache<K> get() {
                     return new Default<>(size, checkNotNull(weigher));
                 }
             };
         }
 
-        Default(final int size, @Nonnull final Weigher<T, RecordId> weigher) {
+        Default(final int size, @Nonnull final Weigher<K, RecordId> weigher) {
             this.weigher = checkNotNull(weigher);
-            records = new LinkedHashMap<T, RecordId>(size * 4 / 3, 0.75f, true) {
+            records = new LinkedHashMap<K, RecordId>(size * 4 / 3, 0.75f, true) {
                 @Override
-                protected boolean removeEldestEntry(Map.Entry<T, RecordId> eldest) {
+                protected boolean removeEldestEntry(Map.Entry<K, RecordId> eldest) {
                     boolean remove = super.size() > size;
                     if (remove) {
                         Default.super.evictionCount++;
@@ -183,14 +176,14 @@ public abstract class RecordCache<T> {
         }
 
         @Override
-        public synchronized void put(@Nonnull T key, @Nonnull RecordId value) {
+        public synchronized void put(@Nonnull K key, @Nonnull RecordId value) {
             super.loadCount++;
             records.put(key, value);
             weight += weigher.weigh(key, value);
         }
 
         @Override
-        public synchronized RecordId get(@Nonnull T key) {
+        public synchronized RecordId get(@Nonnull K key) {
             RecordId value = records.get(key);
             if (value == null) {
                 super.missCount++;

Modified: jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentNodeStoreService.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentNodeStoreService.java?rev=1787947&r1=1787946&r2=1787947&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentNodeStoreService.java (original)
+++ jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentNodeStoreService.java Tue Mar 21 12:11:14 2017
@@ -504,7 +504,8 @@ public class SegmentNodeStoreService {
                 templateCacheStats.getName()
         ));
 
-        CacheStatsMBean stringDeduplicationCacheStats = store.getStringDeduplicationCacheStats();
+        WriterCacheManager cacheManager = builder.getCacheManager();
+        CacheStatsMBean stringDeduplicationCacheStats = cacheManager.getStringCacheStats();
         if (stringDeduplicationCacheStats != null) {
             closeables.add(registrations.registerMBean(
                     CacheStatsMBean.class,
@@ -514,7 +515,7 @@ public class SegmentNodeStoreService {
             ));
         }
 
-        CacheStatsMBean templateDeduplicationCacheStats = store.getTemplateDeduplicationCacheStats();
+        CacheStatsMBean templateDeduplicationCacheStats = cacheManager.getTemplateCacheStats();
         if (templateDeduplicationCacheStats != null) {
             closeables.add(registrations.registerMBean(
                     CacheStatsMBean.class,
@@ -524,7 +525,7 @@ public class SegmentNodeStoreService {
             ));
         }
 
-        CacheStatsMBean nodeDeduplicationCacheStats = store.getNodeDeduplicationCacheStats();
+        CacheStatsMBean nodeDeduplicationCacheStats = cacheManager.getNodeCacheStats();
         if (nodeDeduplicationCacheStats != null) {
             closeables.add(registrations.registerMBean(
                     CacheStatsMBean.class,

Modified: jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentWriter.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentWriter.java?rev=1787947&r1=1787946&r2=1787947&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentWriter.java (original)
+++ jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentWriter.java Tue Mar 21 12:11:14 2017
@@ -66,7 +66,6 @@ import com.google.common.io.Closeables;
 import org.apache.jackrabbit.oak.api.Blob;
 import org.apache.jackrabbit.oak.api.PropertyState;
 import org.apache.jackrabbit.oak.api.Type;
-import org.apache.jackrabbit.oak.api.jmx.CacheStatsMBean;
 import org.apache.jackrabbit.oak.plugins.memory.ModifiedNodeState;
 import org.apache.jackrabbit.oak.segment.WriteOperationHandler.WriteOperation;
 import org.apache.jackrabbit.oak.segment.file.GCNodeWriteMonitor;
@@ -136,45 +135,11 @@ public class SegmentWriter {
         this.writeOperationHandler = checkNotNull(writeOperationHandler);
     }
 
-    /**
-     * Get occupancy information for the node deduplication cache indicating occupancy and
-     * evictions per priority.
-     * @return  occupancy information for the node deduplication cache.
-     */
-    @CheckForNull
-    public String getNodeCacheOccupancyInfo() {
-        return cacheManager.getNodeCacheOccupancyInfo();
-    }
-
     public void flush() throws IOException {
         writeOperationHandler.flush(store);
     }
 
     /**
-     * @return  Statistics for the string deduplication cache or {@code null} if not available.
-     */
-    @CheckForNull
-    public CacheStatsMBean getStringCacheStats() {
-        return cacheManager.getStringCacheStats();
-    }
-
-    /**
-     * @return  Statistics for the template deduplication cache or {@code null} if not available.
-     */
-    @CheckForNull
-    public CacheStatsMBean getTemplateCacheStats() {
-        return cacheManager.getTemplateCacheStats();
-    }
-
-    /**
-     * @return  Statistics for the node deduplication cache or {@code null} if not available.
-     */
-    @CheckForNull
-    public CacheStatsMBean getNodeCacheStats() {
-        return cacheManager.getNodeCacheStats();
-    }
-
-    /**
      * Write a map record.
      * @param base      base map relative to which the {@code changes} are applied ot
      *                  {@code null} for the empty map.
@@ -437,7 +402,7 @@ public class SegmentWriter {
         private SegmentBufferWriter writer;
         private RecordCache<String> stringCache;
         private RecordCache<Template> templateCache;
-        private NodeCache nodeCache;
+        private Cache<String, RecordId> nodeCache;
 
         protected SegmentWriteOperation(@Nonnull Supplier<Boolean> cancel) {
             this.cancel = cancel;

Modified: jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/WriterCacheManager.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/WriterCacheManager.java?rev=1787947&r1=1787946&r2=1787947&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/WriterCacheManager.java (original)
+++ jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/WriterCacheManager.java Tue Mar 21 12:11:14 2017
@@ -105,7 +105,7 @@ public abstract class WriterCacheManager
      * @return  cache for node records of the given {@code generation}.
      */
     @Nonnull
-    public abstract NodeCache getNodeCache(int generation);
+    public abstract Cache<String, RecordId> getNodeCache(int generation);
 
     /**
      * @return  statistics for the string cache or {@code null} if not available.
@@ -175,15 +175,20 @@ public abstract class WriterCacheManager
         }
 
         /**
-         * @return  a {@code NodeCache} cache that is always empty
+         * @return  a {@code Cache} cache that is always empty
          */
         @Nonnull
         @Override
-        public NodeCache getNodeCache(int generation) {
-            return new NodeCache() {
+        public Cache<String, RecordId> getNodeCache(int generation) {
+            return new Cache<String, RecordId>() {
                 @Override
                 public void put(@Nonnull String stableId, @Nonnull RecordId recordId, byte cost) { }
 
+                @Override
+                public void put(@Nonnull String key, @Nonnull RecordId value) {
+                    throw new UnsupportedOperationException();
+                }
+
                 @CheckForNull
                 @Override
                 public RecordId get(@Nonnull String stableId) { return null; }
@@ -194,7 +199,7 @@ public abstract class WriterCacheManager
     /**
      * This implementation of {@link WriterCacheManager} returns
      * {@link RecordCache} instances for the string and template cache
-     * and {@link NodeCache} instance for the node cache.
+     * and {@link Cache} instance for the node cache.
      */
     public static class Default extends WriterCacheManager {
         /**
@@ -261,6 +266,7 @@ public abstract class WriterCacheManager
                 return generations.get(generation).get();
             }
 
+            @Nonnull
             @Override
             public Iterator<T> iterator() {
                 return transform(generations.values().iterator(), new Function<Supplier<T>, T>() {
@@ -293,19 +299,28 @@ public abstract class WriterCacheManager
             return templateCaches.getGeneration(generation);
         }
 
+        private PriorityCache<String, RecordId> nodeCache() {
+            return nodeCache.get();
+        }
+
         @Override
         @Nonnull
-        public NodeCache getNodeCache(final int generation) {
-            return new NodeCache() {
+        public Cache<String, RecordId> getNodeCache(final int generation) {
+            return new Cache<String, RecordId>() {
                 @Override
                 public void put(@Nonnull String stableId, @Nonnull RecordId recordId, byte cost) {
-                    nodeCache.get().put(stableId, recordId, generation, cost);
+                    nodeCache().put(stableId, recordId, generation, cost);
+                }
+
+                @Override
+                public void put(@Nonnull String key, @Nonnull RecordId value) {
+                    throw new UnsupportedOperationException();
                 }
 
                 @CheckForNull
                 @Override
                 public RecordId get(@Nonnull String stableId) {
-                    return nodeCache.get().get(stableId, generation);
+                    return nodeCache().get(stableId, generation);
                 }
             };
         }
@@ -380,28 +395,23 @@ public abstract class WriterCacheManager
                     new Supplier<CacheStats>() {
                         @Override
                         public CacheStats get() {
-                            return nodeCache.get().getStats();
+                            return nodeCache().getStats();
                         }
                     },
                     new Supplier<Long>() {
                         @Override
                         public Long get() {
-                            return nodeCache.get().size();
+                            return nodeCache().size();
                         }
                     },
                     new Supplier<Long>() {
                         @Override
                         public Long get() {
-                            return nodeCache.get().estimateCurrentWeight();
+                            return nodeCache().estimateCurrentWeight();
                         }
                     });
         }
 
-        @Override
-        public String getNodeCacheOccupancyInfo() {
-            return nodeCache.get().toString();
-        }
-
         /**
          * Remove all cache generations matching the passed {@code generations} predicate.
          * @param generations
@@ -409,7 +419,7 @@ public abstract class WriterCacheManager
         protected final void evictCaches(Predicate<Integer> generations) {
             stringCaches.evictGenerations(generations);
             templateCaches.evictGenerations(generations);
-            nodeCache.get().purgeGenerations(generations);
+            nodeCache().purgeGenerations(generations);
         }
     }
 }

Modified: jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/FileStore.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/FileStore.java?rev=1787947&r1=1787946&r2=1787947&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/FileStore.java (original)
+++ jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/FileStore.java Tue Mar 21 12:11:14 2017
@@ -75,7 +75,6 @@ import com.google.common.base.Supplier;
 import com.google.common.base.Suppliers;
 import com.google.common.collect.ImmutableList;
 import com.google.common.io.Closer;
-import org.apache.jackrabbit.oak.api.jmx.CacheStatsMBean;
 import org.apache.jackrabbit.oak.plugins.blob.ReferenceCollector;
 import org.apache.jackrabbit.oak.segment.Compactor;
 import org.apache.jackrabbit.oak.segment.RecordId;
@@ -295,21 +294,6 @@ public class FileStore extends AbstractF
         return revisions.getHead().getSegmentId().getGcGeneration();
     }
 
-    @CheckForNull
-    public CacheStatsMBean getStringDeduplicationCacheStats() {
-        return segmentWriter.getStringCacheStats();
-    }
-
-    @CheckForNull
-    public CacheStatsMBean getTemplateDeduplicationCacheStats() {
-        return segmentWriter.getTemplateCacheStats();
-    }
-
-    @CheckForNull
-    public CacheStatsMBean getNodeDeduplicationCacheStats() {
-        return segmentWriter.getNodeCacheStats();
-    }
-
     /**
      * @return  a runnable for running garbage collection
      */
@@ -757,7 +741,6 @@ public class FileStore extends AbstractF
     
                 if (sufficientEstimatedGain) {
                     if (!gcOptions.isPaused()) {
-                        log(segmentWriter.getNodeCacheOccupancyInfo());
                         int gen = compact();
                         if (gen > 0) {
                             fileReaper.add(cleanupOldGenerations(gen));
@@ -766,7 +749,6 @@ public class FileStore extends AbstractF
                             gcListener.info("TarMK GC #{}: cleaning up after failed compaction", GC_COUNT);
                             fileReaper.add(cleanupGeneration(-gen));
                         }
-                        log(segmentWriter.getNodeCacheOccupancyInfo());
                     } else {
                         gcListener.skipped("TarMK GC #{}: compaction paused", GC_COUNT);
                     }

Modified: jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/FileStoreBuilder.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/FileStoreBuilder.java?rev=1787947&r1=1787946&r2=1787947&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/FileStoreBuilder.java (original)
+++ jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/FileStoreBuilder.java Tue Mar 21 12:11:14 2017
@@ -419,8 +419,16 @@ public class FileStoreBuilder {
         return snfeListener;
     }
 
+    /**
+     * @return  creates or returns the {@code WriterCacheManager} this builder passes or
+     *          passed to the store on {@link #build()}.
+     *
+     * @see #withNodeDeduplicationCacheSize(int)
+     * @see #withStringDeduplicationCacheSize(int)
+     * @see #withTemplateDeduplicationCacheSize(int)
+     */
     @Nonnull
-    WriterCacheManager getCacheManager() {
+    public WriterCacheManager getCacheManager() {
         if (cacheManager == null) {
             cacheManager = new EvictingWriteCacheManager(
                     stringDeduplicationCacheSize, templateDeduplicationCacheSize, nodeDeduplicationCacheSize);

Modified: jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/NodeRecordTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/NodeRecordTest.java?rev=1787947&r1=1787946&r2=1787947&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/NodeRecordTest.java (original)
+++ jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/NodeRecordTest.java Tue Mar 21 12:11:14 2017
@@ -162,7 +162,7 @@ public class NodeRecordTest {
         }
     }
 
-    private WriterCacheManager nodesOnlyCache() {
+    private static WriterCacheManager nodesOnlyCache() {
         return new WriterCacheManager() {
 
             WriterCacheManager defaultCache = new WriterCacheManager.Default();
@@ -181,7 +181,7 @@ public class NodeRecordTest {
 
             @Nonnull
             @Override
-            public NodeCache getNodeCache(int generation) {
+            public Cache<String, RecordId> getNodeCache(int generation) {
                 return defaultCache.getNodeCache(generation);
             }
         };

Modified: jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/SegmentCompactionIT.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/SegmentCompactionIT.java?rev=1787947&r1=1787946&r2=1787947&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/SegmentCompactionIT.java (original)
+++ jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/SegmentCompactionIT.java Tue Mar 21 12:11:14 2017
@@ -83,6 +83,7 @@ import org.apache.jackrabbit.oak.segment
 import org.apache.jackrabbit.oak.segment.compaction.SegmentRevisionGC;
 import org.apache.jackrabbit.oak.segment.compaction.SegmentRevisionGCMBean;
 import org.apache.jackrabbit.oak.segment.file.FileStore;
+import org.apache.jackrabbit.oak.segment.file.FileStoreBuilder;
 import org.apache.jackrabbit.oak.segment.file.FileStoreGCMonitor;
 import org.apache.jackrabbit.oak.spi.commit.CommitHook;
 import org.apache.jackrabbit.oak.spi.commit.CommitInfo;
@@ -227,13 +228,15 @@ public class SegmentCompactionIT {
         SegmentGCOptions gcOptions = defaultGCOptions()
                 .setEstimationDisabled(true)
                 .setForceTimeout(3600);
-        fileStore = fileStoreBuilder(folder.getRoot())
+        FileStoreBuilder builder = fileStoreBuilder(folder.getRoot());
+        fileStore = builder
                 .withMemoryMapping(true)
                 .withGCMonitor(gcMonitor)
                 .withGCOptions(gcOptions)
                 .withStatisticsProvider(new MetricStatisticsProvider(mBeanServer, executor))
                 .build();
         nodeStore = SegmentNodeStoreBuilders.builder(fileStore).build();
+        WriterCacheManager cacheManager = builder.getCacheManager();
         Runnable cancelGC = new Runnable() {
             @Override
             public void run() {
@@ -263,15 +266,15 @@ public class SegmentCompactionIT {
         CacheStatsMBean templateCacheStats = fileStore.getTemplateCacheStats();
         registrations.add(registerMBean(templateCacheStats,
                 new ObjectName("IT:TYPE=" + templateCacheStats.getName())));
-        CacheStatsMBean stringDeduplicationCacheStats = fileStore.getStringDeduplicationCacheStats();
+        CacheStatsMBean stringDeduplicationCacheStats = cacheManager.getStringCacheStats();
         assertNotNull(stringDeduplicationCacheStats);
         registrations.add(registerMBean(stringDeduplicationCacheStats,
                 new ObjectName("IT:TYPE=" + stringDeduplicationCacheStats.getName())));
-        CacheStatsMBean templateDeduplicationCacheStats = fileStore.getTemplateDeduplicationCacheStats();
+        CacheStatsMBean templateDeduplicationCacheStats = cacheManager.getTemplateCacheStats();
         assertNotNull(templateDeduplicationCacheStats);
         registrations.add(registerMBean(templateDeduplicationCacheStats,
                 new ObjectName("IT:TYPE=" + templateDeduplicationCacheStats.getName())));
-        CacheStatsMBean nodeDeduplicationCacheStats = fileStore.getNodeDeduplicationCacheStats();
+        CacheStatsMBean nodeDeduplicationCacheStats = cacheManager.getNodeCacheStats();
         assertNotNull(nodeDeduplicationCacheStats);
         registrations.add(registerMBean(nodeDeduplicationCacheStats,
                 new ObjectName("IT:TYPE=" + nodeDeduplicationCacheStats.getName())));