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/07 15:26:15 UTC

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

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



Re: svn commit: r1689663 - /jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentTracker.java

Posted by Michael Dürig <md...@apache.org>.
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 , mduerig@apache.org 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);
>           }
>       }
>
>
>