Author: mduerig
Date: Wed Nov 25 16:28:43 2015
New Revision: 1716468
URL: http://svn.apache.org/viewvc?rev=1716468&view=rev
Log:
OAK-1828: Improved SegmentWriter
Simplify flushing of segments
Modified:
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentBuilder.java
Modified:
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentBuilder.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentBuilder.java?rev=1716468&r1=1716467&r2=1716468&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentBuilder.java
(original)
+++
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentBuilder.java
Wed Nov 25 16:28:43 2015
@@ -228,17 +228,6 @@ class SegmentBuilder {
* enough space for a record. It can also be called explicitly.
*/
public void flush() {
- // Id of the segment to be written in the file store. If the segment id
- // is not null, a segment will be written outside of the synchronized
block.
- SegmentId segmentId = null;
-
- // Buffer containing segment data, and offset and length to locate the
- // segment data into the buffer. These variable will be initialized in
- // the synchronized block.
- byte[] segmentBuffer = null;
- int segmentOffset = 0;
- int segmentLength = 0;
-
if (length > 0) {
int refcount = segment.getRefCount();
@@ -285,37 +274,33 @@ class SegmentBuilder {
buffer[pos++] = (byte) (offset >> Segment.RECORD_ALIGN_BITS);
}
- segmentId = segment.getSegmentId();
- segmentBuffer = buffer;
- segmentOffset = buffer.length - length;
- segmentLength = length;
-
- buffer = createNewBuffer(version);
- roots.clear();
- blobrefs.clear();
- length = 0;
- position = buffer.length;
- newSegment(wid);
- }
+ SegmentId segmentId = segment.getSegmentId();
+ int segmentOffset = buffer.length - length;
- if (segmentId != null) {
- LOG.debug("Writing data segment {} ({} bytes)", segmentId,
segmentLength);
- store.writeSegment(segmentId, segmentBuffer, segmentOffset,
segmentLength);
+ LOG.debug("Writing data segment {} ({} bytes)", segmentId, length);
+ store.writeSegment(segmentId, buffer, segmentOffset, length);
// Keep this segment in memory as it's likely to be accessed soon
ByteBuffer data;
if (segmentOffset > 4096) {
- data = ByteBuffer.allocate(segmentLength);
- data.put(segmentBuffer, segmentOffset, segmentLength);
+ data = ByteBuffer.allocate(length);
+ data.put(buffer, segmentOffset, length);
data.rewind();
} else {
- data = ByteBuffer.wrap(segmentBuffer, segmentOffset,
segmentLength);
+ data = ByteBuffer.wrap(buffer, segmentOffset, length);
}
// It is important to put the segment into the cache only *after*
it has been
// written to the store since as soon as it is in the cache it
becomes eligible
// for eviction, which might lead to SNFEs when it is not yet in
the store at that point.
tracker.setSegment(segmentId, new Segment(tracker, segmentId,
data));
+
+ buffer = createNewBuffer(version);
+ roots.clear();
+ blobrefs.clear();
+ length = 0;
+ position = buffer.length;
+ newSegment(wid);
}
}