Author: jukka
Date: Mon Mar 17 14:11:19 2014
New Revision: 1578387

URL: http://svn.apache.org/r1578387
Log:
OAK-1545: NPE in SegmentTracker

Use separate lists for data and bulk segments as a simple form of 
scan-resistance

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=1578387&r1=1578386&r2=1578387&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
 Mon Mar 17 14:11:19 2014
@@ -65,7 +65,9 @@ public class SegmentTracker {
      */
     private final SegmentIdTable[] tables = new SegmentIdTable[32];
 
-    private final LinkedList<Segment> segments = newLinkedList();
+    private final LinkedList<Segment> dataSegments = newLinkedList();
+
+    private final LinkedList<Segment> bulkSegments = newLinkedList();
 
     private long currentSize = 0;
 
@@ -95,11 +97,17 @@ public class SegmentTracker {
         Segment segment = store.readSegment(id);
         id.setSegment(segment);
 
+        LinkedList<Segment> segments = dataSegments;
+        if (id.isBulkSegmentId()) {
+            segments = bulkSegments;
+        }
+
         synchronized (this) {
+            // TODO: use a scan-resistant cache
             segments.addFirst(segment);
             currentSize += segment.getCacheSize();
-            while (currentSize > cacheSize && segments.size() > 1) {
-                Segment remove = segments.removeLast();
+            while (currentSize > cacheSize / 2 && segments.size() > 1) {
+                Segment remove = dataSegments.removeLast();
                 remove.getSegmentId().setSegment(null);
                 currentSize -= remove.getCacheSize();
             }


Reply via email to