Commit accident: http://svn.apache.org/r1689662 and http://svn.apache.org/r1689663. Reverted already. Sorry for the noise.

Michael

On 7.7.15 3:26 , [email protected] wrote:
Author: mduerig
Date: Tue Jul  7 13:26:15 2015
New Revision: 1689663

URL: http://svn.apache.org/r1689663
Log:
segment cache

Modified:
     
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentTracker.java

Modified: 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentTracker.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentTracker.java?rev=1689663&r1=1689662&r2=1689663&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentTracker.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentTracker.java
 Tue Jul  7 13:26:15 2015
@@ -16,18 +16,17 @@
   */
  package org.apache.jackrabbit.oak.plugins.segment;

-import static com.google.common.collect.Lists.newLinkedList;
  import static com.google.common.collect.Queues.newArrayDeque;
  import static com.google.common.collect.Sets.newHashSet;

  import java.security.SecureRandom;
-import java.util.LinkedList;
  import java.util.Queue;
  import java.util.Set;
  import java.util.concurrent.atomic.AtomicReference;

  import javax.annotation.Nonnull;

+import org.apache.jackrabbit.oak.cache.CacheLIRS;
  import org.apache.jackrabbit.oak.plugins.blob.ReferenceCollector;
  import 
org.apache.jackrabbit.oak.plugins.segment.compaction.CompactionStrategy;
  import org.slf4j.Logger;
@@ -88,12 +87,12 @@ public class SegmentTracker {
       */
      private final SegmentIdTable[] tables = new SegmentIdTable[32];

-    private final LinkedList<Segment> segments = newLinkedList();
-
      private long currentSize;

      private final StringCache stringCache;

+    private final CacheLIRS<SegmentId, Segment> segmentCache;
+
      public SegmentTracker(SegmentStore store, int cacheSizeMB,
              SegmentVersion version) {
          for (int i = 0; i < tables.length; i++) {
@@ -106,6 +105,10 @@ public class SegmentTracker {
          this.compactionMap = new AtomicReference<CompactionMap>(
                  CompactionMap.EMPTY);
          stringCache = new StringCache((int) Math.min(Integer.MAX_VALUE, 
cacheSize));
+        segmentCache = new CacheLIRS.Builder()
+            .maximumSize((int) Math.min(Integer.MAX_VALUE, cacheSize))
+            .averageWeight(Segment.MAX_SEGMENT_SIZE/2)
+            .build();
      }

      public SegmentTracker(SegmentStore store, SegmentVersion version) {
@@ -128,7 +131,7 @@ public class SegmentTracker {
       * Clear the segment cache
       */
      public synchronized void clearCache() {
-        segments.clear();
+        segmentCache.invalidateAll();
          stringCache.clear();
          currentSize = 0;
      }
@@ -154,34 +157,9 @@ public class SegmentTracker {
          // done before synchronization to allow concurrent segment access
          // while we update the cache below
          id.setSegment(segment);
-
-        synchronized (this) {
-            long size = segment.getCacheSize();
-
-            segments.addFirst(segment);
-            currentSize += size;
-
-            log.debug("Added segment {} to tracker cache ({} bytes)",
-                    id, size);
-
-            // TODO possibly this cache could be improved
-            while (currentSize > cacheSize && segments.size() > 1) {
-                Segment last = segments.removeLast();
-                SegmentId lastId = last.getSegmentId();
-                if (last.accessed()) {
-                    segments.addFirst(last);
-                    log.debug("Segment {} was recently used, keeping in cache",
-                            lastId);
-                } else {
-                    long lastSize = last.getCacheSize();
-
-                    lastId.setSegment(null);
-                    currentSize -= lastSize;
-
-                    log.debug("Removed segment {} from tracker cache ({} 
bytes)",
-                            lastId, lastSize);
-                }
-            }
+        Segment previous = segmentCache.put(id, segment, segment.size());
+        if (previous != null) {
+            previous.getSegmentId().setSegment(null);
          }
      }



Reply via email to