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:29:07 UTC
svn commit: r1689668 - in
/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment:
Segment.java SegmentTracker.java StringCache.java file/FileStore.java
Author: mduerig
Date: Tue Jul 7 13:29:07 2015
New Revision: 1689668
URL: http://svn.apache.org/r1689668
Log:
revert accidental commit (string cache)
Removed:
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/StringCache.java
Modified:
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/Segment.java
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentTracker.java
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/file/FileStore.java
Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/Segment.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/Segment.java?rev=1689668&r1=1689667&r2=1689668&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/Segment.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/Segment.java Tue Jul 7 13:29:07 2015
@@ -36,10 +36,7 @@ import java.util.Arrays;
import java.util.List;
import java.util.concurrent.ConcurrentMap;
-import javax.annotation.Nullable;
-
import com.google.common.base.Charsets;
-import com.google.common.base.Function;
import org.apache.jackrabbit.oak.api.PropertyState;
import org.apache.jackrabbit.oak.api.Type;
import org.apache.jackrabbit.oak.plugins.blob.ReferenceCollector;
@@ -124,12 +121,18 @@ public class Segment {
private final SegmentId[] refids;
/**
+ * String records read from segment. Used to avoid duplicate
+ * copies and repeated parsing of the same strings.
+ */
+ private final ConcurrentMap<Integer, String> strings = newConcurrentMap();
+
+ /**
* Template records read from segment. Used to avoid duplicate
* copies and repeated parsing of the same templates.
*/
private final ConcurrentMap<Integer, Template> templates = newConcurrentMap();
- private volatile long accessed;
+ private volatile long accessed = 0;
/**
* Decode a 4 byte aligned segment offset.
@@ -364,43 +367,44 @@ public class Segment {
}
private String readString(int offset) {
- return tracker.getStringCache().getString(this, offset, loadString);
+ String string = strings.get(offset);
+ if (string == null) {
+ string = loadString(offset);
+ strings.putIfAbsent(offset, string); // only keep the first copy
+ }
+ return string;
}
- private final Function<Integer, String> loadString = new Function<Integer, String>() {
- @Nullable
- @Override
- public String apply(Integer offset) {
- int pos = pos(offset, 1);
- long length = internalReadLength(pos);
- if (length < SMALL_LIMIT) {
- byte[] bytes = new byte[(int) length];
- ByteBuffer buffer = data.duplicate();
- buffer.position(pos + 1);
- buffer.get(bytes);
- return new String(bytes, Charsets.UTF_8);
- } else if (length < MEDIUM_LIMIT) {
- byte[] bytes = new byte[(int) length];
- ByteBuffer buffer = data.duplicate();
- buffer.position(pos + 2);
- buffer.get(bytes);
- return new String(bytes, Charsets.UTF_8);
- } else if (length < Integer.MAX_VALUE) {
- int size = (int) ((length + BLOCK_SIZE - 1) / BLOCK_SIZE);
- ListRecord list =
- new ListRecord(internalReadRecordId(pos + 8), size);
- SegmentStream stream = new SegmentStream(
- new RecordId(id, offset), list, length);
- try {
- return stream.getString();
- } finally {
- stream.close();
- }
- } else {
- throw new IllegalStateException("String is too long: " + length);
+ private String loadString(int offset) {
+ int pos = pos(offset, 1);
+ long length = internalReadLength(pos);
+ if (length < SMALL_LIMIT) {
+ byte[] bytes = new byte[(int) length];
+ ByteBuffer buffer = data.duplicate();
+ buffer.position(pos + 1);
+ buffer.get(bytes);
+ return new String(bytes, Charsets.UTF_8);
+ } else if (length < MEDIUM_LIMIT) {
+ byte[] bytes = new byte[(int) length];
+ ByteBuffer buffer = data.duplicate();
+ buffer.position(pos + 2);
+ buffer.get(bytes);
+ return new String(bytes, Charsets.UTF_8);
+ } else if (length < Integer.MAX_VALUE) {
+ int size = (int) ((length + BLOCK_SIZE - 1) / BLOCK_SIZE);
+ ListRecord list =
+ new ListRecord(internalReadRecordId(pos + 8), size);
+ SegmentStream stream = new SegmentStream(
+ new RecordId(id, offset), list, length);
+ try {
+ return stream.getString();
+ } finally {
+ stream.close();
}
+ } else {
+ throw new IllegalStateException("String is too long: " + length);
}
- };
+ }
MapRecord readMap(RecordId id) {
return new MapRecord(id);
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=1689668&r1=1689667&r2=1689668&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:07 2015
@@ -91,8 +91,6 @@ public class SegmentTracker {
private final LinkedList<Segment> segments = newLinkedList();
private long currentSize;
-
- private final StringCache stringCache;
public SegmentTracker(SegmentStore store, int cacheSizeMB,
SegmentVersion version) {
@@ -105,7 +103,6 @@ public class SegmentTracker {
this.cacheSize = cacheSizeMB * MB;
this.compactionMap = new AtomicReference<CompactionMap>(
CompactionMap.EMPTY);
- stringCache = new StringCache((int) Math.min(Integer.MAX_VALUE, cacheSize));
}
public SegmentTracker(SegmentStore store, SegmentVersion version) {
@@ -129,13 +126,8 @@ public class SegmentTracker {
*/
public synchronized void clearCache() {
segments.clear();
- stringCache.clear();
currentSize = 0;
}
-
- public StringCache getStringCache() {
- return stringCache;
- }
Segment getSegment(SegmentId id) {
try {
Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/file/FileStore.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/file/FileStore.java?rev=1689668&r1=1689667&r2=1689668&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/file/FileStore.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/file/FileStore.java Tue Jul 7 13:29:07 2015
@@ -647,7 +647,7 @@ public class FileStore implements Segmen
humanReadableByteCount(initialSize));
newWriter();
-// tracker.clearCache();
+ tracker.clearCache();
// Suggest to the JVM that now would be a good time
// to clear stale weak references in the SegmentTracker