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


Reply via email to