Author: mduerig
Date: Tue Jul 7 13:29:01 2015
New Revision: 1689667
URL: http://svn.apache.org/r1689667
Log:
revert accidental commit (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=1689667&r1=1689666&r2=1689667&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:29:01 2015
@@ -16,17 +16,18 @@
*/
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;
@@ -87,12 +88,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++) {
@@ -105,10 +106,6 @@ 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) {
@@ -131,7 +128,7 @@ public class SegmentTracker {
* Clear the segment cache
*/
public synchronized void clearCache() {
- segmentCache.invalidateAll();
+ segments.clear();
stringCache.clear();
currentSize = 0;
}
@@ -157,9 +154,34 @@ public class SegmentTracker {
// done before synchronization to allow concurrent segment access
// while we update the cache below
id.setSegment(segment);
- Segment previous = segmentCache.put(id, segment, segment.size());
- if (previous != null) {
- previous.getSegmentId().setSegment(null);
+
+ 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);
+ }
+ }
}
}