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