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