Index: oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentWriter.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentWriter.java (date 1441109076000) +++ oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentWriter.java (date 1441124689000) @@ -224,10 +224,7 @@ } SegmentId id = segment.getSegmentId(); - log.debug("Writing data segment {} ({} bytes)", id, length); - store.writeSegment(id, buffer, buffer.length - length, length); - // Keep this segment in memory as it's likely to be accessed soon ByteBuffer data; if (buffer.length - length > 4096) { data = ByteBuffer.allocate(length); @@ -236,6 +233,11 @@ } else { data = ByteBuffer.wrap(buffer, buffer.length - length, length); } + + log.debug("Writing data segment {} ({} bytes)", id, length); + store.writeSegment(id, data.array(), data.position(), length); + + // Keep this segment in memory as it's likely to be accessed soon tracker.setSegment(id, new Segment(tracker, id, data)); buffer = createNewBuffer(version); Index: oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/file/FileStore.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/file/FileStore.java (date 1441109076000) +++ oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/file/FileStore.java (date 1441124689000) @@ -56,7 +56,6 @@ import com.google.common.base.Stopwatch; import com.google.common.collect.Maps; - import org.apache.jackrabbit.oak.api.Blob; import org.apache.jackrabbit.oak.plugins.blob.BlobStoreBlob; import org.apache.jackrabbit.oak.plugins.segment.CompactionMap; @@ -960,6 +959,11 @@ } } + Segment segment = cache.get(new UUID(msb, lsb)); + if (segment != null) { + return segment; + } + if (writer != null) { synchronized (this) { try { @@ -996,6 +1000,8 @@ throw new SegmentNotFoundException(id); } + final Map cache = Maps.newConcurrentMap(); + @Override public synchronized void writeSegment( SegmentId id, byte[] data, int offset, int length) { @@ -1004,6 +1010,8 @@ id.getMostSignificantBits(), id.getLeastSignificantBits(), data, offset, length); + ByteBuffer bb = ByteBuffer.wrap(data, offset, length); + cache.put(id.asUUID(), new Segment(id.getTracker(), id, bb)); if (size >= maxFileSize) { newWriter(); } @@ -1015,6 +1023,7 @@ private void newWriter() throws IOException { if (writer.isDirty()) { writer.close(); + cache.clear(); List list = newArrayListWithCapacity(1 + readers.size());