You are viewing a plain text version of this content. The canonical link for it is here.
Posted to oak-commits@jackrabbit.apache.org by al...@apache.org on 2014/11/09 12:20:27 UTC
svn commit: r1637655 - in /jackrabbit/oak/branches/1.0: ./
oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/Compactor.java
oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentBlob.java
Author: alexparvulescu
Date: Sun Nov 9 11:20:27 2014
New Revision: 1637655
URL: http://svn.apache.org/r1637655
Log:
OAK-2140 Segment Compactor will not compact binaries > 16k
- merged rev 1637651
Modified:
jackrabbit/oak/branches/1.0/ (props changed)
jackrabbit/oak/branches/1.0/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/Compactor.java
jackrabbit/oak/branches/1.0/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentBlob.java
Propchange: jackrabbit/oak/branches/1.0/
------------------------------------------------------------------------------
Merged /jackrabbit/oak/trunk:r1637651
Modified: jackrabbit/oak/branches/1.0/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/Compactor.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.0/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/Compactor.java?rev=1637655&r1=1637654&r2=1637655&view=diff
==============================================================================
--- jackrabbit/oak/branches/1.0/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/Compactor.java (original)
+++ jackrabbit/oak/branches/1.0/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/Compactor.java Sun Nov 9 11:20:27 2014
@@ -75,8 +75,19 @@ public class Compactor {
*/
private final Map<String, List<RecordId>> binaries = newHashMap();
+ /**
+ * If the compactor should copy large binaries as streams or just copy the
+ * refs
+ */
+ private final boolean cloneBinaries;
+
public Compactor(SegmentWriter writer) {
+ this(writer, false);
+ }
+
+ public Compactor(SegmentWriter writer, boolean cloneBinaries) {
this.writer = writer;
+ this.cloneBinaries = cloneBinaries;
}
public SegmentNodeState compact(NodeState before, NodeState after) {
@@ -212,7 +223,7 @@ public class Compactor {
try {
// if the blob is inlined or external, just clone it
if (sb.isExternal() || sb.length() < Segment.MEDIUM_LIMIT) {
- return sb.clone(writer);
+ return sb.clone(writer, cloneBinaries);
}
// else check if we've already cloned this specific record
@@ -235,7 +246,7 @@ public class Compactor {
}
// if not, clone the blob and keep track of the result
- sb = sb.clone(writer);
+ sb = sb.clone(writer, cloneBinaries);
map.put(id, sb.getRecordId());
if (ids == null) {
ids = newArrayList();
Modified: jackrabbit/oak/branches/1.0/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentBlob.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.0/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentBlob.java?rev=1637655&r1=1637654&r2=1637655&view=diff
==============================================================================
--- jackrabbit/oak/branches/1.0/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentBlob.java (original)
+++ jackrabbit/oak/branches/1.0/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentBlob.java Sun Nov 9 11:20:27 2014
@@ -159,7 +159,7 @@ public class SegmentBlob extends Record
}
}
- public SegmentBlob clone(SegmentWriter writer) throws IOException {
+ public SegmentBlob clone(SegmentWriter writer, boolean cloneLargeBinaries) throws IOException {
Segment segment = getSegment();
int offset = getOffset();
byte head = segment.readByte(offset);
@@ -171,11 +171,18 @@ public class SegmentBlob extends Record
return writer.writeStream(new BufferedInputStream(getNewStream()));
} else if ((head & 0xe0) == 0xc0) {
// 110x xxxx: long value
- long length = (segment.readLong(offset) & 0x1fffffffffffffffL) + MEDIUM_LIMIT;
- int listSize = (int) ((length + BLOCK_SIZE - 1) / BLOCK_SIZE);
- ListRecord list = new ListRecord(
- segment.readRecordId(offset + 8), listSize);
- return writer.writeLargeBlob(length, list.getEntries());
+ if (cloneLargeBinaries) {
+ return writer.writeStream(new BufferedInputStream(
+ getNewStream()));
+ } else {
+ // this was the previous (default) behavior
+ long length = (segment.readLong(offset) & 0x1fffffffffffffffL)
+ + MEDIUM_LIMIT;
+ int listSize = (int) ((length + BLOCK_SIZE - 1) / BLOCK_SIZE);
+ ListRecord list = new ListRecord(
+ segment.readRecordId(offset + 8), listSize);
+ return writer.writeLargeBlob(length, list.getEntries());
+ }
} else if ((head & 0xf0) == 0xe0) {
// 1110 xxxx: external value
return writer.writeExternalBlob(getBlobId());