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 ju...@apache.org on 2014/05/29 20:56:52 UTC

svn commit: r1598369 - /jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/Compactor.java

Author: jukka
Date: Thu May 29 18:56:52 2014
New Revision: 1598369

URL: http://svn.apache.org/r1598369
Log:
OAK-1804: TarMK compaction

Also track blob records that have already been compacted

Modified:
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/Compactor.java

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/Compactor.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/Compactor.java?rev=1598369&r1=1598368&r2=1598369&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/Compactor.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/Compactor.java Thu May 29 18:56:52 2014
@@ -179,10 +179,23 @@ public class Compactor {
 
     private Blob compact(Blob blob) {
         if (blob instanceof SegmentBlob) {
+            SegmentBlob sb = (SegmentBlob) blob;
+            RecordId id = sb.getRecordId();
+
+            // first check if we've already cloned this blob
+            RecordId compactedId = compacted.get(id);
+            if (compactedId != null) {
+                return new SegmentBlob(compactedId);
+            }
+
+            // if not, clone it and keep track of the resulting id
             try {
-                return ((SegmentBlob) blob).clone(writer);
+                sb = sb.clone(writer);
+                compacted.put(id, sb.getRecordId());
+                return sb;
             } catch (IOException e) {
                 Log.warn("Failed to clone a binary value", e);
+                // fall through
             }
         }
         return blob;