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