Author: mduerig
Date: Wed Nov 25 16:28:49 2015
New Revision: 1716469

URL: http://svn.apache.org/viewvc?rev=1716469&view=rev
Log:
OAK-1828: Improved SegmentWriter
Factor out duplicate align methods

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/SegmentBuilder.java
    
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentWriter.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=1716469&r1=1716468&r2=1716469&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
 Wed Nov 25 16:28:49 2015
@@ -182,6 +182,18 @@ public class Segment {
         return (short) (offset >> RECORD_ALIGN_BITS);
     }
 
+    /**
+     * Align an {@code address} on the given {@code boundary}
+     *
+     * @param address     address to align
+     * @param boundary    boundary to align to
+     * @return  {@code n = address + a} such that {@code n % boundary == 0} and
+     *          {@code 0 <= a < boundary}.
+     */
+    public static int align(int address, int boundary) {
+        return (address + boundary - 1) & ~(boundary - 1);
+    }
+
     public Segment(SegmentTracker tracker, SegmentId id, ByteBuffer data) {
         this(tracker, id, data, V_11);
     }

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=1716469&r1=1716468&r2=1716469&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:49 2015
@@ -32,6 +32,7 @@ import static org.apache.jackrabbit.oak.
 import static 
org.apache.jackrabbit.oak.plugins.segment.Segment.MAX_SEGMENT_SIZE;
 import static 
org.apache.jackrabbit.oak.plugins.segment.Segment.RECORD_ID_BYTES;
 import static 
org.apache.jackrabbit.oak.plugins.segment.Segment.SEGMENT_REFERENCE_LIMIT;
+import static org.apache.jackrabbit.oak.plugins.segment.Segment.align;
 
 import java.nio.ByteBuffer;
 import java.util.Collection;
@@ -187,7 +188,7 @@ class SegmentBuilder {
 
         int offset = listId.getOffset();
         checkState(0 <= offset && offset < MAX_SEGMENT_SIZE);
-        checkState(offset == align(offset));
+        checkState(offset == align(offset, 1 << Segment.RECORD_ALIGN_BITS));
 
         buffer[position++] = (byte) getSegmentRef(listId.getSegmentId());
         buffer[position++] = (byte) (offset >> (8 + 
Segment.RECORD_ALIGN_BITS));
@@ -326,7 +327,7 @@ class SegmentBuilder {
         checkNotNull(ids);
 
         int idCount = ids.size();
-        int recordSize = align(size + idCount * RECORD_ID_BYTES);
+        int recordSize = align(size + idCount * RECORD_ID_BYTES, 1 << 
Segment.RECORD_ALIGN_BITS);
 
         // First compute the header and segment sizes based on the assumption
         // that *all* identifiers stored in this record point to previously
@@ -389,11 +390,4 @@ class SegmentBuilder {
         return id;
     }
 
-    private static int align(int value) {
-        return align(value, 1 << Segment.RECORD_ALIGN_BITS);
-    }
-
-    private static int align(int value, int boundary) {
-        return (value + boundary - 1) & ~(boundary - 1);
-    }
 }

Modified: 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentWriter.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentWriter.java?rev=1716469&r1=1716468&r2=1716469&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentWriter.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentWriter.java
 Wed Nov 25 16:28:49 2015
@@ -45,6 +45,7 @@ import static org.apache.jackrabbit.oak.
 import static org.apache.jackrabbit.oak.plugins.segment.RecordType.TEMPLATE;
 import static org.apache.jackrabbit.oak.plugins.segment.RecordType.VALUE;
 import static 
org.apache.jackrabbit.oak.plugins.segment.Segment.MAX_SEGMENT_SIZE;
+import static org.apache.jackrabbit.oak.plugins.segment.Segment.align;
 import static org.apache.jackrabbit.oak.plugins.segment.Segment.readString;
 import static org.apache.jackrabbit.oak.plugins.segment.SegmentVersion.V_11;
 
@@ -653,7 +654,7 @@ public class SegmentWriter {
         // Write the data to bulk segments and collect the list of block ids
         while (n != 0) {
             SegmentId bulkId = store.getTracker().newBulkSegmentId();
-            int len = align(n);
+            int len = align(n, 1 << Segment.RECORD_ALIGN_BITS);
             LOG.debug("Writing bulk segment {} ({} bytes)", bulkId, n);
             store.writeSegment(bulkId, data, 0, len);
 
@@ -1048,12 +1049,4 @@ public class SegmentWriter {
         }
     }
 
-    private static int align(int value) {
-        return align(value, 1 << Segment.RECORD_ALIGN_BITS);
-    }
-
-    private static int align(int value, int boundary) {
-        return (value + boundary - 1) & ~(boundary - 1);
-    }
-
 }


Reply via email to