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